qt讀寫xml檔案
阿新 • • 發佈:2019-02-10
1、DOM方式
寫xml檔案,以QDomText方式寫,程式碼如下
QFile 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();
讀程式碼為
QFile 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方式寫:
QFile 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
QFile 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
QFile 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();
結果如下:
<?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();.....;}
QFile 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();
結果如下
""
"1"
""
""
""
"Hello World"
""
""
""
""