Объявите пространства имен в выражении XPath - PullRequest
4 голосов
/ 01 февраля 2011

Моему приложению необходимо сравнить выражение XPath с некоторыми данными XML.Выражение предоставляется пользователем во время выполнения.Поэтому я не могу создать XmlNamespaceManager для передачи XPathEvaluate, потому что я не знаю префиксов и пространств имен во время компиляции.

Есть ли возможность указать объявление пространств имен в выражении xpath?


Ответы на комментарии:

  1. Данные XML имеют одно пространство имен по умолчанию, но могут быть вложенные элементы с любыми пространствами имен.Пользователь знает пространства имен данных, с которыми он работает.
  2. Предоставленное пользователем выражение xpath должно оцениваться для многих документов XML, и каждый документ может иметь свои собственные префиксы для тех же пространств имен.

Ответы [ 3 ]

6 голосов
/ 01 февраля 2011

Если один и тот же префикс может быть связан с различными пространствами имен, а префиксы заранее не известны, то единственный способ XPath для определения таких выражений - использовать эту форму ссылки на элементы :

someName[namespace-uri() = 'exactNamespace']

Таким образом, конкретное выражение XPath будет :

/*/a[namespace-uri() = 'defaultNS']/b[namespace-uri() = 'NSB']
                                         /c[namespace-uri() = 'defaultNS']
2 голосов
/ 01 февраля 2011

Я не знаю, как определить префикс пространства имен в выражении XPath.

Но вы можете написать выражение XPath, которое не зависит от префиксов пространства имен, с помощью функций local-name () и namespace-uri (), где это необходимо.

или , если вы заранее знаете пространства имен XML, вы можете зарегистрировать произвольный префикс для них в XmlNamespaceManager и указать своему пользователю использовать этот префикс в выражении XPath. Не имеет значения, регистрирует ли сам документ XML другой префикс или вообще не имеет префикса. Разрешение пути основывается только на пространстве имен, а не на префиксе.

Другим вариантом может быть сканирование документа во время выполнения (используйте XmlReader, чтобы сэкономить ресурсы, если вы его еще не загрузили), а затем добавить используемые сопоставления в документ в XmlNamespaceManager. Я не уверен, что вы можете получить пространства имен и префиксы из XmlDocument, но я не вижу прямого способа сделать это. С XmlReader это легко сделать, поскольку он предоставляет члены NamespaceURI и Prefix для каждого узла.

1 голос
/ 01 февраля 2011

Есть ли возможность указать объявление пространств имен в выражении xpath?

Ответ - нет - это всегда делается в вызывающей среде (которая на самом деле более гибкая).

Альтернативой может быть использование XQuery, который позволяет объявлять пространства имен в прологе запроса.

...