Qt 如何使用XPath解析此XML?

Qt 如何使用XPath解析此XML?,qt,xml-parsing,qt4,xquery,Qt,Xml Parsing,Qt4,Xquery,我想使用XPath解析以下XML。我使用这个查询: query.setQuery("doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE[@TEST_TYPE_ID_REF=1]"); 我想获取PATH、TEST_PATH和ALIAS中的值,所以我编写了一个代码来循环QXmlResultItems。但它似乎没有给我任何结果: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE TEST_XML>

我想使用XPath解析以下XML。我使用这个查询:

query.setQuery("doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE[@TEST_TYPE_ID_REF=1]");
我想获取PATH、TEST_PATH和ALIAS中的值,所以我编写了一个代码来循环QXmlResultItems。但它似乎没有给我任何结果:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TEST_XML>
<TEST TEST_VERSION="14">
 <TEST_TYPES>
  <TEST_TYPE ID="0"/>
  <TEST_TYPE ID="1"/>
 </TEST_TYPES>
 <TEST_QUERY_LIST PROP="0">
  <TEST_QUERY_FILE>"C:/Files/File.txt"</TEST_QUERY_FILE>
 </TEST_QUERY_LIST>
 <TEST_OUTPUT>
  <FILE PATH="C:/Files/File2.txt" TEST_TYPE_ID_REF="1">
   <USED_BY TEST_PATH="C:/Files/File2.txt" ALIAS="thisData"/>
   <USED_BY TEST_PATH="C:/Files/File3.txt" ALIAS="thatData"/>
  </FILE>
  <FILE PATH="C:/Files/File5.txt" TEST_TYPE_ID_REF="1">
   <USED_BY TEST_PATH="C:/Files/File4.txt" ALIAS="anotherData"/>
  </FILE>
  <FILE PATH="C:/Files/File2.txt" TEST_TYPE_ID_REF="0">
   <USED_BY TEST_PATH="C:/Files/File2.txt" ALIAS="thisData"/>
  </FILE>
 </TEST_OUTPUT>
</TEST>

“C:/Files/File.txt”
解析上述XML的C++代码:

   QByteArray xmlByteArry;
   QBuffer device(&xmlByteArry);
   device.setData(expected_xml.toUtf8());
   device.open(QIODevice::ReadOnly);

   QXmlQuery query;
   query.bindVariable("xmlByteArry", &device);
   query.setQuery("doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE[@TEST_TYPE_ID_REF=1]");

   QString values;
   if(query.isValid())
   {
      QXmlResultItems result;
      query.evaluateTo(&result);
      QXmlItem XmlItem(result.next());
      while (!XmlItem.isNull()) 
      {
         //Code to parse the Internal ones
         if(XmlItem.isAtomicValue())
         {
            //I hope some values will be atomic like ALIAS and TEST_PATH
            values.append(XmlItem.toAtomicValue().toString());
         }
         else if (XmlItem.isNode()) 
         {
            //I hope to get the FILE Node and USED_BY node but I dont see anything in the following stringValue.
            QXmlNodeModelIndex Index = XmlItem.toNodeModelIndex();
            values.append(Index.stringValue());
         }
         XmlItem = result.next();
      }
      qDebug() << values;
   }
