gpt4 book ai didi

C++/Qt QDomDocument : iterate over all XML Tags

转载 作者:数据小太阳 更新时间:2023-10-29 03:01:06 26 4
gpt4 key购买 nike

我的问题是,我有一个大型 XML 样式的文件,表示为 QDomDocument,我需要访问 XML 中多个位置的某些标签

我的 XML 看起来像这样

<Mat1>
<Name>Mat_1</Name>
<Properties>
<Size>10</Size>
<SizeMod>G</SizeMod>
</Properties>
</Mat1>
<Mat2>
<Name>Mat_2</Name>
<Properties>
<Size>15</Size>
<SizeMod>k</SizeMod>
</Properties>
</Mat2>

我需要访问所有出现的“SizeMod”和“Size”。问题是文件的布局将来可能会定期更改,我希望我的代码适用于该文件的所有版本。

目前,我只是使用多个 for 循环遍历所有子节点,直到达到所需的深度,然后使用 if 语句检查我是否在正确的节点。

但这似乎是一种糟糕的方式。

最佳答案

正如@hank 评论的那样,您应该使用QDomDocument::elementsByTagName(const QString &tagname) 来获取元素在名为 tagname 的文档中。

然后,迭代节点以获取每个 QDomNode。最后,将 QDomNode 转换为 QDomElement

我们正在打印元素的文本和标签名称的示例:

#include <QtXml>
#include <QtCore>

int main()
{
QFile file(":/myxml.xml");

file.open(QFile::ReadOnly|QFile::Text);

QDomDocument dom;
QString error;

int line, column;

if(!dom.setContent(&file, &error, &line, &column)) {
qDebug() << "Error:" << error << "in line " << line << "column" << column;
return -1;
}

QDomNodeList nodes = dom.elementsByTagName("Size");
for(int i = 0; i < nodes.count(); i++)
{
QDomNode elm = nodes.at(i);
if(elm.isElement())
{
qDebug() << elm.toElement().tagName()
<< " = "
<< elm.toElement().text();
}
}

nodes = dom.elementsByTagName("SizeMod");
for(int i = 0; i < nodes.count(); i++)
{
QDomNode elm = nodes.at(i);
if(elm.isElement())
{
qDebug() << elm.toElement().tagName()
<< " = "
<< elm.toElement().text();
}
}

return 0;
}

关于C++/Qt QDomDocument : iterate over all XML Tags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com