Qt — xml读写及常用操作示例

1 QXML类概述

描述
QDomAttr表示 QDomElement 的一个属性
QDomCDATASection表示一个 XML CDATA 片段
QDomCharacterData表示 DOM 中的通用字符串
QDomComment表示 XML 注释
QDomDocument表示一个 XML 文档
QDomDocumentFragment一组 QDomNodes,通常不是完整的 QDomDocument
QDomDocumentTypeDTD 在文档树中的表示
QDomElement代表 DOM 树中的一个元素
QDomEntity代表一个 XML 实体
QDomEntityReference表示 XML 实体引用
QDomImplementation有关 DOM 实现功能的信息
QDomNamedNodeMap包含可以通过名称访问的节点集合
QDomNodeDOM 树中所有节点的基类
QDomNodeList QDomNode 对象列表
QDomNotation表示 XML 符号
QDomProcessingInstruction表示一条 XML 处理指令
QDomText表示解析的 XML 文档中的文本数据
QXmlAttributesXML 属性
QXmlContentHandler用于报告 XML 数据逻辑内容的接口
QXmlDTDHandler用于报告 XML 数据的 DTD 内容的接口
QXmlDeclHandlerXML数据声明内容上报接口
QXmlDefaultHandler所有 XML 处理程序类的默认实现
QXmlEntityResolver用于解析 XML 数据中包含的外部实体的接口
QXmlErrorHandler用于报告 XML 数据错误的接口
QXmlInputSourceXmlReader 子类的输入数据
QXmlLexicalHandler报告 XML 数据词法内容的接口
QXmlLocator包含有关文件中解析位置信息的 XML 处理程序类
QXmlNamespaceSupport用于希望包含命名空间支持的 XML 阅读器的类
QXmlParseException使用 QXmlErrorHandler 接口报告错误
QXmlReaderXML 阅读器(即解析器)的接口
QXmlSimpleReader一个简单的 XML 解析器的实现

2 XML示例

2.1 示例1

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <tag id="1">
    <name>test1</name>
    <value>100</value>
  </tag>
  <tag id="1">
    <name>test2</name>
    <value>100</value>
  </tag>
</root>
  • 说明:
    1 节点名:root、tag、value、type
    2 属性:id
    3 文本:test1
    4 元素:一对标签囊括的内容

3 XML节点说明

在这里插入图片描述
QTXml的结构如图所示,解析、生成xml的用到的类有QDomDocument、QDomElement、QDomAttr。

3.1QDomNode

  • 描述:是 DOM 树中所有节点的基类.
  • API及功能
    1 appendChild、insertAfter、insertBefore、removeChild、replaceChild:在最后插入一个新的子节点、在指定子节点之后插入新的子节点、在指定子节点之前插入新的子节点、删除子节点、替换子节点。
    2 childNodes:返回字节的列表。
    3 clear:将节点转换为空节点; 如果之前不是空节点,则删除其类型和内容。
    4 cloneNode:复制当前节点的副本,其参数deep deep 为真,则克隆以递归方式完成,这意味着所有节点的子节点也被深度复制。 如果 deep 为 false,则仅复制节点本身,并且副本将没有子节点。
    5 firstChild、lastChild、firstChildElement、lastChildElement:第一个子节点(元素、属性、文本……)、最后一个子节点(元素、属性、文本……)、第一个子元素、最后一个子元素。
    6 isAttr、isComment、isDocument、isElement、isText等:判断当前节点的类型。
    7 toAttr、toComment、toDocument、toElement、toText等:转换当前节点的类型。
    8 namedItem:根据节点名获取当前节点的一级子节点。
    9 nextSibling、previousSibling、nextSiblingElement、previousSiblingElement:获取下一个兄弟节点、获取上一个兄弟节点、获取下一个[指定参数名的]兄弟元素、获取上一个[指定参数名的]兄弟元素。
    10 nodeName:获取节点名。
    11 nodeType:获取节点类型,具体值如下:
    在这里插入图片描述
    12 parentNode:父节点。
    13 save:保存到文件流,第二个参数指定了缩进格式,第三个参数为编码格式(默认UTF-8)。
    14 nodeValue、setNodeValue:获取节点的值、设置节点的值。不同类型的节点,值得含义如下,其他类型返回空字符串:
节点类型描述
QDomAttr属性值
QDomCDATASectionCDATA 部分的内容
QDomComment注释
QDomProcessingInstruction处理指令的数据
QDomText文本信息

3.2 QDomDocument

  • 描述:表示整个 XML 文档。 从概念上讲,它是文档树的根,并提供对文档数据的主要访问。QDomElement、QDomText、QDomComment、处理指令等不能存在于QDomDocument的上下文之外,QDomDocument包含创建这些对象所需的工厂函数。
  • 注意:解析的 XML 在内部由对象树表示,可以使用各种 QDom 类访问这些对象树。所有 QDom 类只引用内部树中的对象。一旦最后一个引用它们的 QDom 对象或 QDomDocument 本身被删除,DOM 树中的内部对象将被删除
  • API及功能
    1 createAttribute、createComment、createElement、createTextNode等:创建对应的数据类型对象。
    2 elementById、elementsByTagName:根据条件获取一个或多个xml元素
    3 documentElement:返回文档的根元素
    4 setContent:此函数从字节数组(或字符串)数据中解析 XML 文档并将其设置为文档的内容,它尝试按照 XML 规范的要求检测文档的编码。
    5 toString:将解析后的文档转换回其文本表示,此函数的参数作为缩进子元素的空间量。
  • 补充说明:creat对象不会将此对象加入此对象树,需要 appendChild() 函数来添加字节点

