C# 使用特定命名空间前缀的所有节点的XPath查询

C# 使用特定命名空间前缀的所有节点的XPath查询,c#,.net,xml,xaml,xpath-1.0,C#,.net,Xml,Xaml,Xpath 1.0,我有以下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"> <Paren

我有以下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>
我需要一个限制在1.0版的XPath查询,因为.NET项目返回所有节点,而不管节点的本地名称或位置如何,这些节点使用的是:名称空间前缀

在上一个示例中,结果应包含以下节点:

/根/父/a:列表

/Root/a:字典

我已经找到了如何搜索具有特定前缀的特定节点的答案,但对于搜索具有特定前缀的任何节点却完全没有任何答案


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

如果希望名称空间clr namespace中的所有元素:System.Collections.Generic;assembly=mscorlib,您可以编写

//*[namespace-uri() = 'clr-namespace:System.Collections.Generic;assembly=mscorlib']
如果你真的想搜索前缀,而大多数人会说这是一种不好的做法,那么你可以这样做

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

这可能会在大多数处理器上运行,尽管XPath 1.0不能保证这一点,它通常会说,这[名称的结果]将是XML源中出现的QName。如果节点上存在有效的名称空间声明,并且这些声明将多个前缀与同一名称空间相关联,则不需要出现这种情况

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