我正在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。:我知道我没有就这个问题给出很多具体细节,但这是一个庞大的项目,我需要几天的时间来解释这一切。所以这只是在黑暗中拍摄的。
答案 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库。