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);

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

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

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

    QDomNode n = ele.firstChild();
    while ( !n.isNull() )
    {
    	 //...
          n = n.nextSibling();
    }
    for (int i = 0; i < ele.childNodes().size(); ++i)
    {
   		 //...
    }

拿到所有外部节点后,判断这个节点的类型,通过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;

根据类型转换后,可以通过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-----"<<e.nodeName()<<e.nodeType()<<echild.text()<<echild.attributes().count();
                QDomNamedNodeMap map = echild.attributes();
                for (int i = 0; i < map.count(); ++i)
                {
                    QDomNode node = map.item(i);
                    qDebug()<<node.toAttr().nodeName()<<node.toAttr().nodeValue();
                }
            }
      }

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

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东方忘忧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值