2010-01-06 32 views
2

在我的回答對另一篇文章中SO(這裏:SharePoint 2007, how to check if a folder exists in a document library),我不得不解析與結構的XML文檔:的XPath其中要求適用於比那些更深層的節點,導致設置

D:multistatus 
|--D:response 
|----D:propstat 
|-------D:prop 
|----------D:displayname 
|----------D:isFolder 

是否有可能構建一個XPath語句,選擇一組包含D:displayname等於"someName"D:isFolderD:response元素爲"t"

我知道如何做到這一點,如果我選擇所有D:response元素,然後循環遍歷結果集,但是我相信XPath足夠強大,可以以更爲微妙的方式實現這一點。

回答

4
//D:response[D:propstat/D:prop/D:displayname="someName" and D:propstat/D:prop/D:isFolder="t"] 
+0

謝謝!我知道它,XPath功能強大;-)有什麼好的資源可以閱讀關於構建XPath語句的一般規則的更多信息? – naivists 2010-01-06 08:34:38

+1

webmonkey有xpath教程... w3c有完整的xpath規範,你可以使用web搜索來做 – 2010-01-06 09:13:37

+2

更短,更高效:'/ */D:response [D:propstat/D:prop [D:displayname ='someName'和D:isFolder ='t']]' – Tomalak 2010-01-06 09:39:18

2

如果displaynameisFolder可以在D:response出現在任何地方,那麼這應該工作。

//D:response//[D:displayname="someName" and D:isFolder="t"] 

//意味着該節點可以在層次結構中的任何地方出現,並且

[...]是用於過濾符合指定條件的元素的謂詞。

+0

我相信這個結構或多或少是標準的,因爲已經構建了很多實現WebDAV的工具。但是,您的版本比@Jimmy張貼的版本短 – naivists 2010-01-06 08:36:39

+0

不知道它是WebDAV。在Xpath中有無數的方法可以做到這一點,但是Jimmys解決方案肯定更好,因爲它強制了層次結構,以後可以避免很多頭痛的問題:) – Anurag 2010-01-06 08:43:37

1

@Jimmy張的回答的較短的,更有效的變體是

 
/*/D:response[D:propstat/D:prop[D:displayname='someName' and D:isFolder='t']] 

它避免了低效率的操作者//(其不必要檢查當目標元件的位置實際上是公知的整個樹)。它也使用嵌套謂詞來避免冗餘。

+0

'/ * /'究竟意味着什麼?你知道一些很好的參考手冊,其中解釋了這些結構嗎? – naivists 2010-01-06 11:39:14

+1

'*'匹配**任何元素**。檢查XPath語法的w3schools參考:http://www.w3schools.com/XPath/xpath_syntax.asp – 2010-01-06 12:07:26

+0

哦,終於明白了 - 第一個斜槓是根,然後你說「任何元素作爲根節點的直接子節點「然後你請求」D:response「元素。感謝您的鏈接! – naivists 2010-01-06 14:04:10

相關問題