C++ query.evaluteTo适用于QStringList,但不适用于xml中的特定项
我尝试用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
<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);