3.3 QDomElement

  • 描述:代表 DOM 树中的一个元素。
  • API及功能
    1 attribute、attributeNode、attributes:根据属性名获取属性值、根据属性名获取属性节点、获取该节点的属性节点列表
    2 elementsByTagName:根据节点名获取该元素的子节点列表
    3 setAttribute、removeAttribute:添加(修改)属性、删除属性
    4 text:获取该元素的文本值,若没有则返回空字符串。e.g 示例1 <name>test1</name>调用此接口返回test1

3.4 QDomAttr

  • 描述:代表 QDomElement 的一个属性。
  • API及功能
    1 name:属性名
    2 value:属性值
    3 ownerElement:所属元素

3.5 QDomText

  • 描述:表示解析的 XML 文档中的文本数据。

4 使用示例

4.1 pro配置

QT += core xml

4.2 加载并解析xml

  • 代码示例:解析xml示例1所示文件
#include <iostream>
#include <QFile>
#include <QDomDocument>
using namespace std;

static int iLevel = 0;
void ParseXmlNode(const QDomNode &clsEle)
{
    ++iLevel;
    QString strEleName = clsEle.nodeName();
    cout << "\nlevel = " << iLevel << " "
         << strEleName.toStdString() << " type = " << clsEle.nodeType()
         << " value = " << clsEle.nodeValue().toStdString() << endl;
    if(clsEle.hasAttributes())
    {
        QDomNamedNodeMap mapAttrs = clsEle.attributes();
        for(int i = 0, iSize = mapAttrs.count(); i < iSize; ++i)
        {
            cout << "attr" << i << " node type = " << mapAttrs.item(i).nodeType()
                 << " " << mapAttrs.item(i).nodeName().toStdString()
                  << " = " << mapAttrs.item(i).nodeValue().toStdString() << endl;
        }
    }
    QDomNodeList lstChildren = clsEle.childNodes();
    for (int i = 0, iSize = lstChildren.size(); i < iSize; ++i)
    {
        ParseXmlNode(lstChildren.at(i));
    }
    --iLevel;
}

int main()
{
    QFile file("test.xml");
    if(!file.exists())
    {
        return 0;
    };

    QDomDocument dom;
    if(!dom.setContent(&file))
    {
        return 0;
    }

    QDomElement domRoot = dom.documentElement();
    ParseXmlNode(domRoot);

    getchar();
    return 0;
}

4.2 构建并保存xml

  • 代码示例:构建并保存xml示例1所示文件
#include <iostream>
#include <QFile>
#include <QDomDocument>
#include <QMap>
using namespace std;

int main()
{
    QDomDocument clsDoc;
    QDomProcessingInstruction xmlProcess = clsDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
    clsDoc.appendChild(xmlProcess);

    QDomElement clsRoot = clsDoc.createElement("root");

    QMap<QString, int> mapData{{"test1", 100}, {"test2",100}};

    QMap<QString, int>::const_iterator itCur = mapData.begin();
    QMap<QString, int>::const_iterator itEnd = mapData.end();
    for (int i = 0; itCur != itEnd; ++itCur, ++i)
    {
        QDomElement clsTag = clsDoc.createElement("tag");
        QDomElement clsName = clsDoc.createElement("name");
        QDomElement clsValue = clsDoc.createElement("value");

        clsTag.setAttribute("id", QString::number(1));
        clsName.appendChild(clsDoc.createTextNode(itCur.key()) );
        clsValue.appendChild(clsDoc.createTextNode(QString::number(itCur.value())) );

        clsTag.appendChild(clsName);
        clsTag.appendChild(clsValue);
        clsRoot.appendChild(clsTag);
    }
    clsDoc.appendChild(clsRoot);

    QString strText = clsDoc.toString(2);
    QFile clsFile("test.xml");

    clsFile.open(QFile::WriteOnly | QFile::Truncate);
    clsFile.write(strText.toStdString().c_str(), strText.size());
    clsFile.close();

    getchar();
    return 0;
}
  • 5
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用QtQtCore和QtXml模块来读写XML文件。下面是一个简单的示例代码,展示了如何使用Qt读取XML文件和写入XML文件: ```cpp #include <QtXml/QtXml> #include <QtCore/QFile> #include <QtCore/QIODevice> int main() { // 读取XML文件 QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open XML file for reading."; return -1; } QDomDocument doc; if (!doc.setContent(&file)) { qDebug() << "Failed to parse XML."; file.close(); return -1; } file.close(); // 遍历XML数据 QDomElement root = doc.documentElement(); QDomNodeList nodes = root.childNodes(); for (int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); if (node.isElement()) { QDomElement element = node.toElement(); qDebug() << "Element name:" << element.tagName(); qDebug() << "Element value:" << element.text(); } } // 写入XML文件 QFile outputFile("output.xml"); if (!outputFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to open output XML file."; return -1; } QTextStream stream(&outputFile); doc.save(stream, 4); // 缩进为4个空格 outputFile.close(); return 0; } ``` 上述示例代码首先打开一个XML文件进行读取,然后使用`QDomDocument`类解析XML数据。通过遍历`QDomDocument`对象的子节点,可以获得每个元素的标签名和文本值。最后,将解析后的XML数据保存到新的XML文件中。 请注意,上述代码中使用的XML文件名为"example.xml"和"output.xml",你可以根据自己的需要修改这些文件名。此外,你需要在.pro文件中添加`QT += xml`以包含QtXml模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值