Почему 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, он работает просто отлично. Вызов функции всегда возвращает правильное количество узлов. Кто-нибудь сталкивался с такой проблемой раньше?

PS: я знаю, что я не дал много подробностей по этой проблеме, но это огромный проект, и мне потребовались бы дни, чтобы объяснить все это. Так что это просто выстрел в темноте.

1 ответ

Решение

Используя gdb, я обнаружил, что с "count(/products/product)", как я изначально думал, не было проблем с анализом.

Проблема заключалась в том, что в моем проекте используется много разных библиотек. Одна из этих библиотек использовала версию tinyxml, отличную от той, которую использовал tinyxpath.

Когда я связал двоичный файл для класса из моего проекта, где tinyxpath не работал, я использовал следующую команду в моем make-файле:

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

ahttplib уже включал старую версию tinyxml. Таким образом, когда tinyxpath был связан, он связывался с библиотекой tinyxml, которая уже была включена в ahttplib, а не в свою собственную версию. Версия tinyxml от ahttplib и одна из tinyxpath были несовместимы.

Бинарный файл с классом из моего проекта, где tinyxpath работал нормально, включал только tinyxpath, поэтому проблемы там не возникало.

Простым решением было изменить порядок ссылок: tinxypath перед ahttplib. Правильный способ решения этой проблемы - заставить ahttplib и tinyxpath обращаться к одной и той же библиотеке tinyxml.

Другие вопросы по тегам