解析下面的任何XML时,为了获取PATH / TEST_PATH和ALIAS,
<TEST TEST_VERSION="14">
<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/File1.txt" TEST_TYPE_ID_REF="1">
<USED_BY TEST_PATH="C:/Files/File5.txt" ALIAS="Data"/>
</FILE>
</TEST_OUTPUT>
</TEST>
我写了一个像
这样的查询.....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 ()");
但问题是输出是随机的,即:我无法将输出关联到关系中。
我很乐意得到PATH,TEST_PATH和ALIAS相关的输出 像::
之类的东西"C:/Files/File2.txt", "C:/Files/File2.txt", "thisData"
"C:/Files/File2.txt", "C:/Files/File3.txt", "thatData"
"C:/Files/File1.txt", "C:/Files/File5.txt", "Data"
经过一番思考后我尝试像这样修改它
.....setQuery(
"for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
" for $y in $x/USED_BY "
" return if($x/@TEST_TYPE_ID_REF = 1) "
" then concat ($y/@TEST_PATH, ':::', $y/@ALIAS, ':::', $x/@PATH ) "
" else ()");
评估此查询时出现异常。任何提示为什么它无法识别XML?我使用以下代码(C ++ / Qt)
QString getParsedString()
{
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 ()");
query.setQuery("for $x in doc($xmlByteArry)//TEST/TEST_OUTPUT/FILE"
" for $y in $x/USED_BY "
" return if($x/@TEST_TYPE_ID_REF = 1) "
" then concat($y/@TEST_PATH,':::',$y/@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();
}
}
return values;
}