QByteArray xmlbytarry;
QBuffer设备&xmlByteArry;
device.setData(应为_xml.toUtf8());
device.open(QIODevice::ReadOnly);
QXmlQuery查询;
bindVariable(“xmlByteArry”和设备);
setQuery(“doc($xmlByteArry)//TEST/TEST\u OUTPUT/FILE[@TEST\u TYPE\u ID\u REF=1]);
QString值;
if(query.isValid())
{
QXmlResultItems结果;
查询、评估和结果;
QXmlItem(result.next());
而(!XmlItem.isNull())
{
//用于解析内部代码的代码
if(XmlItem.isAtomicValue())
{
//我希望一些值将像ALIAS和TEST_PATH一样是原子的
append(XmlItem.toAtomicValue().toString());
}
else if(XmlItem.isNode())
{
//我希望获得文件节点并按节点使用,但我在下面的stringValue中没有看到任何内容。
QXmlNodeModelIndex Index=XmlItem.toNodeModelIndex();
append(Index.stringValue());
}
XmlItem=result.next();
}

qDebug()此查询应返回以下值:

... setQuery("for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
    " return if($x/@TEST_TYPE_ID_REF = 1) "
    " then ($x/USED_BY/@TEST_PATH, $x/USED_BY/@ALIAS, $x/@PATH ) "
    " else ()");
更新:

我使用以下代码来测试您的示例:

QString test7::XmlTree()
{
    return QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<!DOCTYPE TEST_XML>"
        "<TEST TEST_VERSION=\"14\">"
        "<TEST_TYPES>"
        "<TEST_TYPE ID=\"0\"/>"
        "<TEST_TYPE ID=\"1\"/>"
        "</TEST_TYPES>"
        "<TEST_QUERY_LIST PROP=\"0\">"
        "<TEST_QUERY_FILE>\"C:/Files/File.txt\"</TEST_QUERY_FILE>"
        "</TEST_QUERY_LIST>"
        "<TEST_OUTPUT>"
        "<FILE PATH=\"C:/Files/File2.txt\" TEST_TYPE_ID_REF=\"1\">"
        "<USED_BY TEST_PATH=\"C:/Files/File2.txt\" ALIAS=\"thisData\"/>"
        "<USED_BY TEST_PATH=\"C:/Files/File3.txt\" ALIAS=\"thatData\"/>"
        "</FILE>"
        "<FILE PATH=\"C:/Files/File5.txt\" TEST_TYPE_ID_REF=\"1\">"
        "<USED_BY TEST_PATH=\"C:/Files/File4.txt\" ALIAS=\"anotherData\"/>"
        "</FILE>"
        "<FILE PATH=\"C:/Files/File2.txt\" TEST_TYPE_ID_REF=\"0\">"
        "<USED_BY TEST_PATH=\"C:/Files/File2.txt\" ALIAS=\"thisData\"/>"
        "</FILE>"
        "</TEST_OUTPUT>"
        "</TEST>");
}

void test7::test()
{
    QByteArray xmlByteArry;
    QBuffer device(&xmlByteArry);
    device.setData(XmlTree().toUtf8());
    device.open(QIODevice::ReadOnly);

    QXmlQuery query;
    query.bindVariable("xmlByteArry", &device);
    query.setQuery("for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
        " return if($x/@TEST_TYPE_ID_REF = 1) "
        " then ($x/USED_BY/@TEST_PATH, $x/USED_BY/@ALIAS, $x/@PATH ) "
        " else ()");

    QString values;
    if(query.isValid())
    {
        QXmlResultItems result;
        query.evaluateTo(&result);
        QXmlItem XmlItem(result.next());
        while (!XmlItem.isNull()) 
        {
            //Code to parse the Internal ones
            if(XmlItem.isAtomicValue())
            {
                //I hope some values will be atomic like ALIAS and TEST_PATH
                values.append(XmlItem.toAtomicValue().toString());
            }
            else if (XmlItem.isNode()) 
            {
                //I hope to get the FILE Node and USED_BY node but I dont see anything in the following stringValue.
                QXmlNodeModelIndex Index = XmlItem.toNodeModelIndex();
                values.append(Index.stringValue());
            }
            XmlItem = result.next();
        }
        qDebug() << values;
    }
}

此参数在求值=>QWARN:QString::arg:缺少参数时引发错误:“Xml查询错误:我用你的代码和你的Xml尝试了一下,它工作了。上面的Xml正确吗?哦,是的,它工作了。很抱歉,我的代码中有一个错误。有没有一种方法可以使输出按顺序进行。现在它是随机的,没有真正的方法来确定什么与什么相关。例如Query.setQuery(“For$x in doc($xmlByteArry))//$x中$y的TEST/TEST_输出/文件“/USED_BY”“return if($x/@TEST_TYPE_ID_REF=1)”,然后concat($y/@TEST_PATH,'::',$y/@ALIAS,'::',$x/@PATH)”“else()”;但是它不正确,它为USED_BY的两个实例抛出错误。
"C:/Files/File2.txtC:/Files/File3.txtthisDatathatDataC:/Files/File2.txtC:/Files/File4.txtanotherDataC:/Files/File5.txt"