【问题标题】:XPath query for all nodes which use a specific namespace prefix使用特定命名空间前缀的所有节点的 XPath 查询
【发布时间】:2020-01-17 16:38:46
【问题描述】:

我有以下 XAML(它可能看起来很奇怪,因为我试图删除多余的部分):

<Root xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:a="clr-namespace:System.Collections.Generic;assembly=mscorlib"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Parent Name="SignIn">
        <a:List x:TypeArguments="InArgument(x:String)" Capacity="4" />
    </Parent>
    <a:Dictionary x:TypeArguments="x:Stringa, x:Object">
      <x:Boolean x:Key="IsExpanded">False</x:Boolean>
    </a:Dictionary>
</Root>

我需要一个 XPath 查询(仅限于版本 1.0,因为 .NET 项目),它返回使用 a: 命名空间前缀的 所有 节点(无论节点的本地名称或位置如何)。

在前面的例子中,结果应该包含节点:

/Root/Parent/a:List

/Root/a:Dictionary

我找到了如何使用 specific 前缀搜索 specific 节点的答案,但绝对没有搜索具有特定前缀的 any 节点。

我能找到的最接近的是following,但它与命名空间前缀无关。

【问题讨论】:

  • 真的是你关心的前缀,还是真正的命名空间? XML 中的普遍看法是,您应该允许人们使用他们喜欢的任何前缀,并且只有命名空间 URI 很重要。
  • 就我而言,它只是前缀本身,因为我需要在定义和使用它的节点中更改它。长话短说:我正在编写一个静态 XAML 分析器,并且已经使用 a: 作为默认命名空间。问题是我收到了要分析的 XAML,它也在使用 a:。更改现有逻辑风险太大,因此我正在更改前缀的名称。

标签: c# .net xml xaml xpath-1.0


【解决方案1】:

如果你想要命名空间clr-namespace:System.Collections.Generic;assembly=mscorlib中的所有元素,你可以写

//*[namespace-uri() = 'clr-namespace:System.Collections.Generic;assembly=mscorlib']

如果你真的想搜索前缀(大多数人会说这是不好的做法),那么你可以这样做

//*[starts-with(name(), 'a:')]

这可能适用于大多数处理器,即使 XPath 1.0 不保证它(它说 “通常,这个 [name() 的结果] 将是 XML 源中出现的 QName。这个如果在将多个前缀与同一命名空间相关联的节点上存在有效的命名空间声明,则不需要这种情况。")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多