0

編集:私はそれを理解しました、これの下半分に向かって見てください

質問をする前に、私は TBXML と RapidXML の使用に成功したことを述べておきます。具体的には、Rapid はこのまったく同じドキュメントを正常に解析しました。XML の読み取りと値の割り当てに精通しています。

とはいえ、TinyXML と Cocos は android にコンパイルされるため、良い組み合わせのようです。ノードを1回下に移動し、値を出力して、自分がどこにいるのかを確認できます...問題は次のとおりです。

node = node->nextSibling();

常に false を返します。私はこれを行うことができることを学びました:

node->Parent()->NextSibling(); これにより、代わりに次の兄弟が得られます。しかし、ここに問題があります:

ParentNode->FirstChild() は、そのツリーの最初の要素を返します。しかし、ParentNode->NextSibling() を呼び出すと、何らかの理由で兄弟へのポインターが返されますが、ツリーの 1 レベル上にあることを除きます。

これは、ループを半悪夢にするでしょう。

私はhttp://grinninglizard.com/tinyxml2docs/classtinyxml2_1_1_x_m_l_node.htmlを精査して、ノードまたは要素スタイル (例: NextSiblingElement() ) の使用の違いを見つけていますが、せいぜい 1 回のループで失敗するか、単にクラッシュ。

このパーサーは他のパーサーのように機能しないか、規約が間違っています。どこにいるのかを確認するためにどこにでも cout を配置しましたが、最初の実行は問題ないようです。具体的には、NextSibling が問題を引き起こしています。私は、彼らが「使用するつもり」のツリー構造を知らないだけだと思います。

これは今のところ私のネストされたループです:

            for( node = node->FirstChild(); node; node = node->NextSibling() )  {
            cout << endl << node->Parent()->Value();

            for( tempElement = node->FirstChildElement(); tempNode; tempElement = tempElement->NextSibling() ) {
                //assign inner values 
                }
           //take the inner values and assign them to an object
            }

したがって、私のコードは兄弟要素をトラバースするためのすべての提案に一致しますが、失敗しています。他のすべてのシステムで 30 分で行ったことは何時間もかかっているため、これを使用したことがある人の助けを借りることができます。

また、「彼らのやり方」が理解されると、より理にかなっていると確信していますが、インターネット上でこれを行う実際の例を見つけることができません. 私が持っているサンプルコードを示唆するものはたくさんあります(動作していません)。

ほとんどの場合、TinyXML はノードと値を見つけます。タイプを取得するには node->Parent()->Value() を使用する必要があることを覚えている場合は、ツリー内のどこにいるのかがわかりません。あまりにもハード。

キックのために、これが機能している負荷です:

    if (doc.LoadFile(xmlFilePath.c_str()) == XML_SUCCESS)
{
    XMLNode *node = doc.RootElement();
    node = node->FirstChild(); //root 
 //....

ご協力ありがとうございます。少なくとも現時点では、将来の質問者にとって有効な回答が得られる唯一の TinyXML2 の質問です。


編集:まだ答えられませんが、わかりました:

の愛のために...私は何か間違ったことをしているといいのですが、あなたがこれをしているなら、このパターンに注意してください.

注: ノードはルートを指します。

基本的に、NextSibling は親の関数であると考えてください。ここでは、「次の人物」を配置しています。

これまでのご訪問ありがとうございます。これは少なくとも 6 つの項目 (外側の項目、イェーイ!) をトラバースするので、私が今抱えているバグは私自身のものであると確信しています。

他の誰かがツリーを動的にトラバースする必要がある場合、これは誰かを助けるはずです。

       TiXmlNode * subNode = node->FirstChild();

    for(subNode = node ; subNode; subNode = subNode->Parent()->NextSibling()) 
    {
        subNode = subNode->FirstChild();
    cout << endl << "Parent " << subNode->Parent()->Value() << endl;

        for( tempNode = subNode; tempNode; tempNode = tempNode->Parent()->NextSibling() )
        {
            tempNode = tempNode->FirstChild();
4

1 に答える 1

1

重要なのは次の行です。基本的に、NextSibling を親の関数と考えてください。ここで、「次は誰ですか」をレイアウトします。

私が以前に使用したすべての XML パーサーは「現在のノードの兄弟」を意味しますが、TinyXML は「子の兄弟」と言っています。

慣れると完全に自然に思えますが、それでもクラッシュ ループに陥ります。

サンプルコードは投稿の下半分にあります。この回答の存在は、そのようなコメントで説明されています。

またね

于 2012-05-31T17:09:41.883 に答える