2

我正在解析以下结构的相当复杂的 XML 文件:

<root> 
...
...
<item>
<subitem id="1"/>
<text>
text1
</text>
</item>
<item>
<subitem id="2"/>
<text>
text2
< /text>
</item>
...
<item>
...
</item>
...
</root>

这很粗糙,但我希望你明白我的意思。我主要对“项目”节点感兴趣。于是我写了如下代码(直接出自Qt的在线手册):

QXmlQuery query;
query.setQuery("//item/");

QXmlResultItems result;
query.evaluateTo(&result);

QXmlItem item(result.next());
while (!item.isNull()) 
{
  if (item.isNode())
  {
      // WHAT DO I DO NOW?
  }
  item = result.next();
}

现在,QXmlItem 似乎代表两个概念,一个字面值(如字符串)或一个节点(这就是 item.isNode() 所做的)。不幸的是,我无法掌握如何将 QXmlItem 转换为可以再次查询的东西。特别是从上面的示例中,我想获取“id”属性和文本元素。我可以使用 XQuery 方法来做到这一点,还是我离这里很远?

有什么建议吗?

谢谢!

4

2 回答 2

4

您可以使用 QXmlItem 修改查询的焦点。例如:

QXmlItem item(result.next());
while (!item.isNull()) 
{
  if (item.isNode())
  {
    query.setFocus(item);
    query.setQuery("./text/string()");
    QString text;
    query.evaluateTo(&text);
  }
  item = result.next();
}

将检索<text>.<item>

于 2011-04-05T10:44:32.123 回答
2

QXmlQuery是 Qt 文档的一个糟糕的部分,但我会说您编写查询以返回您真正想要的项目,即(这是一个未受教育的猜测)

query.setQuery("//item/subitem | //item/text");

W3Schools 有一个关于 XPath 的教程可能会有所帮助

于 2010-03-13T04:38:00.050 回答