C++ query.evaluteTo适用于QStringList,但不适用于xml中的特定项

C++ query.evaluteTo适用于QStringList,但不适用于xml中的特定项,c++,qt,xml-parsing,C++,Qt,Xml Parsing,我尝试用xml为每种产品提供“优惠” 结构看起来像这样 <response> <results> <products> <product> <offers> <offer> <offer>//HERE IS A PROBLEM <product> <offers> <offer> &l

我尝试用xml为每种产品提供“优惠”

结构看起来像这样

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

因为我也有同样的问题,我在搜索解决方案时发现了这篇文章。 以下是对我有用的东西(QT5 Archlinux+KDE)

只需将
QXmlNamePool
添加到
QXmlQuery

    QXmlNamePool  m_namePool;
    QXmlQuery queryOffers(m_namePool);
    QXmlQuery query1(m_namePool); 
似乎是内部查询(从QXmlItem获取其fokus) 未正确设置其名称,因此无法识别属性名称(在本例中为@url)

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

    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();
}
    QXmlNamePool  m_namePool;
    QXmlQuery queryOffers(m_namePool);
    QXmlQuery query1(m_namePool);