0

TinyXPath ライブラリと TinyXml を使用して次の xml を解析する Ubuntu でプロジェクトを構築しています。

<nodes>
    <node attribute1="1" attribute2="2" />
    <node attribute1="2" attribute2="3" />
    ...
    <node attribute1="10" attribute2="11" />
</nodes>

含まれているノード エントリの数を調べるために、以下を使用しています。

TinyXPath::i_xpath_int( xml_root,"count(/nodes/node)")

どうやら、この関数呼び出しを 1 つのオブジェクトで使用すると、実際のノード数である 10 が返されます。しかし、別のオブジェクト (別のクラス タイプ) で使用すると、常に 0 が返されます。両方のケースで xml_root が同じオブジェクトであり、両方のオブジェクトが同じアドレスを持っているかどうかを確認しました。内容を印刷すると、同じxmlが得られました。

代わりに、TinyXML を使用すると正しい結果が得られ、すべての属性にアクセスして正しい結果を得ることができます。次のコードは、正しい no_nodes を提供します。

for(node = xml_root->FirstChild(); node; node = node->NextSibling())
    no_nodes++;

ここに奇妙な部分があります。このプロジェクトを Windows 7 でビルドすると、問題なく動作します。関数呼び出しは、常に正しいノード数を返します。以前にこの種の問題に遭遇した人はいますか?

PS: この問題についてあまり詳細を述べていないことは承知していますが、これは巨大なプロジェクトであり、すべてを説明するには数日かかるでしょう。したがって、これは暗闇でのショットにすぎません。

4

1 に答える 1

2

gdb を使用すると、最初に考えたように、「count(/products/product)」に解析上の問題がないことがわかりました。

問題は、私のプロジェクトが多くの異なるライブラリを使用していることです。これらのライブラリの 1 つは、tinyxpath で使用されているものとは異なるバージョンの tinyxml を使用していました。

tinyxpath が機能しないプロジェクトからクラスのバイナリをリンクしたとき、makefile で次のコマンドを使用しました。

g++ -o binary -lahttplib -ltinyxpath [...]

ahttplib には、古いバージョンの tinyxml が既に含まれています。したがって、tinyxpath がリンクされると、独自のバージョンではなく、httplib から既に含まれている tinyxml ライブラリにリンクされます。ahttplib の tinyxml バージョンと tinyxpath の tinyxml バージョンは互換性がありませんでした。

tinyxpath が正常に動作した私のプロジェクトのクラスのバイナリには tinyxpath しか含まれていなかったため、問題は発生しませんでした。

簡単な解決策は、リンクの順序を変更することでした: httplib の前に tinxypath 。この問題を解決する正しい方法は、ahttplib と tinyxpath が同じ tinyxml ライブラリを参照するようにすることです。

于 2012-09-05T15:24:05.010 に答える