2017-11-08 14 views
1

xmlファイル:Rapidxml横断ノード

<top> 
    <name>hanhao</name> 
    <age>18</age> 
<!-- 
    node name : name 
    node value : hanhao 

    node name : age 
    node value : 18 
--> 
</top> 

私のcppファイル:

#include<iostream> 
#include"rapidxml/rapidxml.hpp" 
#include"rapidxml/rapidxml_print.hpp" 
#include"rapidxml/rapidxml_utils.hpp" 
using namespace std; 
using namespace rapidxml; 
void handlenode(xml_node<> *node){ 
    for(node = node -> first_node(); node != NULL; node = node -> next_sibling()){ 
     cout<<node -> name() <<" 's value is : "<<node->value() <<endl; 
     handlenode(node); 
    } 
} 
int main(){ 
    char xmldoc[] = "demo.xml"; 
    file<> file(xmldoc); 
    xml_document<> doc; 
    doc.parse<parse_comment_nodes>(file.data()); 
    xml_node<> *node = doc.first_node(); 
    handlenode(node); 
    doc.allocate_node(node_element,"",node->value()); 
    return 0; 
} 

予想される出力は次のようになります。

名前の値は次のとおりです。hanhao

年齢の値は:18です

が、実際の出力は、次のとおりです。

名前の値は次のとおりです。hanhao

の値は次のとおりです。hanhao

年齢の値は次のとおりです。18

の値は次のとおりです。18

の値は次のとおりです。

ノード名:名前

ノード値:hanhao

ノード名:年齢

ノード値:18

なぜこの問題が発生するのか教えていただけますか?

答えて

2

問題は、すべてのノードがそのタイプを持ち、すべての種類のノード(最後のコメントを含む)を処理しているということです。あなたがそう、唯一node_elementに対処したいよう に見えます:

void handlenode(xml_node<> *node){ 
    for(node = node -> first_node(); node != NULL; node = node -> next_sibling()){ 

     if(node->type() == node_element) //chek node type 
     { 
     cout<<node -> name() <<" 's value is : "<<node->value() << endl; 
     handlenode(node); 
     } 
    } 
} 

これは、予想される出力が得られるはずです。

+0

あなたは@HanHaoと@paoloの両方が新しいと思われるので、ここで[ツアー]をすばやく表示してください。コメントはチャットルームではなく、そのチャットルームがあります。簡単にアップボートして、良い答えを受け入れていただきありがとうございます。これは、良い答えに対する評判を得ることであり、またここでの品質を保証することです。あなたの参加に感謝します。 – inetphantom