2013-08-01 42 views
0

我試圖檢查元素中的值是否包含特定模式。 比如我有以下一些要素:檢查至少有1個節點值是否與特定模式匹配

<message> 
     <locnr>A001</locnr> 
     <locnr>K301</locnr> 
     <locnr>Z310</locnr> 
     <locnr>B311</locnr> 
    </message> 

我想找到是否有至少1 locnr元素說:

  • 開始與'A'/「C '
  • 和第二字符是'0'/ '1'/ '2'

在上面的示例中,由於locnr的值爲'A001',消息通過測試的文件。

回答

1

以下XPath表達式應該做你想要什麼:

message[substring(locnr,1,1)='A' or substring(locnr,1,1)='C'] 
     [substring(locnr,2,1)="0" or substring(locnr,2,1)="1" or substring(locnr,2,1)="2"] 
-2

在我最近與XPath和XML文檔的經驗,我發現,XPath表達式更旨在幫助查找特定的節點,而不是分析值在他們內部舉行。當然,你可以過濾基於值返回的節點,但我相信(有人糾正我,如果我錯了),它限於簡單的相等或更大/小於數值。這與像一個語句來完成:

/bookstore/book[price>35.00]

這是直接從W3學校XPath語法頁面,都將返回一個有價的孩子,其價值更是對書的元素比如35.

如果我處於你的位置,我可能會使用XPath來獲取所有帶XPath的locnr元素,只需「locnr」,然後在返回的節點列表中運行一個循環。對於每個節點,您可以通過兩種方式獲取字符串的值。如果你知道這個元素是一個葉子,那麼.text將起作用,但如果它不是,那麼請注意,因爲.text返回節點及其後代的所有值。另一種方法是訪問節點的第一個子節點的nodeValue。喜歡的東西:

currentNode.childNodes [0] .nodeValue

,只需使用字符串的方法來提取您感興趣的人物,用條件來爲你的模式。

0

試試這個:

//message 
[ 
    count(locnr[starts-with(text(),'A') or starts-with(locnr/text(),'C')])>0 
    and 
     substring(locnr/text(),2,1) = '0' 
    or 
     substring(locnr/text(),2,1) = '1' 
    or 
     substring(locnr/text(),2,1) = '2' 
] 
2

如果您的XPath處理器支持XPath 2.0,使用正則表達式這一點。

/message[locnr[matches(., '^[AC][012]')]] 
相關問題