Я использую tinyxpath-1.3.1. C/C++ в Linux. Когда я делаю поиск по xpath в документе, я не нахожу узлы, когда думаю, что должен.
Мой XML:
<data>
<event deviceId="25479545.5" interface="sensor-multilevel"
command="state" label="luminance" newValue="800"
oldValue="9" time="1412227484" />
</data>
Мое выражение xpath:
/data/event[@deviceId="25479545.5" and @interface="sensor-multilevel" and
@label="luminance" and @newValue>600 and @oldValue<10]
Если я беру oldValue
и использую ()
как это, то сравнение работает:
/data/event[(@deviceId="25479545.5" and @interface="sensor-multilevel") and
(@label="luminance" and @newValue>600)]
Существует ли ограничение на количество сравнений?
Что-нибудь особенное с преобразованием 600 в десятичный?
Нужно ли мне "" значение 600, похоже, работает в любом случае.
Любые идеи о том, как заставить его работать с атрибутом oldValue, включенным в выражение?
TinyXPath:
TiXmlNode * node = TinyXPath::XNp_xpath_node( root, expression.c_str() );
Спасибо Ларри
Похоже, в библиотеке tinyxpath есть некоторые ошибки....
Это работает для tinyxpath-1.3.1:
/data/event[((@deviceId="25479545.5" and @interface="sensor-multilevel") and
(@label="luminance" and @newValue>"600")) and (@oldValue<"10")]
чтобы скопировать их в окончательный набор из 2.
Или я просто конвертирую в libxml2.
Кажется, вы получаете сравнение строк здесь, а не числовое сравнение ("9"> "10" в алфавитном порядке). Это неверно в соответствии со спецификациями (как XPath 1.0, так и 2.0, хотя они встречаются по-разному).
Самый безопасный подход, вероятно, заключается в том, чтобы явно преобразовать число: write
number(@oldValue) < 10
oldValue
и неoldValue
использовать скобки?