Запрос XPath для всех узлов, которые используют указанный префикс пространства имен c - PullRequest
0 голосов
/ 17 января 2020

У меня есть следующий 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

Я нашел ответы, как искать конкретный c узел с конкретный c префикс, но абсолютно ничего не нужно искать любой узел с заданным c префиксом.

Самым близким, что я смог найти, было следующее но это не связано с префиксами пространства имен.

1 Ответ

1 голос
/ 17 января 2020

Если вы хотите, чтобы все элементы в пространстве имен clr-namespace:System.Collections.Generic;assembly=mscorlib, вы можете написать

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

Если вы действительно хотите выполнить поиск по префиксу (и большинство людей скажут, что это плохая практика), тогда вы может делать

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

, что, вероятно, будет работать на большинстве процессоров, даже если XPath 1.0 не гарантирует этого (он говорит "Как правило, это [результат name ()] будет QName это произошло в источнике XML. Этого не должно быть в случае, если на узле действуют объявления пространств имен, которые связывают несколько префиксов с одним и тем же пространством имен. ")

...