【问题标题】:Not able to parse this QString(in XML format) using XQuery无法使用 XQuery 解析此 QString(XML 格式)
【发布时间】:2014-08-05 06:23:37
【问题描述】:

我想使用 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;
   }

【问题讨论】:

  • 请添加来自QBuffer::openQXmlQuery::values的退货状态检查。

标签: qt xquery qtxml


【解决方案1】:

如果您需要 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 文档:here

更新: 您可以使用以下查询获取 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 值。

【讨论】:

  • 感谢您的回答。如何根据 TEST_TYPE_ID_REF @Matthias 的值获取 PATH 和 TEST_PATH 的值?
猜你喜欢
  • 2016-08-19
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多