Извлечение значений дочерних узлов с помощью QXmlItem как фокус QXmlQuery

Я пытался получить текстовые значения узлов из этого XML файла:

  <!DOCTYPE structure>
  <data>
   <x>
    <id>1</id>
    <nam>tytuł</nam>
    <tab>21</tab>
    <ind>5</ind>
    <pre>TY</pre>
    <khw>C.TY</khw>
   </x>
   <x>
    <id>2</id>
    <nam>autor</nam>
    <tab>21</tab>
    <ind>5</ind>
    <pre>FO</pre>
    <khw>C.FO</khw>
   </x>
   <x>
    <id>3</id>
    <nam>hasło korporatywne</nam>
    <tab>21</tab>
    <ind>5</ind>
    <pre>FN</pre>
    <khw>C.FN</khw>
   </x>
  </data>

То, что я хочу сделать, это получить каждый узел и его дочерние элементы и преобразовать их в QMap. У меня нет проблем с выборкой одиночного элемента, но когда дело доходит до выборки дочерних элементов путем установки результата QXmlQuery в качестве фокуса, QString, которым я оцениваю запрос дочернего узла, оказывается пустым. Я использую этот кусок кода:

QXmlResultItems results;
QFile structure("./structure.xml"); // xml file, as described earlier
structure.open(QFile::ReadOnly);

QXmlQuery query;
query.setFocus(&structure);
query.setQuery("data/x");
query.evaluateTo(&results);

QXmlItem next = results.next();
while(!next.isNull()) {
    qDebug() << next.toNodeModelIndex().stringValue(); // everything's fine. It prints contents of <x>'s child nodes
    QXmlQuery childQuery;
    QString r;
    childQuery.setFocus(next);
    childQuery.setQuery("./nam/text()"); // already tested: "/nam/text()", "/nam/string()", "x/nam/string()", "data/x/nam/string()" etc... still no luck.
    childQuery.evaluateTo(&r);
    qDebug() << r; // prints \n but it should print content of <nam> node.

    next = results.next();
}

Программное обеспечение, которое я использую: Qt 4.7.2 SDK непосредственно с сайта Qt, QtCreator 2.3.1 под Windows и Linux (без разницы в данном конкретном случае, результаты одинаковы). Я хочу быть уверен, что это проблема моего недостатка знаний, а не ошибка программного обеспечения, пожалуйста, помогите

7
задан Janek Królikowski 17 October 2011 в 15:38
поделиться