2015-12-04 4 views
0

Мне нужно прочитать простой XML-файл с использованием RapidXML. Я загрузил XML-файл в строковую переменную и передал его в синтаксический анализатор. Мне нужно получить все имена и значения узлов, если они существуют. Моя проблема заключается в том, что следующие значения в конечном итоге как дублирующий:Получение повторяющихся значений узлов при анализе XML-файла с помощью RapidXML

  • stepID-> Значение
  • stepHeading1-> Значение
  • stepText-> Значение

Вот картинка с описанием проблемы:

Image showing the problem

Почему м y code дают мне все эти дублированные значения, если у узлов stepID, stepHeading1 и stepText нет дочерних узлов? Кроме того, почему код не дает мне дубликаты имен узлов, когда значения узла оказываются такими?

------------ файл XML ниже ------------

<?xml version="1.0" encoding="UTF-8"?> 
<game> 
    <step> 
     <stepID>Name</stepID> 
     <stepHeading1>Title1</stepHeading1> 
     <stepHeading2></stepHeading2> 
     <stepHeading3></stepHeading3> 
     <stepHeading4></stepHeading4> 
     <stepHeading5></stepHeading5> 
     <stepHeading6></stepHeading6> 
     <stepText>First Step First Step First Step </stepText> 
     <link> 
      <linkStepID>First Link Name</linkStepID> 
      <linkText>First Link Text</linkText> 
     </link> 
    </step> 
</game> 

------------ код ниже ------------

xml_document<>doc; 
doc.parse<0>(&(dataForParser1.getLoadedXMLfile())[0]); 

xml_node<> *rootNode = doc.first_node(); 
xml_node <> *pStep = 0; 
xml_node <> *pDiff = 0; 
xml_node <> *pLink = 0; 

for (xml_node <> *pStep = rootNode->first_node("step"); pStep; pStep = pStep->next_sibling()) 
{ 
    cout << pStep->name() << " " << pStep->value() << endl; 

    for (xml_node <> *pDiff = pStep->first_node(); pDiff; pDiff = pDiff->next_sibling()) 
    { 
     cout << pDiff->name() << " " << pDiff->value() << endl; 

     for (xml_node <> *pLink = pDiff->first_node(); pLink; pLink = pLink->next_sibling()) 
     { 
      cout << pLink->name() << " " << pLink->value() << endl; 
     } 
    } 
    cout << endl << endl; 
} 
+0

исправить форматирование кода –

ответ

0

проблема у вас возникают из-за флага, который вы претендуете к методу parse:

doc.parse<0>(&(dataForParser1.getLoadedXMLfile())[0]); 

Когда 0 используется здесь, данные узла будут conv erted в отдельный дочерний узел.

Попробуйте использовать parse<1>, а данные должны оставаться в родительском узле.

Эта информация может быть найдена в файле rapidxml.hpp, среди других флагов:

//! Parse flag instructing the parser to not create data nodes. 
//! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. 
//! Can be combined with other flags by use of | operator. 
//! <br><br> 
//! See xml_document::parse() function. 
const int parse_no_data_nodes = 0x1;   
+0

Это работает! Спасибо Mir178249 за помощь и редактирование моего сообщения :) – wojtek

+0

@wojtek: Отлично. Рад был помочь! – 01F0