您好我正在处理一个读取XML文件的应用程序。在这里,我试图读取不在节点“b”下的“a”节点下的“name”节点。 当我尝试读取根“name”节点时,我得到了两个节点。 请帮我解决问题。 贝娄就是样本。
<a>
<x>rrr</X>
<b>
<name> 123 </name>
</b>
<name> main </name>
<c>yyyy</c>
</a>
QDomDocument mDocument;
QDomElement mDocumentElement;
if (!mDocument.setContent(file.readAll()))
{
return ;
}
mDocumentElement = mDocument.documentElement();
QDomNodeList list = mDocumentElement.elementsByTagName("a").at(0).toElement().elementsByTagName("name");
int count = list.count();
for (int i = 0; i < count; i++)
{
QString str = list.at(i).nodeValue();
QMessageBox::information(this, "text", str, QMessageBox::Yes, 0);
}
答案 0 :(得分:1)
如果您的XML遍历基于结构而不是基于内容类型,则可以按照此进行操作。
QDomDocument mDocument;
QDomElement mDocumentElement;
if (!mDocument.setContent(file.readAll()))
{
return ;
}
mDocumentElement = mDocument.documentElement();
QDomNodeList list = mDocumentElement.childNodes();
QDomElement firstChild = list.at(0).toElement(); // will return the first child
QDomElement secondChild = list.at(1).toElement(); // second child
......
获取标签之间的数据
QString childData = firstChild.text();
可以使用。同样,您可以遍历直到所需的<name>
,并且可以使用其值。 请记住,childNodes()只返回直接子项列表。希望很清楚。它没有经过测试但应该有效。
答案 1 :(得分:0)
您可以使用QDomNode :: firstChild(QString tagName)和QDomNode :: nextSiblingElement(QString tagName)迭代“a”元素的直接子元素。代码如下:
QDomDocument mDocument;
if (!mDocument.setContent(file.readAll()))
{
return ;
}
QDomElement mElement = mDocument.documentElement().firstChildElement("name");
while ( !mElement.isNull() )
{
// do all you need to do with <name> element
mElement = mElement.nextSiblingElement("name");
}
我已经在您的示例XML上测试了此代码,如果您要修复此行上的代码不匹配,它就会起作用:&lt; x&gt; rrr&lt; / X&gt;