2012-09-04 61 views
0

我建立一个项目在Ubuntu中,我使用TinyXPath库TinyXml的一起解析以下XML:为什么TinyXPath在两个不同的类中调用时为同一个对象提供不同的结果?

<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

难道你不能进入'i_xpath_int'并查看它出错的地方吗?此外,在一个平台/地点而不是另一个平台上工作的东西是未定义行为的强烈指标。 – Xeo

+0

问题是,在Windows上,我的项目是一个服务,而在Linux上它是一个守护进程。我可以像其他程序一样调试守护进程吗?如果可以,我应该用什么来调试? – Nikopol

+1

如果我没有弄错,你应该可以简单地将一个调试器附加到正在运行的进程中。 – Xeo

回答

2

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

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

当我挂的二进制文件从我的项目所在班级tinyxpath没有工作,我在我的Makefile中下面的命令:

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

ahttplib已经包含的TinyXML的旧版本。所以,当tinyxpath被链接时,它会链接到已经包含在ahttplib中的tinyxml库,而不是它自己的版本。 ahttplib的tinyxml版本和tinyxpath的版本是不兼容的。

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

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

+0

很好的发现:)链接顺序的确很重要 – Viet

相关问题