RapidXML дает пустые узлы CDATA

Я написал код ниже, чтобы получить значение узла CDATA, я получил имя узла, но значения пустые.

Я изменил флаги разбора на parse_full, но это тоже не сработало.

Если я вручную уберу «<! [CDATA [«and»]]> «из XML, он дает значение, как и ожидалось, но удалить его перед синтаксическим анализом не вариант.

Код:

#include <iostream>
#include <vector>
#include <sstream>
#include "rapidxml/rapidxml_utils.hpp"
using std::vector;
using std::stringstream;
using std::cout;
using std::endl;

int main(int argc, char* argv[]) {

rapidxml::file<> xmlFile("test.xml");
rapidxml::xml_document<> doc;
doc.parse<rapidxml::parse_full>(xmlFile.data());

rapidxml::xml_node<>* nodeFrame = doc.first_node()->first_node()->first_node();

cout << "BEGIN\n\n";

do {

cout << "name:  " << nodeFrame->first_node()->name() << "\n";
cout << "value: " << nodeFrame->first_node()->value() << "\n\n";} while( nodeFrame = nodeFrame->next_sibling() );

cout << "END\n\n";

return 0;
}

XML:

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0" xmlns:c="http://base.google.com/cns/1.0">
<itens>
<item>
<title><![CDATA[Title 1]]></title>
<g:id>34022</g:id>
<g:price>2173.00</g:price>
<g:sale_price>1070.00</g:sale_price>
</item>
<item>
<title><![CDATA[Title 2]]></title>
<g:id>34021</g:id>
<g:price>217.00</g:price>
<g:sale_price>1070.00</g:sale_price>
</item>
</itens>
</rss>

3

Решение

Когда вы используете CDATARapidXML анализирует это как отдельный узел «ниже» внешнего элемента в иерархии.

Ваш код правильно получает название, используя nodeFrame->first_node()->name(), но — потому что CDATA текст находится в отдельном элементе, вам нужно использовать это для извлечения значения:

cout << "value: " <<nodeFrame->first_node()->first_node()->value();

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector