原文地址
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
J K. Rowling
2005
29.99
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还提供了替换节点的方法,自行探索。