在XPath表达式中声明名称空间

问题描述 投票:5回答:3

我的应用程序需要针对一些XML数据评估XPath表达式。表达式由用户在运行时提供。因此,我无法创建XmlNamespaceManager传递给XPathEvaluate,因为在编译时我不知道前缀和名称空间。

是否有可能在xpath表达式中指定名称空间声明?


回答意见:

  1. XML数据具有一个默认的名称空间,但是可以包含具有任何名称空间的嵌套元素。用户知道他使用的数据的名称空间。
  2. 用户提供的xpath表达式将针对许多XML文档进行评估,并且每个文档都可以为相同的名称空间使用自己的前缀。
c# .net xpath xml-namespaces xelement
3个回答
2
投票

我不知道在XPath表达式中定义名称空间前缀的任何方法。

但是您可以通过在适当的地方使用local-name()和namespace-uri()函数来编写XPath表达式,使其与名称空间前缀无关。

如果您事先知道XML命名空间,则可以在XmlNamespaceManager中为其注册一个任意前缀,并告诉您的用户在XPath表达式中使用该前缀。 XML文档本身是否注册了不同的前缀或根本没有前缀都没有关系。路径解析仅基于名称空间,而不基于前缀。

[另一种选择是在运行时扫描文档(如果尚未加载,请使用XmlReader来降低资源开销),然后在XmlNamespaceManager中将使用的映射添加到文档中。我不确定是否可以从XmlDocument获取名称空间和前缀,但是我看不到直接的方法。不过,使用XmlReader很容易,因为它公开了每个节点的NamespaceURI和Prefix成员。


6
投票

如果可以将相同的前缀绑定到不同的名称空间,并且事先不知道前缀,那么指定此类表达式的唯一纯XPath方法是使用这种形式的引用元素

someName[namespace-uri() = 'exactNamespace']

因此,特定的XPath表达式为

/*/a[namespace-uri() = 'defaultNS']/b[namespace-uri() = 'NSB']
                                         /c[namespace-uri() = 'defaultNS']

2
投票

是否有可能在xpath表达式中指定名称空间声明?

答案是否定的-它总是在调用环境中完成(实际上更灵活)。

一种替代方法是使用XQuery,它确实允许在查询序言中声明名称空间。

更新(2020)

在XPath 3.1中,您可以使用语法/*/Q{http://my-namespace}a

但是,遗憾的是,如果您仍在使用Microsoft软件,那么自2011年以来情况就没有改变-您仍然对XPath 1.0充满缺点。

© www.soinside.com 2019 - 2024. All rights reserved.