3

XML パーサーとして Tiny XML を採用しています。XML ファイルからパレットを取得するコードを作成しており、次のようなビジター関数を作成しています。

PALETTE_PARSER::VisitEnter( const TiXmlElement& Element, const TiXmlAttribute* First Attribute)
{
    if( Element.ValueStr() == "palette" )
    {
        AddPalette( Element );
        return( true );
    }
    else
    {
        return( false );
    }
}

驚いたことに、これが最初の要素を解析してpalette停止したことがわかりました。確認したところ、ドキュメントには

Visit メソッドから「true」を返すと、再帰的な解析が続行されます。false を返すと、このノードの子またはその兄弟は訪問されません。

子供を解析しないのは理にかなっていますが、兄弟は奇妙に思えます。この動作の理由は何ですか? 私がやりたいことをさせる方法はありますか?

つまり、私はパレット要素だけに興味がありますが、それらの要素が複数ある可能性があります (他の要素も同様です)。すべてのパレットを見つけながら、再帰的に処理するのではなく、false を返して他の要素の種類をスキップしたかったのです。したがって、他のすべてを完全に無視して、パレット要素のみにアクセスする方法を探していると思います。

4

1 に答える 1

1

この動作の理由は何ですか?

目的は、ノードのツリーを再帰的に検索し、探しているものが見つかったらすぐに停止できるようにすることです。

私はパレット要素だけに興味がありますが、それらの要素が複数ある可能性があります(他の要素も同様です)...だから、他のすべてを完全に無視しながら、パレット要素だけにアクセスする方法を探していると思います。

さらなる議論は、すべての<palette>要素がツリー内の特定のノードの子であることを意味します。

Visit関心のあるノード(<palette>この場合は要素)が任意の深さで見つかる可能性があるという仮定の下で、(サブ)ツリー全体を調べるためのものです。

そうでない場合、それは仕事のためのツールではありません。

FirstChild/ LastChild/ /などを使用できますIterateChildren。メンバー関数を使用して、すべての要素を含むノードの子を反復処理し、<palette>実際に (検査時に) 要素であるノードで必要なことは何でも行い、他のノードを<palette>無視します。

于 2011-06-09T00:32:53.957 に答える