如何在另一个for循环中使用for循环使用XQuery?

时间:2014-08-06 09:16:40

标签: xquery

解析下面的任何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;
}

0 个答案:

没有答案