为什么TinyXPath在两个不同的类中调用时会为同一个对象提供不同的结果?

时间:2012-09-04 12:23:00

标签: c++ xml linux tinyxml tinyxpath

我正在Ubuntu上构建一个项目,我正在使用TinyXPath库和TinyXml来解析以下xml:

<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)")

显然,在一个对象中使用此函数调用返回实际的节点数,10;但是在另一个对象(一个不同的类类型)中使用它,它总是返回0.我检查过两个情况下xml_root是否是同一个对象,并且两个对象具有相同的地址。打印内容给了我相同的xml。

相反,如果我使用TinyXML,我会得到正确的结果,我甚至可以访问所有的属性并获得正确的结果。以下代码给出了正确的no_nodes:

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

这是一个奇怪的部分。如果我在Windows 7上构建这个项目,它的工作正常。函数调用始终返回正确数量的节点。有没有人遇到过这种问题?

P.S。:我知道我没有就这个问题给出很多具体细节,但这是一个庞大的项目,我需要几天的时间来解释这一切。所以这只是在黑暗中拍摄的。

1 个答案:

答案 0 :(得分:2)

通过使用gdb,我发现“count(/ products / product)”没有解析问题,正如我最初想的那样。

问题是我的项目使用了很多不同的库。其中一个库使用了tinyxpath使用的tinyxml的不同版本。

当我从我的项目中链接该类的二进制文件时,其中tinyxpath不起作用,我在makefile中使用了以下命令:

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

ahttplib已经包含了旧版本的tinyxml。因此,当链接tinyxpath时,它链接到已经包含在ahttplib中的tinyxml库,而不是它自己的版本。来自ahttplib的tinyxml版本和来自tinyxpath的版本是不兼容的。

我的项目中的类的二进制文件,其中tinyxpath正常工作只包括tinyxpath,所以问题没有发生在那里。

简单的解决方案是更改链接顺序:ahttplib之前的tinxypath。 解决这个问题的正确方法是使ahttplib和tinyxpath引用相同的tinyxml库。