c++ - query.evaluteTo 适用于 QStringList 但不适用于 xml 中的特定项目

标签 c++ qt xml-parsing

我尝试在 xml 中为每个产品获取“报价”。

结构是这样的

<response>
 <results>
  <products>
   <product>
     <offers>
       <offer>
       <offer>//HERE IS A PROBLEM
   <product>
     <offers>
       <offer>
       <offer>

报价看起来像这样:

 <offer price_retail="10.99" percent_off="23.02" merchant="101" currency_iso="USD" price_merchant="8.46" image_url_large="" description="Description " name="111 Musician's Gear T" id="2822961" url="http://specificlink.com"/>

问题是我可以将所有值检索到 QStringList 但是 我无法像 @price_retail/string()

这样分隔变量

我会发布我的代码:

    QXmlQuery queryOffers;
    QXmlQuery query1;
    query1.bindVariable("mySearch", &searchXml);
    query1.setQuery("declare variable $mySearch external;doc($mySearch)/response/results/products/product");

     QXmlResultItems items;
     query1.evaluateTo(&items);
     QXmlItem item( items.next() );

     while( !item.isNull() )
         {
             query1.setFocus(item);

             QString prodDesc;
             query1.setQuery("@description/string()");
             query1.evaluateTo(&prodDesc);

             QXmlResultItems itemsOffers;
             query1.setQuery("offers/offer");
             query1.evaluateTo(&itemsOffers);

             QXmlItem offer( itemsOffers.next() );

             while(!offer.isNull()){

                 QString offerUrl;
                 QString offerList;

                 queryOffers.setFocus(offer);

                   queryOffers.setQuery("@*/string()");
                   queryOffers.evaluateTo(&offerList);
                   qDebug()<<offerList;  //This returns all values
                   queryOffers.setQuery("@url/string()");
                   queryOffers.evaluateTo(&offerUrl);
                   qDebug()<<offerUrl; //this returns empty

                 offer = itemsOffers.next();
             }




             item = items.next();
}

最佳答案

由于我遇到了同样的问题,所以我在搜索解决方案时找到了这篇文章。 这是对我有用的 (QT5 Archlinux+KDE)

只需添加一个QXmlNamePoolQXmlQuery:

    QXmlNamePool  m_namePool;
    QXmlQuery queryOffers(m_namePool);
    QXmlQuery query1(m_namePool); 

似乎是内部查询(它从 QXmlItem 获取它的焦点) 没有正确设置其名称,因此无法识别属性名称(在本例中为@url)。

这可能与 Qt-Doc 中的一点有关,即当您稍后要在程序中比较名称时,您应该保留 QXmlNamePool

关于c++ - query.evaluteTo 适用于 QStringList 但不适用于 xml 中的特定项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160391/

相关文章:

c++ - T declval() 而不是 T && declval() for common_type

c++ - 构造 do while 循环来处理帐号不工作 C++

c++ - 为什么这个重载函数是模棱两可的?

c++ - Qt 布局 - 在调整大小时保持小部件纵横比

android - 你如何在 android 中解析嵌入在它们自身中的 XML 标签?

Delphi - 使用 NativeXML 迭代 XML 数据集

c++ - C strings vs const char* 让我感到困惑......请帮忙

c++ - 如何在Qt 中的网格布局中添加滚动条?

xml - 在go中遍历xml

c++ - 对指向自定义对象的指针的 QVector 进行排序