2014-03-27 30 views
2

我們平時寫我們的搜索路徑在findnodes()功能如下的XPath的libxml可以是正則表達式類型

//parentNode[subNode/text() = 'CPUUSAGE']/subNode 

是什麼我想在這裏匹配文本的一部分,並找到所有的節點?

//parentNode[subNode/text() =~ '/CPUUSAGE'/]/subNode 

顯然,這是無效的XPATH ...

任何思考如何實現這一目標?

我知道我可以先找到節點,然後嘗試匹配textContent。但是我們可以直接在findnodes()中一次完成嗎?

回答

2

XPath 1.0(其中libxml實現)不包含對正則表達式的任何內置支持。在使用一個相當簡單的正則表達式你給的例子,你可以使用contains function來實現類似的結果:

//parentNode[subNode[contains(text(), 'CPUUSAGE')]]/subNode 

(順便說一句這是一個奇怪的表情 - 你可能真的要像//parentNode/subNode[contains(text(), 'CPUUSAGE')]但我意識到這僅僅是一個例子。)

還有一些其他string functions可以用於創建其他簡單的查詢。

您可以創建自己的自定義XPath函數來基於正則表達式過濾節點,實際上Perl Perl LibXML模塊的文檔包含example of doing just that

XPath 2.0確實支持使用正則表達式與group of string functions。除非你有一個不會太有用的XPath 2.0處理器。

0

XML::Twig在xpaths中支持正則表達式。

下面是我在回答中使用這太問題的XPath:Updating xml attribute value based on other with Perl

project[string(path) =~ /\bopensource\b/]/revision 

我還創建了第二個答案,這樣我可以用XML::LibXML如何可以用來解決同樣的問題實驗,在這種情況下,我只是遍歷所有項目,並手動進行了正則表達式過濾。