0

我正在 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 上构建这个项目,它工作得很好。函数调用总是返回正确数量的节点。有没有人遇到过这种问题?

PS:我知道我没有就这个问题给出很多细节,但这是一个巨大的项目,我需要几天时间来解释它。所以这只是在黑暗中的一个镜头。

4

1 回答 1

2

通过使用 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。解决这个问题的正确方法是让 httplib 和 tinyxpath 引用同一个 tinyxml 库。

于 2012-09-05T15:24:05.010 回答