2014-10-06 59 views
0

我正在使用tinyxpath-1.3.1。 Linux上的C/C++。当我在文档上进行xpath搜索时,我认为我应该找不到节点。在tinyxpath中给出错误匹配和不匹配的属性比较

我的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&gt;600 and @oldValue&lt;10] 

如果我参加了oldValue并使用()这样的比较工作:

/data/event[(@deviceId="25479545.5" and @interface="sensor-multilevel") and 
      (@label="luminance" and @newValue&gt;600)] 

有一些限制比较的数量?

将600转换为小数的任何特殊情况?

我需要“”600的价值,它似乎无论如何工作。

关于如何使它与表达式中包含的oldValue属性一起工作的任何想法?

TinyXPath电话:

TiXmlNode * node = TinyXPath::XNp_xpath_node(root, expression.c_str()); 

感谢 拉里

+0

如果你忽略'oldValue'而不使用括号会发生什么? – 2014-10-06 22:22:39

+0

如果我遗漏了oldValue并且没有使用parnethesis,它将无法匹配。 – 2014-10-06 22:27:14

+0

我刚刚在http://www.freeformatter.com/xpath-tester.html上试过了你的xpath表达式。它只有在我用'<' and '>'代替'<'和'>'代码时才有效。你可以试试吗? – 2014-10-06 22:36:25

回答

0

貌似tinyxpath库有一些错误....

这适用于tinyxpath-1.3.1:

/data/event[((@deviceId="25479545.5" and @interface="sensor-multilevel") and 
      (@label="luminance" and @newValue&gt;"600")) and (@oldValue&lt;"10")] 

括号中需要这些基团在最后一组的2

或者我只是转换为使用libxml2。

0

你似乎及彼字符串比较,而不是数值比较( “9”> “10” 按字母顺序)。根据规范,这是不正确的(XPath 1.0和2.0,尽管它们以相当不同的方式到达那里)。

安全的做法可能是显式转换为一个数字:写

number(@oldValue) &lt; 10 
+0

这可能是真的,如果我使用的库实际上工作。但是当我尝试使用数字函数时,它给了我执行错误。我有一种感觉,我使用的图书馆不支持它。 – 2014-10-07 15:03:17

+0

对不起,我现在查了tinyxpath,看起来它根本不是xpath,只是他们自己发明的一个子集。因此将其标记为XPath问题可能是一个错误。 – 2014-10-07 16:46:45