Qt 如何使用XPath解析此XML?
我想使用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>
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"