Преобразование QXmlItem в QtDomElement или подобное? - PullRequest
2 голосов
/ 12 марта 2010

Я анализирую довольно сложный XML-файл следующей структуры:

<root><br/>   ... <br/>   ...<br/>   <item> <br/>      <subitem id="1"/><br/>      <text><br/>         text1<br/>      </text><br/>   </item><br/>   <item><br/>      <subitem id="2"/><br/>      <text><br/>         text2<br/>      </text>   <br/>   </item><br/>      ...<br/>   <item><br/>      ...<br/>   </item><br/>   ...<br/></root>

Это довольно грубо, но я надеюсь, вы меня поняли.Меня в первую очередь интересуют узлы "item".Поэтому я написал следующий код (прямо из онлайн-руководства Qt):

QXmlQuery query;
query.setQuery("//item/");

QXmlResultItems result;
query.evaluateTo(&result);

QXmlItem item(result.next());
while (!item.isNull()) 
{
  if (item.isNode())
  {
      // WHAT DO I DO NOW?
  }
  item = result.next();
}

Теперь QXmlItem, по-видимому, представляет две концепции: литеральное значение (например, строку) или узел (чтоitem.isNode () делает).К сожалению, я не могу понять, как преобразовать QXmlItem во что-то, что снова сможет выполнять запросы.В частности, из приведенного выше примера я хотел бы получить атрибут «id» и текстовый элемент.Могу ли я сделать это, используя подход XQuery, или я далеко от базы?

Любой совет?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011

Вы можете использовать QXmlItem, чтобы изменить фокус вашего запроса. Например:

QXmlItem item(result.next());
while (!item.isNull()) 
{
  if (item.isNode())
  {
    query.setFocus(item);
    query.setQuery("./text/string()");
    QString text;
    query.evaluateTo(&text);
  }
  item = result.next();
}

будет извлекать <text> значение <item>.

2 голосов
/ 13 марта 2010

QXmlQuery - это один грязный кусок документации Qt, но я бы сказал, что вы пишете свой запрос, чтобы вернуть элементы, которые вам действительно нужны, т.е.

query.setQuery("//item/subitem | //item/text");

W3Schools имеет учебник по XPath , который может помочь

...