2016-03-26 10 views
0

を重視しているdocは私のXMLデータpugiXMLが同じ親が

doc.child("level1").child("level2").child("hero2") であると仮定し、

<level1> 
    <level2> 
      <hero1> 
      </hero1> 
    </level2> 
    <level2> 
      <hero2> 
      </hero2> 
    </level2> 
</level1> 

は、今私はhero2にアクセスしたいが、私はやるとき続くように私のXMLがある子を検索しますfalseを返します。つまり、hero2が見つかりませんでした。どうすればそれを見つけることができますか?

答えて

1

あなたのXMLファイルを考慮してください。お問い合わせの際:

doc.child("level1").child("level2").child("hero2"); 

をそれと同等です:

element1 = doc.child("level1").child("level2"); 
    element = element1.child("hero2"); 

は見てみましょう:

pugi::xml_node element1 = doc.child("level1").child("level2"); 
// Element 1 gives you first node "level2" 

// Element 2 does not have child ("hero2") so the call will return NULL 
pugi::xml_node element2 = element1.child("hero2"); // element2 is NULL 

// Element 2 has a child "hero1" 
// So you can get it as: 
pugi::xml_node element2child_hero1 = element1.child("hero1"); // 

しかし、あなたは "HERO2" ではない "hero1" を取得したいです。

特定のファイルの解決策の1つを以下に示します。 ループのためのザ・「はHERO2」までのすべての兄弟を経由するが発見された:

int findHero2(const char *file) 
{ 
    pugi::xml_document doc; 
    if (!doc.load_file(file)) return -1; 

    pugi::xml_node level1 = doc.child("level1"); 

    for (pugi::xml_node level2 = level1.first_child(); level2; level2 = level2.next_sibling()) 
    { 
     pugi::xml_node node = level2.child("hero2"); 
     if(node!=NULL) 
     { 
      // I have found "hero2" node 
      // ... 
      return 0; // success 
     } 
    } 

    return -2; // no "hero2" 
} 
0

アルゴリズムの観点に答えるために:あなたの(潜在的に)場合は、同じ名前を持ついくつかの子供を持って、first_child(name)next_sibling(name)を使用してそれらを反復処理します。