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

Ant*_*kov 4 .net c# xelement xpath xml-namespaces

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

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


评论的答案:

  1. XML数据有一个默认命名空间,但可以有嵌套元素和任何命名空间.用户知道他使用的数据的名称空间.
  2. 用户提供的xpath表达式将针对许多XML文档进行评估,并且每个文档都可以为相同的名称空间提供自己的前缀.

Dim*_*hev 6

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

someName[namespace-uri() = 'exactNamespace']
Run Code Online (Sandbox Code Playgroud)

所以,一个特定的XPath表达式将是:

/*/a[namespace-uri() = 'defaultNS']/b[namespace-uri() = 'NSB']
                                         /c[namespace-uri() = 'defaultNS']
Run Code Online (Sandbox Code Playgroud)


TTo*_*oni 2

我不知道有什么方法可以在 XPath 表达式中定义名称空间前缀。

但是,您可以在适当的情况下使用 local-name() 和 namespace-uri() 函数将 XPath 表达式编写为与命名空间前缀无关。

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

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