【问题标题】:XPath where the requirements apply to deeper nodes than the ones in resulting setXPath 要求适用于比结果集中更深的节点
【发布时间】:2010-01-06 07:43:14
【问题描述】:

在我对 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 元素,其中包含等于"someName" 的D:displayname 和D:isFolder 是"t"?

如果我选择所有 D:response 元素然后循环遍历结果集,我知道该怎么做,但我相信 XPath 足够强大,可以以更微妙的方式做到这一点。

【问题讨论】:

    标签: xml xpath webdav


    【解决方案1】:
    //D:response[D:propstat/D:prop/D:displayname="someName" and D:propstat/D:prop/D:isFolder="t"]
    

    【讨论】:

    • 谢谢!我知道,XPath 很强大 ;-) 有什么好的资源可以让我阅读更多关于构造 XPath 语句的一般规则的信息吗?
    • webmonkey 有 xpath 教程... w3c 有完整的 xpath 规范,你可以使用网络搜索来做到这一点
    • 更短更高效:/*/D:response[D:propstat/D:prop[D:displayname='someName' and D:isFolder='t']]
    【解决方案2】:

    如果displayname 和isFolder 可以出现在D:response 中的任何位置,那么这应该可以工作。

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

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

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

    【讨论】:

    • 我相信结构或多或少是标准的,因为已经构建了很多实现 WebDAV 的工具。但是,您的版本比@Jimmy zhang 发布的版本短
    • 不知道是 WebDAV。在 Xpath 中有无数种方法可以做到这一点,但 Jimmys 的解决方案肯定更好,因为它强制执行层次结构,可以避免以后出现很多麻烦 :)
    【解决方案3】:

    @Jimmy Zhang 答案的一个更短更有效的变体是

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

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

    【讨论】:

    • /*/ 到底是什么意思?你知道一些很好的参考手册来解释这些结构吗?
    • * 匹配任何元素。查看关于 XPATH 语法的 w3schools 参考:w3schools.com/XPath/xpath_syntax.asp
    • 哦,终于明白了——第一个斜杠是根,然后你说“任何元素作为根节点的直接子节点”,然后请求“D:response”元素。感谢您的链接!
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多