2015-08-27 3 views
0

Моего XML разобрать что-то вроде этого:QXmlStreamReader (Qt5): получить все вложенные элементы внутри тега

<posts> 
    <post> 
    <id>1234</id> 
    <file_url>/foo/bar</file_url> 
    </post> 
</posts> 

Теперь мне нужно вставить, для каждых детей post, его имени тега и содержания в QVariantMap, где ключ является тегом, а содержимое (текст) - это значение.

Кроме того, это то, что возвращает веб-API, поэтому I не может имена тегов hardcode (кроме «post»), поскольку результаты могут различаться в зависимости от того, какой вызов выполнен.

Мой код:

QXmlStreamReader reader; 
reader.addData(data); // data is a QByteArray obtained from the API call 
while(reader.readNextStartElement()) { 
     qDebug() << reader.name(); 
     if (reader.name() == "post") { 
      while(reader.readNextStartElement()) { 
       qDebug() << reader.name() << reader.text(); 
      } 
     } 
    } 

Что происходит, однако, что я получаю только "ID" и больше ничего. Насколько я понимаю из документации, это ожидаемое поведение, которое, однако, не то, что мне нужно.

Что мне делать, чтобы получить только теги между <post> и </post>?

ответ

2

Вместо использования reader.text() вы должны сообщить читателю XML перейти к следующему элементу с помощью reader.readElementText() или с помощью reader.skipCurrentElement(), если этот элемент не является тем, находясь в поиске.

QXmlStreamReader reader; 
reader.addData(data); // data is a QByteArray obtained from the API call 
while(reader.readNextStartElement()) { 
    qDebug() << reader.name(); 
    if (reader.name() == "post") { 
     while(reader.readNextStartElement()) { 
       qDebug() << reader.name() << reader.readElementText(); 
     } 
    } 
} 
+0

Я мог бы, если это будет необходимо, но я не хочу жёстко ищу тег, как я только что привел один пример, который использует «пост», но есть и другие, с различным субом-тегами. Мне нужно сделать это «пулеметный стиль», получив все возможные теги между началом и концом. EDIT: Я также заметил, что это останавливается при первом «id». – Einar

+0

В этом случае просто сделайте то, что вы делаете, но замените reader.text() на reader.readElementText(), отредактированный выше » –

+0

Ваша последняя версия работает. Благодаря! – Einar

Смежные вопросы