Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以QXmlItem作为QXmlQuery焦点提取子节点值_C++_Qt_Xpath_Xquery - Fatal编程技术网

C++ 以QXmlItem作为QXmlQuery焦点提取子节点值

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<

我一直在尝试从此XML文件获取节点文本值:

  <!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;
}