qt读写xml文件

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" 
"" 
"" 
"" 
"" 







Qt中,可以使用多种方式实现XML文件读写操作,其中最常用的方式包括`QDomDocument`、`QXmlStreamReader`、`QXmlStreamWriter`和`Qt XML Patterns`模块。以下是具体的实现方法及其示例代码。 ### 使用 QDomDocument 读写 XML 文件 `QDomDocument` 提供了基于 DOM 的 XML 文件操作方式,适用于需要频繁修改文档结构的场景,但内存占用较高。 #### XML 文件示例 ```cpp #include <QDomDocument> #include <QFile> #include <QTextStream> void writeXmlFile(const QString &fileName) { QDomDocument doc; QDomElement root = doc.createElement("Root"); doc.appendChild(root); QDomElement child = doc.createElement("Child"); child.setAttribute("name", "Example"); QDomText text = doc.createTextNode("This is an example."); child.appendChild(text); root.appendChild(child); QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QTextStream stream(&file); stream << doc.toString(); file.close(); } } ``` #### 读取 XML 文件示例 ```cpp void readXmlFile(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) return; QDomDocument doc; if (!doc.setContent(&file)) { file.close(); return; } file.close(); QDomElement root = doc.documentElement(); QDomNode node = root.firstChild(); while (!node.isNull()) { QDomElement element = node.toElement(); if (!element.isNull()) { qDebug() << "Tag name:" << element.tagName(); qDebug() << "Attribute name:" << element.attribute("name"); qDebug() << "Text:" << element.text(); } node = node.nextSibling(); } } ``` ### 使用 QXmlStreamWriter XML 文件 `QXmlStreamWriter` 是一种流式入方式,适合处理大型 XML 文件,因为它具有较低的内存占用[^3]。 ```cpp #include <QFile> #include <QXmlStreamWriter> void writeXmlWithStreamWriter(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return; QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xml.writeStartDocument(); xml.writeStartElement("Root"); xml.writeStartElement("Child"); xml.writeAttribute("name", "StreamExample"); xml.writeCharacters("This is a stream-based example."); xml.writeEndElement(); // Child xml.writeEndElement(); // Root xml.writeEndDocument(); file.close(); } ``` ### 使用 QXmlStreamReader 读取 XML 文件 `QXmlStreamReader` 提供了一种高效的流式读取 XML 文件的方式,适合处理大型 XML 文件[^3]。 ```cpp #include <QFile> #include <QXmlStreamReader> void readXmlWithStreamReader(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) return; QXmlStreamReader xml(&file); while (!xml.atEnd()) { QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartElement) { if (xml.name() == "Child") { QXmlStreamAttributes attributes = xml.attributes(); if (attributes.hasAttribute("name")) { qDebug() << "Attribute name:" << attributes.value("name").toString(); } } } else if (token == QXmlStreamReader::Characters && !xml.isWhitespace()) { qDebug() << "Text:" << xml.text().toString(); } } file.close(); } ``` ### 使用 Qt XML Patterns 模块进行复杂查询 `Qt XML Patterns` 模块支持使用 XQuery 和 XPath 进行复杂的 XML 数据查询,但学习曲线较陡[^3]。 ```cpp #include <QFile> #include <QXmlQuery> #include <QXmlResultItems> #include <QDebug> void queryXmlWithXQuery(const QString &fileName) { QXmlQuery query; QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) return; query.setFocus(QUrl::fromLocalFile(file.fileName())); query.setQuery("for $x in doc('')//Child return $x/@name"); if (query.isValid()) { QXmlResultItems result; query.evaluateTo(&result); QXmlItem item; while (!(item = result.next()).isNull()) { if (item.isAtomic()) qDebug() << "Attribute name:" << item.toAtomicValue().toString(); } } file.close(); } ``` ### 总结 - **QDomDocument**:适合小型 XML 文件,提供树形结构便于操作,但内存占用较高。 - **QXmlStreamWriter / QXmlStreamReader**:推荐用于大型 XML 文件,具有较低的内存占用和高效的流式处理能力。 - **Qt XML Patterns**:适用于需要复杂查询的场景,支持 XQuery 和 XPath,但学习难度较高[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值