XML名称空间破坏了XPath,怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我有以下XML:

<List xmlns="http://schemas.microsoft.com/sharepoint/soap/">
 <Fields>
   <Field>
   </Field>
 </Fields>
</List>

这是从SharePoint Web服务返回的XML的精简版本。我还有以下XPath:

/List/Fields/Field

当我移除xmlns从我的XML中,XPath工作得很好。当它在那里时,我的XPath什么也找不到。我是否应该用XPath来做一些不同的事情呢?

提问于
用户回答回答于

如果无法注册命名空间绑定,且不能使用(假设注册前缀为“x”):

/x:List/x:Fields/x:Fiels

还有另一种方法:

/*[name()='List']/*[name()='Fields']/*[name()='Field']
用户回答回答于

List元素已经用默认的命名空间定义了,并且它被内部的所有元素所采用。

因此,您需要忽略元素命名空间,如下所示:

/*[local-name()='List']/*[local-name()='Fields]/*[local-name()='Field]

但这意味着xpath将使用list-field-field来获取任何其他元素。

您可以执行名称空间检查,也可以进行本地名称检查,如下所示:

/*[local-name()='List' and namespace-uri()='http://schemas.microsoft.com/sharepoint/soap/']/*[local-name()='Fields' and namespace-uri()='http://schemas.microsoft.com/sharepoint/soap/']/*[local-name()='Field' and namespace-uri()='http://schemas.microsoft.com/sharepoint/soap/']

或者,您可以向库注册名称空间,然后显式指定该命名空间的前缀,并将其添加到XPath表达式中,XPath表达式的方法取决于所使用的库。

扫码关注云+社区