1

我想使用 XQuery 解析存储在 QString expected_xml 中的以下 xml(获取类型 ID 和测试输出等),

<?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"/>
  </FILE>
 </TEST_OUTPUT>
</TEST>

例如,我使用以下代码获取 Id,但这并没有给我任何东西。我错过了什么非常明显的东西吗?

   //Test Parsing
   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_TYPES");

   if(query.isValid())
   {
      QStringList values;
      query.evaluateTo(&values);
      qDebug() << values;
   }
4

1 回答 1

2

如果您需要 ID,则您的查询是错误的。它应该是:

    query.setQuery("doc($xmlByteArry)//TEST/TEST_TYPES/TEST_TYPE/@ID");

此查询返回属性的值。

附加信息:如果您的 Xml 查询中有错误,您可以设置 MessageHandler 来读取错误:

class MessageHandler: public QAbstractMessageHandler
{
    virtual void handleMessage(QtMsgType type,
        const QString &description,
        const QUrl &identifier,
        const QSourceLocation &sourceLocation)
    {
        qDebug() << QString("Xml Query Error: %1 at Line: %2 Character:")
            .arg(description).arg(sourceLocation.line()).arg(sourceLocation.column());
    }
};

这是一个将属性 ID 读取到 StringList 的小示例:

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

    QXmlQuery query;
    query.setMessageHandler(new MessageHandler());
    query.bindVariable("xmlByteArry", &device);
    query.setQuery("doc($xmlByteArry)//TEST/TEST_TYPES/TEST_TYPE/@ID");

    QStringList values;
    if(query.isValid())
    {
        QXmlResultItems result;
        query.evaluateTo(&result);

        QXmlItem XmlItem(result.next());

        while (!XmlItem.isNull()) 
        {
            if (XmlItem.isNode()) 
            {
                QXmlNodeModelIndex Index = XmlItem.toNodeModelIndex();
                values.append(Index.stringValue());
            }

            XmlItem = result.next();
        }
    }

    return true;
}

有关更多信息,请阅读 Qt XQuery 文档:这里

更新: 您可以使用以下查询获取 ID 的 TESTPATH 和 PATH:

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/@PATH ) "
        " else ()");

以编程方式设置 ID 值。

于 2014-08-05T07:27:33.470 回答