XPath,其中要求适用于比结果集中的节点更深的节点

时间:2010-01-06 07:43:14

标签: xml xpath webdav

在回答SO中的另一篇文章(这里:SharePoint 2007, how to check if a folder exists in a document library)时,我不得不解析一个带有结构的XML文档:

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

是否可以构造一个XPath语句,选择一组包含D:response等于D:displayname"someName"D:isFolder的{​​{1}}个元素?

如果我选择所有"t"元素然后循环遍历结果集,我知道该怎么做,但我相信XPath足够强大,能够以更精细的方式做到这一点。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

如果displaynameisFolder出现在D:response内的任何位置,那么这应该可行。

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

//表示节点可以出现在层次结构中的任何位置

[...]是一个谓词,用于过滤符合给定条件的元素。

答案 2 :(得分:1)

@Jimmy Zhang回答的更短更有效的变体是

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

它避免了低效的//运算符(当实际知道目标元素的位置时,它会不必要地检查整个树)。它还使用嵌套谓词来避免冗余。