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

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

0

Решение

Используя 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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]