2015-12-04 124 views
0

我需要使用RapidXML讀取簡單的XML文件。我已經將XML文件加載到一個字符串變量並將其傳遞給解析器。我需要獲取所有節點的名稱和值,如果存在的話。 我的問題是以下值最終爲重複:使用RapidXML解析XML文件時獲取重複節點值

  • stepID->值
  • stepHeading1->值
  • stepText->值

這裏的描述該問題的圖片:

Image showing the problem

爲什麼米如果stepID,stepHeading1和stepText節點沒有任何子節點,y代碼會給我所有這些重複的值嗎?另外,爲什麼代碼中沒有給出重複的節點名稱,當節點值是這樣的?下面------------

<?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文件------------下面------------代碼

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進入一個單獨的子節點。

嘗試使用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