XML(可扩展标记语言,eXtensible Markup Language)是一种用于存储和传输数据的文本格式,广泛用于配置文件、数据交换和文档表示。XML 文件具有明确的结构和标记,这使得它能够描述复杂的层次结构和数据关系。
xml和html的区别?
- xml标签和属性可自定义,html标签和属性固定不可自定义
- xml注重在数据的本身作为数据承载一个标签的定义就是为了承载一个数据,HTML注重的是数据的显示方式,一个标签的使用是为了页面的结构化和需求
XML 文件的基本结构
- 声明(可选)
XML 文件通常以一个 XML 声明开始,指示 XML 版本和字符编码:
<?xml version="1.0" encoding="UTF-8"?>
- 根元素
XML 文件必须有一个唯一的根元素,所有其他元素都包含在这个根元素中:
<root>
<!-- 子元素 -->
</root>
- 元素
元素是 XML 的基本组成部分,每个元素都有一个开始标签和一个结束标签,标签之间的内容为元素的内容:
<element>内容</element>
- 属性
元素可以有属性,属性提供了额外的信息,并位于开始标签中:
<element attribute="value">内容</element>
- 嵌套元素
元素可以嵌套其他元素,形成层次结构:
<parent>
<child>内容</child>
</parent>
- 注释
注释可以添加到 XML 文件中,以提供额外的信息或说明,但不会影响 XML 的处理:
<!-- 这是一个注释 -->
QT设置xml常用类
处理XML的主要类是QDomDocument、QDomElement、QDomNode、QXmlStreamReader和QXmlStreamWriter。这些类分别用于读取、写入、解析和操作XML文档。
1. QDomDocument
用途: 用于处理和操作整个 XML 文档的 DOM(文档对象模型)结构。
QDomDocument 以树形结构读取、修改和创建 XML 文档。
主要功能:
- 解析 XML 文档字符串或文件,生成一个 DOM 树。
- 提供访问和操作 XML 文档节点的方法。
- 支持创建新节点、修改现有节点以及保存 XML 文档到文件。
示例代码:
QDomDocument doc;
QFile file("example.xml");
if (file.open(QIODevice::ReadOnly) && doc.setContent(&file)) {
// 处理 XML 文档
}
2. QDomElement
用途: 代表 XML 文档中的一个元素节点。它是 DOM 树中节点的一个具体类型,用于访问和操作元素的属性和文本内容。
主要功能:
- 获取和设置元素的属性。
- 获取元素的子元素、文本内容等。
- 通过 QDomElement 对象可以修改 XML 元素的内容和属性。
示例代码:
QDomElement element = doc.documentElement(); // 获取根元素
QString value = element.attribute("attributeName"); // 获取属性值
3. QDomNode
用途: 代表 XML 文档中的一个节点。QDomNode 是一个通用的节点类,可以表示元素节点、属性节点、文本节点等。
主要功能:
- 提供节点的类型、父节点、子节点等通用操作。
- 通过 QDomNode 可以访问不同类型的节点,但要将其转换为具体类型(如 QDomElement、QDomText)才能进一步操作。
示例代码:
QDomNode node = doc.firstChild();
if (node.isElement()) {
QDomElement element = node.toElement();
}
4. QXmlStreamReader
用途: 用于逐步读取 XML 数据,适用于处理大规模的 XML 数据,因为它以流式方式解析 XML 文件,不需要将整个文件加载到内存中。
主要功能:
- 按顺序读取 XML 文档中的节点。
- 适用于从头到尾逐个处理 XML 数据流,节省内存。
- 只提供读取操作,不支持修改 XML 数据。
示例代码:
QXmlStreamReader reader(&file);
while (!reader.atEnd()) {
if (reader.readNext() == QXmlStreamReader::StartElement) {
QStringRef name = reader.name();
// 处理元素
}
}
5. QXmlStreamWriter
用途: 用于逐步写入 XML 数据,适用于生成或修改 XML 文件。与 QXmlStreamReader 配合使用可以有效地处理 XML 数据流。
主要功能:
- 提供逐步写入 XML 元素、属性、文本等功能。
- 可以逐个构建 XML 文档,适用于内存受限或需要动态生成 XML 文件的场景。
示例代码:
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("root");
writer.writeTextElement("child", "value");
writer.writeEndElement();
writer.writeEndDocument();
使用QDomDocument进行XML读写
读取数据:
#include <QDomDocument>
#include <QFile>
#include <QTextStream>
bool readXml(const QString &fileName) {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
qWarning("Failed to open file for reading");
return false;
}
QDomDocument doc;
if (!doc.setContent(&file)) {
file.close();
qWarning("Failed to parse XML");
return false;
}
file.close();
//返回根节点
QDomElement root = doc.documentElement();
//返回 root 元素下所有名称为 "item" 的子元素
QDomNodeList items = root.elementsByTagName("item");
//遍历 items 中的所有元素
for (int i = 0; i < items.count(); ++i) {
QDomElement element = items.at(i).toElement();
QString name = element.attribute("name"); //从 element 中获取名为 "name" 的属性值
QString value = element.text();
qDebug() << "Item:" << name << value;
}
return true;
}
写入数据:
#include <QDomDocument>
#include <QFile>
#include <QTextStream>
bool writeXml(const QString &fileName) {
QDomDocument doc;
//文档对象创建一个标签
QDomElement root = doc.createElement("root");
doc.appendChild(root);
QDomElement item = doc.createElement("item");
//为标签添加属性
item.setAttribute("name", "example");
item.appendChild(doc.createTextNode("This is an example item"));
//为root添加子标签
root.appendChild(item);
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
qWarning("Failed to open file for writing");
return false;
}
//保存文件
QTextStream stream(&file);
stream << doc.toString();
file.close();
return true;
}