Qt中几种操作xml的方式

本文详细介绍了Qt中使用流式、DOM方式处理XML的原理,并重点讲解了QDomNode、QDomElement、QDomAttr和QDomText的区别,以及如何获取和操作XML的文本和属性。通过实例展示了如何遍历XML节点并提取内容。
摘要由CSDN通过智能技术生成

原文地址
Qt中几种操作xml的方式
流方式
sax方式
dom方式
sax方式接触不多,从来没有在实际生产中使用过。
dom方式概念复杂,理解不是很清楚

QDomNode ? QDomElemet? QDomAttr?QDomText?
QDom前缀的都是代表节点类型。所以有,QDomElement代表一个Element节点,而QDomText代表一个Text节点。QDomNode类可以存储任意类型的节点。如果想进一步处理一个节点,首先必须把它转化为正确的数据类型。QDomNode调用toElement()以把它转化成QDomElement,然后调用tagName()来获得元素的标签名称。如果节点不是Element类型,那么toElement()函数就返回一个空QDomElement对象和一个空标签。

我们对xml操作,无非对节点文本,节点属性进行操作,因此,我着重在这个基础上整理一下。
QDomNode 兼容所有节点类型:
QDomNode调用toElement()以把它转化成QDomElement,然后调用tagName()来获得元素的标签名称。如果节点不是Element类型,那么toElement()函数就返回一个空QDomElement对象和一个空标签
QDomElemet 与 QDomAttr QDomText
由此可见:
属性不是QDomELement的子QDomELement
属性不是QDomNode的子QDomNode

QDomELement中的文本算是它的子QDomELement么?
hello
code 01
QDomElement ele= root.firstChildElement();

while(!ele.isNull())
{
   qDebug() << "xx";
   ele = ele.nextSiblingElement();
}

程序不会有任何输出
文本不是QDomELement的子QDomELement

code 02
QDomNode node= root.firstChild();

while(!node.isNull())
{
   qDebug() << "xx";
   node = node.nextSibling();
}

程序将会输出一个xx
文本是QDomNode的子QDomNode

了解了它们之间的联系之后,我们现在迫切的需要知道一个问题,既然文本和属性都不是子QDomELement,如何获取到文本和属性呢?
读写xml
遍历某QDomELement的 子QDomELement
示例xml


Harry Potter
J K. Rowling
2005
29.99


Learning XML
Erik T. Ray
2003
39.95

hello

code 03 遍历
QDomDocument doc = QDomDocument();
QFile file(“./test.xml”);
file.open(QFile::ReadWrite);
doc.setContent(&file);

QDomElement root = doc.documentElement();

QDomElement ele=  root.firstChildElement();

while(!ele.isNull())
{
   //do something

   ele = ele.nextSiblingElement();
}

doc.documentElement()获取最顶级的QDomDocument,接下来的循环遍历了它所有的QDomDocument,对于它的子QDomDocument,同样可以使用以上方法。
如果一个QDomDocument的firstChildElement()返回的QDomElement为空(ele.isNull() 为 true),则说明他没有子QDomElement,也就意味着他是xml的最底层了,接下来介绍获取文本和属性的方法。

code 04 读取
QDomDocument doc = QDomDocument();
QFile file(“./test.xml”);
file.open(QFile::ReadWrite);
doc.setContent(&file);

QDomElement root = doc.documentElement();

QDomElement ele=  root.firstChildElement();

qDebug() << root.attributeNode("category").nodeValue();

while(!ele.isNull())
{
    //此处可以有多种判定方法,此处只是采用了子元素为空判定
    //实际生产中你很可能不需要这样判断,根据xml结构直接判定元素名称即可
    //如 if(ele.tagName() == "xxxx")
    if(ele.firstChildElement().isNull())
    {
        qDebug() << ele.tagName();
        qDebug() << ele.text();

        //文本是ele的子QDomNode,而不是ele本身! 所以这样不会输出任何东西!
        qDebug() << ele.toText().nodeValue();
        //如果真的需要转化为QDomText
        QDomNode node = ele.firstChild();
        while (!node.isNull()) {
            if(node.isText())
            {
                qDebug() << node.toText().nodeValue();
            }
            node = node.nextSibling();
        }

    }
   ele = ele.nextSiblingElement();
}

输出

“xml”
“test”
“hello”
“”
“hello”
修改很简单,只需要将上边的nodeValue函数改为setNodeValue即可。记得要写回文件改动才会生效哦(详情请查看save方法的帮助文档)。
除此之外QDomDocument还提供了替换节点的方法,自行探索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值