我正在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++;
奇怪的部分来了。如果我在Windows7上构建这个项目,它运行得很好。函数调用总是返回正确数量的节点。以前有人遇到过这种问题吗?
附言:我知道我没有给出这个问题的很多细节,但这是一个巨大的项目,我需要几天的时间才能解释清楚。所以这只是一个黑暗中的镜头。
通过使用gdb,我发现"count(/products/product)"没有解析问题,正如我最初所想的那样。
问题是我的项目使用了很多不同的库。其中一个库使用的tinyxml版本与tinyxpath使用的版本不同。
当我链接tinyxpath不起作用的项目中的类的二进制文件时,我在makefile中使用了以下命令:
g++ -o binary -lahttplib -ltinyxpath [...]
ahttplib已经包含了tinyxml的旧版本。因此,当tinyxpath链接到中时,它链接到的是已经从ahttplib中包含的tinyxml库,而不是它自己的版本。ahttplib中的tinyxml版本和tinyxpath中的版本不兼容。
在我的项目中,tinyxpath运行良好的类的二进制文件只包括tinyxpath,所以没有出现问题。
简单的解决方案是更改链接顺序:在ahttplib之前更改tinxypath。解决这个问题的正确方法是让ahttplib和tinyxmath引用同一个tinyxml库。