XML(可扩展标记语言,eXtensible Markup Language)是一种用于数据传输和存储的标记语言,它是一种可读性强、可扩展、通用、标准化的语言,常用于 Web、桌面应用程序和移动应用程序的数据交换和存储。XML 文档是一种层次结构的文档,由标签、属性和文本组成。
XML 的文档格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<根元素 属性1="值1" 属性2="值2">
<子元素 属性1="值1">
文本
</子元素>
<子元素 属性1="值1">
文本
</子元素>
...
</根元素>
其中 <?xml version="1.0" encoding="UTF-8"?> 是 XML 声明,用于指定 XML 版本和编码类型。根元素为 XML 文档的根元素,子元素为根元素的子节点,可以有多个子元素。子元素可以包含文本和属性,文本为子元素的内容,属性为子元素的属性。
下面是一个简单的 XML 文档示例:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product id="1">
<name>Product A</name>
<price>10.99</price>
</product>
<product id="2">
<name>Product B</name>
<price>20.99</price>
</product>
<product id="3">
<name>Product C</name>
<price>30.99</price>
</product>
</products>
使用 Qt 读取和写入 XML 数据:
QFile file("products.xml");
if (!file.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << "Error: Cannot read file " << file.fileName();
return;
}
QXmlStreamReader xmlReader(&file);
while (!xmlReader.atEnd() && !xmlReader.hasError()) {
QXmlStreamReader::TokenType token = xmlReader.readNext();
if (token == QXmlStreamReader::StartElement) {
QStringRef name = xmlReader.name();
if (name == "product") {
QString id = xmlReader.attributes().value("id").toString();
QString name = "";
QString price = "";
while (!xmlReader.atEnd() && !xmlReader.hasError() && xmlReader.readNext() != QXmlStreamReader::EndElement) {
if (xmlReader.tokenType() == QXmlStreamReader::StartElement) {
name = xmlReader.name().toString();
} else if (xmlReader.tokenType() == QXmlStreamReader::Characters) {
if (name == "name") {
name = xmlReader.text().toString();
} else if (name == "price") {
price = xmlReader.text().toString();
}
}
}
qDebug() << "id: " << id << ", name: " << name << ", price: " << price;
}
}
}
if (xmlReader.hasError()) {
qDebug() << "Error: " << xmlReader.errorString();
}
file.close();
QFile outFile("output.xml");
if (!outFile.open(QFile::WriteOnly | QFile::Text)) {
qDebug() << "Error: Cannot write file " << outFile.fileName();
return;
}
QXmlStreamWriter xmlWriter(&outFile);
xmlWriter.setAutoFormatting(true);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("products");
xmlWriter.writeStartElement("product");
xmlWriter.writeAttribute("id", "1");
xmlWriter.writeTextElement("name", "Product A");
xmlWriter.writeTextElement("price", "10.99");
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("product");
xmlWriter.writeAttribute("id", "2");
xmlWriter.writeTextElement("name", "Product B");
xmlWriter.writeTextElement("price", "20.99");
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("product");
xmlWriter.writeAttribute("id", "3");
xmlWriter.writeTextElement("name", "Product C");
xmlWriter.writeTextElement("price", "30.99");
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
outFile.close();
以上代码实现了从文件中读取 XML 数据和将数据写入到文件中。使用 QXmlStreamReader 类可以对 XML 数据进行解析,使用 QXmlStreamWriter 类可以生成 XML 数据。