2014-10-06 57 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