0

したがって、RapidXMLでは、ファイルをループして、いくつかのtilesetノードからデータを取得しようとしています。

rapidxml::xml_node<> *root_node = doc.first_node("map");
for(rapidxml::xml_node<> *tileset = root_node->first_node("tileset");
    tileset != 0; tileset = tileset->next_sibling("tileset"))
{
    // Iteration stuff...

あなたはおそらく、何が問題なのかと言っているのですか?さて、RapidXMLでは、next_sibling()関数はオプションで名前と一致します。

xml_node<Ch>* next_sibling(const Ch *name=0, std::size_t name_size=0, bool
   case_sensitive=true) const;

Gets next sibling node, optionally matching node name. Behaviour is undefined 
   if node has no parent. Use parent() to test if node has a parent.

したがって、その名前のノードが見つからない場合は、関係なく次の兄弟を返すだけです。これは私のプログラムの問題であり、余分な反復は必要ありません。これはバカだと思いますが、何でも。ノードを反復処理するだけにする方法はありますか?tileset

4

2 に答える 2

2

「オプションで一致するノード名」-パラメータのようにオプションです。名前文字列を渡しても見つからない場合は、戻り値がゼロになります。

xml_node<Ch> *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
{
    assert(this->m_parent);     // Cannot query for siblings if node has no parent
    if (name)
    {
        if (name_size == 0)
            name_size = internal::measure(name);
        for (xml_node<Ch> *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling)
            if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))
                return sibling;
        return 0;
    }
    else
        return m_next_sibling;
}
于 2013-03-02T02:35:10.863 に答える
0

私もこの問題を抱えていたので、この小さな変更を回避策として使用しました。これは意図したとおりに機能します。

rapidxml::xml_node<> *root_node = doc.first_node("map");
for(rapidxml::xml_node<> *tileset = root_node->first_node("tileset");
    tileset != 0;
    tileset = tileset->next_sibling())
{
    if(strcmp(tileset->name(), "tileset")!=0)
        continue;

    //TODO: the usual loop contents
}
于 2015-12-10T11:38:38.810 に答える