2016-07-30 65 views
0

我有一個XML文件,該文件是這樣的:XPath表達式來捕捉多個值

<directory name="/MyServices/MySearchKey" read="true" write="true" show="true" exec="true" del="true" dir="true" reference="true" list="true"> 
    <Access xmlns:func="http://exslt.org/functions"> 
    <r>on</r> 
    <w>on</w> 
    <a>on</a> 
    <d>on</d> 
    <x>on</x> 
    </Access> 
    <directory name="/MyServices/MySearchKey/anything_else" read="true" write="true" show="true" exec="true" del="true" dir="true" reference="true" list="true"> 
    <Access xmlns:func="http://exslt.org/functions"> 
     <r>on</r> 
     <w>on</w> 
     <a>on</a> 
     <d>on</d> 
     <x>on</x> 
    </Access> 
    <file name="myfile_1"> 
     <size>5353</size> 
     <modified>2016-05-20 00:39:48</modified> 
     <Access xmlns:func="http://exslt.org/functions"> 
     <r>on</r> 
     <w>on</w> 
     <a>on</a> 
     <d>on</d> 
     <x>on</x> 
     </Access> 
    </file> 
    </directory> 
</directory> 

我想寫一個獨特的XPath表達式將捕獲:

  1. name值任何directory在目錄名稱中有MySearchKey
  2. name任何file的值,它位於包含MySearchKey的目錄節點中目錄名

當然,也有可能是目錄W的名字/ O MySearchKey,我沒有對他們的任何興趣,也不在其下的文件。 我需要過濾裏面

包含MySearchKey的目錄和任何文件在這個例子中,輸出將如下所示:

directory name="/MyServices/MySearchKey" 
directory name="/MyServices/MySearchKey/anything_else" 
directory name="/MyServices/MySearchKey/anything_else/V1" 
file name="myfile_1" 

到目前爲止,我能寫//directory[contains(@name, '/ondisk/')]/@name捕獲顯示目錄名,但我不知道如何添加它們包含的文件。

如何在同一個XPath表達式中添加文件名?

問候

回答

1

你可以試試下面的代碼:

//directory[contains(@name, '/MySearchKey')]/(@name | file/@name) 

或XPath 1.0中:

//directory[contains(@name, '/MySearchKey')]/@name | 
//directory[contains(@name, '/MySearchKey')]/file/@name 
+0

我 「的XPath錯誤:無效的表達式」 指向最後'(' PS:對於測試建議,我用xmllint運行它(以防它在語法上有所不同) – Renato

+0

奇怪,我在這裏測試了http://www.xpathtester.com/xpath並且它工作正常 – arop

+0

我使用xmllint運行它(以防它在語法上有所不同) 我得到以下錯誤: '/> xpath // directory [contains(@name,'/ MySearchKey /')] /( (@name | file/@ name)' 'XPath error:Invalid expression' '// directory [contains(@name,'/ MySearchKey /')] /(@ name | file/@ name)' '' 'xmlXPathEval:evaluation failed' '對象爲空(NULL)' (我在MySearchKey之後加了一個前導'/'來限制搜索,就像'MySearchKey_somethingelse'應該**不匹配) – Renato