Я строю проект на 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, он работает просто отлично. Вызов функции всегда возвращает правильное количество узлов. Кто-нибудь сталкивался с такой проблемой раньше?
П.С .: Я знаю, что я не дал много подробностей по этой проблеме, но это огромный проект, и мне потребовались бы дни, чтобы все это объяснить. Так что это всего лишь выстрел в темноте.
Используя 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.
Других решений пока нет …