Есть несколько техник, которые вы можете попробовать; то, что вы будете использовать, будет зависеть от того, какую именно информацию вам нужно получить из документа, насколько строгой вы хотите быть и насколько соответствует используемая вами реализация XPath.
Одним из способов получения URI пространства имен, связанного с конкретным префиксом, является использование оси namespace::
. Это даст вам узел пространства имен, именем которого является префикс, а значением - URI пространства имен. Например, вы можете получить URI пространства имен по умолчанию для элемента документа, используя путь:
/*/namespace::*[name()='']
Возможно, вы сможете использовать это для настройки ассоциаций пространства имен для вашего XPathNavigator. Имейте в виду, однако, что ось namespace::
является одним из тех углов XPath 1.0, который не всегда реализуется.
Второй способ получить этот URI пространства имен - использовать функцию namespace-uri()
в элементе документа (который, как вы сказали, всегда будет в этом пространстве имен). Выражение:
namespace-uri(/*)
даст вам это пространство имен.
В качестве альтернативы можно забыть о связи префикса с этим пространством имен и просто освободить путь к пространству имен. Вы можете сделать это с помощью функции local-name()
всякий раз, когда вам нужно обратиться к элементу, пространство имен которого вы не знаете. Например:
//*[local-name() = 'Element']
Вы можете пойти еще дальше и проверить URI пространства имен элемента по сравнению с URI элемента документа, если вы действительно хотите:
//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]
Последний вариант, учитывая, что пространство имен для вас ничего не значит, - это запустить ваш XML через фильтр, который удаляет пространства имен. Тогда вам не придется беспокоиться о них в вашем XPath. Самый простой способ сделать это - просто удалить атрибут xmlns
с помощью регулярного выражения, но вы могли бы сделать что-то более сложное, если бы вам нужно было одновременно выполнять другие операции.