• qt的xml读写和QDomDocument、QDomElement、QDomNode、QDomNamedNodeMap讲解


    在QT中除了使用QJsonDocument 、QJsonObject、QJsonArray、QJsonValue 来支持json文件的读写外,还可以通过QDomDocument、QDomElement、QDomNode、QDomNamedNodeMap来支持xml的读写。

    使用xml前需要在pro文件中加入QT += xml。
    然后读xml文件时,通过QDomDocument关联QFile来读取xml文件1内容,如下:

      	QDomDocument doc;
        QFile file("test.xml");
        file.open(QIODevice::ReadOnly);
        doc.setContent(&file);
    
    • 1
    • 2
    • 3
    • 4

    当QDomDocument关联Qfile成功后,就可以通过doc.toString()获取到xml的所有文本内容,同时通过QDomElement来获取到所有外部节点了,代码如下:

        QDomElement ele = doc.documentElement(); //通过遍历节点根据节点id找到需要操作的节点,修改其属性。
        QString svgXml = doc.toString();//将修改后的xml对象转为字符串
    
    • 1
    • 2

    具体获取所有节点有两种方式:
    方法1:通过ele.firstChild()拿到第一个节点,然后调用nextSibling拿到下一个节点。
    方法2:通过ele.childNodes()直接拿到所有节点。
    代码如下:

        QDomNode n = ele.firstChild();
        while ( !n.isNull() )
        {
        	 //...
              n = n.nextSibling();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
        for (int i = 0; i < ele.childNodes().size(); ++i)
        {
       		 //...
        }
    
    • 1
    • 2
    • 3
    • 4

    拿到所有外部节点后,判断这个节点的类型,通过nodeType()获取节点类型,然后根据类型进行转换。
    各类型如下:

    enum NodeType {
    ElementNode = 1,
    AttributeNode = 2,
    TextNode = 3,
    CDATASectionNode = 4,
    EntityReferenceNode = 5,
    EntityNode = 6,
    ProcessingInstructionNode = 7,
    CommentNode = 8,
    DocumentNode = 9,
    DocumentTypeNode = 10,
    DocumentFragmentNode = 11,
    NotationNode = 12,
    BaseNode = 21,// this is not in the standard
    CharacterDataNode = 22 // this is not in the standard
    };

    转换方式如下;

    QDomElement toElement() const;
    QDomAttr toAttr() const;
    QDomText toText() const;
    QDomCDATASection toCDATASection() const;
    QDomEntityReference toEntityReference() const;
    QDomEntity toEntity() const;
    QDomComment toComment() const;
    QDomDocument toDocument() const;
    QDomDocumentType toDocumentType() const;
    QDomDocumentFragment toDocumentFragment() const;
    QDomNotation toNotation() const;
    QDomProcessingInstruction toProcessingInstruction() const;
    QDomCharacterData toCharacterData() const;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    根据类型转换后,可以通过nodeName()来获取节点名称,通过text()获取节点文本。通过attributes()获取节点中所有字段。
    示例如下:

        for (int i = 0; i < ele.childNodes().size(); ++i)
        {
            //对根节点可以取得其对应的子节点
            QDomElement e = ele.childNodes().at(i).toElement();
            if( !e.isNull())
            {
                if(e.nodeName() == "title")
                {
                    QDomElement echild = e.toElement();
                    qDebug()<<"---title-----"<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这个示例中为什么我会转为QDomElement,因为我已经通过nodeType()知道它的类型了。
    还有我为什么使用QDomNamedNodeMap map = echild.attributes()来获取字段,因为我已经通过echild.attributes().count()的大小知道它存在字段了。

  • 相关阅读:
    【Spring篇】Spring注解式开发
    车路协同 智能路侧设备网络安全接入技术要求
    有限元编程示例
    索引数据结构千千万 , 为什么B+Tree独领风骚
    一本了解生成式人工智能
    什么是智能档案柜?如何使用智能档案柜?
    每天五分钟机器学习:如何根据ROC曲线计算AUC?
    前端Canvas入门——一些注意事项
    【计算机组成原理】第一章 概论
    CSRF如何防范
  • 原文地址:https://blog.csdn.net/weixin_43246170/article/details/127683668