您的位置:首页 > 编程语言 > Qt开发

qt读写xml文件

2018-03-02 09:56 483 查看
http://blog.csdn.net/xiexingshishu/article/details/45177023
1、DOM方式写xml文件,以QDomText方式写,代码如下
[cpp] view plain copyQFile file("d:/test.txt");  
file.open(QIODevice::WriteOnly);  
  
QDomDocument doc;  
QDomProcessingInstruction instruction;  
  
instruction = doc.createProcessingInstruction("xml", "version = \'1.0\'");  
doc.appendChild(instruction);  
QDomElement root = doc.createElement("html");  
doc.appendChild(root);  
  
QDomElement data;  
QDomElement tmp;  
QDomText text;  
  
data = doc.createElement("title");  
text = doc.createTextNode(QStringLiteral("多看"));  
data.appendChild(text);  
root.appendChild(data);  
  
tmp = doc.createElement("book");  
text = doc.createTextNode(QStringLiteral("小说"));  
tmp.appendChild(text);  
root.appendChild(tmp);  
  
  
QTextStream out(&file);  
doc.save(out, 4);  
  
file.close();  
读代码为[cpp] view plain copyQFile file("d:/test.txt");  
file.open(QIODevice::ReadOnly);  
QDomDocument doc;  
doc.setContent(&file);  
QDomElement root = doc.documentElement();  
for (QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling()) {  
    QDomElement element = node.toElement();  
    QString tagName = element.tagName();  
    if (tagName == "title") {  
        qDebug() << element.text();  
    } else if (tagName == "book") {  
        qDebug() << element.text();  
    }  
}  
file.close();  

以QDomAttr方式写:[cpp] view plain copyQFile file("d:/test.txt");  
file.open(QIODevice::WriteOnly);  
  
QDomDocument doc;  
QDomProcessingInstruction instruction;  
  
instruction = doc.createProcessingInstruction("xml", "version = \'1.0\'");  
doc.appendChild(instruction);  
QDomElement root = doc.createElement("html");  
doc.appendChild(root);  
  
QDomAttr data;  
QDomAttr tmp;  
  
data = doc.createAttribute("title");  
data.setValue(QStringLiteral("多看"));  
root.setAttributeNode(data);  
  
tmp = doc.createAttribute("book");  
tmp.setValue(QStringLiteral("小说"));  
root.setAttributeNode(tmp);  
  
  
QTextStream out(&file);  
doc.save(out, 4);  
  
file.close();  
读QDomAttr[cpp] view plain copyQFile file("d:/test.txt");  
file.open(QIODevice::ReadOnly);  
QDomDocument doc;  
doc.setContent(&file);  
QDomElement root = doc.documentElement();  
  
qDebug() << root.attribute("title");  
qDebug() << root.attribute("book");  
  
file.close();  

2、用QXmlStreamReader和QXmlStreamWriter
写文件,设置相关联的文件,用writeStartDocument来开始,用writeEndDocument来结束用writeStartElement和writeEndElement来表示元素的开始和结束,需要成对使用<name>a</name>形式,用writeTextElement<name a=""/>形式,用writeAttribute[cpp] view plain copyQFile file("test.txt"); file.open(QIODevice::writeOnly);  
QXmlStreamWriter xmlstreamwriter(&file);  
xmlstreamwriter.setAutoFormatting(true);  
xmlstreamwriter.writeStartDocument();  
xmlstreamwriter.writeStartElement("xml");  
xmlstreamwriter.writeStartElement("round");  
xmlstreamwriter.writeAttribute("id", mRoundId);  
xmlstreamwriter.writeAttribute("tableid", mTableId);  
//player1  
xmlstreamwriter.writeStartElement("player1");  
xmlstreamwriter.writeAttribute("framescore", mPlayer1Frame);  
xmlstreamwriter.writeAttribute("points", mPlayer1Point);  
xmlstreamwriter.writeAttribute("break", mPlayer1ContinuePoint);  
  xmlstreamwriter.writeCharacters("Hello World");   //添加内容  
xmlstreamwriter.writeEndElement();  
//player2  
xmlstreamwriter.writeStartElement("player2");  
xmlstreamwriter.writeAttribute("framescore", mPlayer2Frame);  
xmlstreamwriter.writeAttribute("points", mPlayer2Point);  
xmlstreamwriter.writeAttribute("break", mPlayer2ContinuePoint);  
xmlstreamwriter.writeEndElement();  
xmlstreamwriter.writeEndElement();  
xmlstreamwriter.writeEndElement();  
xmlstreamwriter.writeEndDocument(); file.close();  
结果如下:[cpp] view plain copy<?xml version="1.0" encoding="UTF-8"?>  
<xml>  
    <round id="" tableid="1">  
        <player1 framescore="" points="" break="">Hello World</player1>  
        <player2 framescore="" points="" break=""/>  
    </round>  
</xml>  
读文件时,用isStartElement来判断标志的起始<name a=""></name>形式,用attributes().value("a")<name>a</name>形式,用readElementText在读取时,是通过循环,while (!reader.atEnd()) {reader.readNext();.....;}[cpp] view plain copyQFile file("test.txt");  
file.open(QIODevice::ReadOnly);  
  
QXmlStreamReader reader(&file);  
  
while (!reader.atEnd()) {  
    reader.readNext();  
    if (reader.isStartElement()) {  
        if (reader.name() == "round") {  
            qDebug() << reader.attributes().value("id").toString();  
            qDebug() << reader.attributes().value("tableid").toString();  
        } else if (reader.name() == "player1") {  
            qDebug() << reader.attributes().value("framescore").toString();  
            qDebug() << reader.attributes().value("points").toString();  
            qDebug() << reader.attributes().value("break").toString();  
            qDebug() << reader.readElementText();  
        } else if (reader.name() == "player2") {  
            qDebug() << reader.attributes().value("framescore").toString();  
            qDebug() << reader.attributes().value("points").toString();  
            qDebug() << reader.attributes().value("break").toString();  
            qDebug() << reader.readElementText();  
        }  
    }  
}  
file.close();  
结果如下[html] view plain copy""   
"1"   
""   
""   
""   
"Hello World"   
""   
""   
""   
""   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt