C++ 以QXmlItem作为QXmlQuery焦点提取子节点值
我一直在尝试从此XML文件获取节点文本值:C++ 以QXmlItem作为QXmlQuery焦点提取子节点值,c++,qt,xpath,xquery,C++,Qt,Xpath,Xquery,我一直在尝试从此XML文件获取节点文本值: <!DOCTYPE structure> <data> <x> <id>1</id> <nam>tytuł</nam> <tab>21</tab> <ind>5</ind> <pre>TY</pre> <khw>C.TY<
<!DOCTYPE structure>
<data>
<x>
<id>1</id>
<nam>tytuł</nam>
<tab>21</tab>
<ind>5</ind>
<pre>TY</pre>
<khw>C.TY</khw>
</x>
<x>
<id>2</id>
<nam>autor</nam>
<tab>21</tab>
<ind>5</ind>
<pre>FO</pre>
<khw>C.FO</khw>
</x>
<x>
<id>3</id>
<nam>hasło korporatywne</nam>
<tab>21</tab>
<ind>5</ind>
<pre>FN</pre>
<khw>C.FN</khw>
</x>
</data>
1.
蒂图什
21
5.
泰
C.TY
2.
自动
21
5.
法罗群岛
C.FO
3.
科波拉蒂翁
21
5.
FN
C.FN
我要做的是获取每个节点及其子节点并将其转换为QMap。我在获取单个元素方面没有问题,但是当通过将QXmlQuery的结果设置为焦点来获取子项时,我计算子节点查询的QString是空的。我使用这段代码:
QFile structure("./structure.xml");
structure.open(QFile::ReadOnly);
QXmlQuery query;
query.setFocus(&structure);
query.setQuery("data/x");
QXmlResultItems results;
query.evaluateTo(&results);
QXmlQuery childQuery(query.namePool());
while (!results.next().isNull()) {
childQuery.setFocus(results.current());
childQuery.setQuery("nam/text()");
QString r;
childQuery.evaluateTo(&r);
qDebug() << r;
}
QXmlResultItems结果;
QFile结构(“./structure.xml”);//xml文件,如前所述
打开(QFile::ReadOnly);
QXmlQuery查询;
query.setFocus(&structure);
query.setQuery(“数据/x”);
查询、评估和结果;
QXmlItem next=结果。next();
而(!next.isNull()){
qDebug()它应该是这样工作的:
QFile structure("./structure.xml");
structure.open(QFile::ReadOnly);
QXmlQuery query;
query.setFocus(&structure);
query.setQuery("data/x");
QXmlResultItems results;
query.evaluateTo(&results);
while (!results.next().isNull()) {
query.setFocus(results.current());
query.setQuery("nam/text()");
QString r;
query.evaluateTo(&r);
qDebug() << r;
}
代码为每个x执行一个消息框(此计算机上没有qt,因此现在无法测试)而不是使用evaluateTo(QString*)
使用QStringList
版本。它应该可以工作。我也有同样的问题,解决方法是让query
和childQuery
完全相同。您可以将代码重写为:
while(!next.isNull()){
qDebug()不幸的是,从Qt文档中不清楚,当您想要使用QXmlQuery::setFocus(const-QXmlItem&item)
重载来查询子节点时,您应该使用QXmlQuery(const-QXmlNamePool&np)创建相应的QXmlQuery
对象
constructor使它们共享同一个对象。简单地说,这种共享将查询彼此关联起来
考虑到这一点,您的示例应该如下所示:
很抱歉,attribute()
方法用于获取特定元素的属性,而不是获取其子元素。在这种情况下,我应该使用firstChild().nodeValue()
关于变量e
。我知道我可以使用这种方法,但我想要避免的是太多的代码无法从XML树中获取特定数据。有趣的是,如果将“nam”标记重命名为“name”,它可以与“/id/string()”甚至“/name/string()”一起使用.看起来这里描述的相同问题现在可以解决了。请您解释一下,为什么可以解决?
while(!next.isNull()) {
qDebug() << next.toNodeModelIndex().stringValue();
QString r;
query.setFocus(next);
query.setQuery("./nam/text()");
query.evaluateTo(&r);
qDebug() << r;
next = results.next();
}
QFile structure("./structure.xml");
structure.open(QFile::ReadOnly);
QXmlQuery query;
query.setFocus(&structure);
query.setQuery("data/x");
QXmlResultItems results;
query.evaluateTo(&results);
QXmlQuery childQuery(query.namePool());
while (!results.next().isNull()) {
childQuery.setFocus(results.current());
childQuery.setQuery("nam/text()");
QString r;
childQuery.evaluateTo(&r);
qDebug() << r;
}
QFile structure("./structure.xml");
structure.open(QFile::ReadOnly);
QXmlQuery query;
query.setFocus(&structure);
query.setQuery("data/x");
QXmlResultItems results;
query.evaluateTo(&results);
while (!results.next().isNull()) {
query.setFocus(results.current());
query.setQuery("nam/text()");
QString r;
query.evaluateTo(&r);
qDebug() << r;
}