QXmlQuery和Xpath:既不能提取节点的文本也不能提取参数的值

时间:2015-02-19 11:07:40

标签: xml xpath qtxml

我试图从xml内容中提取一些数据。所以我使用了QXmlQuery并编写了下面的代码(在Qt5中)。问题是:

  1. 如果我尝试提取text1(所以节点的文本,请参阅第32行),代码会返回整个节点:<value>text1</value>
  2. =&GT;问题1:如何只获得text1?

    1. 如果我尝试提取x1(所以参数的值,请参阅第35行),代码会返回一个错误: 文件中的错误SENR0001:/// C:/work/tests/build-TestXMLParser-Desktop-Debug/debug/TestXMLParser.exe,第1行第1列:属性参数无法序列化,因为它出现在顶层。
    2. =&GT;问题2:我做错了什么?

      以下是代码:

      #include <QApplication>
      #include <QFile>
      #include <QDebug>
      #include <QXmlQuery>
      #include <QXmlSerializer>
      #include <QXmlFormatter>
      #include <QBuffer>
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
          QString xmlContent =
                  "<nodes>"
                      "<node1 param='x1'>"
                          "<value>text1</value>"
                      "</node1>"
                      "<node2 param='x2'>"
                          "<value>text2</value>"
                      "</node2>"
                  "</nodes>";
      
          QBuffer device;
          device.setData(QByteArray(xmlContent.toUtf8().constData()));
          device.open(QIODevice::ReadOnly);
      
          QXmlQuery query;
          query.bindVariable("inputDocument", &device);
      
          // Extracting "text1"
          query.setQuery(QString("doc($inputDocument)/nodes/node1/value[text()]"));
      
          // Exracting "x1"
          //query.setQuery(QString("doc($inputDocument)/nodes/node1/@param"));
      
          // Output value
          QByteArray outArray;
          QBuffer buffer(&outArray);
          buffer.open(QIODevice::ReadWrite);
      
          QXmlSerializer serializer(query, &buffer);
          query.evaluateTo(&serializer);
      
          buffer.close();
          qWarning() << "Exracted value : " << QString::fromUtf8(outArray.constData());
      
          exit(0);
      
          return a.exec(&#41;;
      }
      

1 个答案:

答案 0 :(得分:0)

我目前正在使用QXmlQuery并遇到同样的问题。对于 text1

query.setQuery("doc($inputDocument)/nodes/node1/value/string()");
query.evaluateTo(&any_QString_variable);

会给你想要的东西。

对于属性 x1 ,你必须这样做:

query.evaluateTo(&any_QString_variable);

查询后,您必须存储某处的结果才能使用它。也许我误解了你的问题,但这些,给你你的价值观。