Почему 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.