#xml #xml-namespaces
Вопрос:
Привет, у меня возникли проблемы с пониманием того, как пространства имен и пространства имен по умолчанию работают в xml
В приведенном ниже примере я вижу 2 пространства имен по умолчанию (recherche и mots-clefs) и 2 пространства имен (xmlns:yahoo и xmlns:yahoo2 я прав?
<?xml version="1.0"?>
<recherche xmlns="http://www.google.com/" xmlns:yahoo="http://www.yahoo.com/">
<mots-clefs xmlns="http://www.yahoo.com/">fraise, orange</mots-clefs>
<yahoo:mot xmlns:yahoo2="http://www.yahoo.com/">
<nombre>3</nombre>
</yahoo:mot>
</recherche>
Комментарии:
1. Для вашей
yahoo:mot
стихии, так как yahoo.com пространство имен объявляется вrecherche
предке сyahoo
префиксом и используется для этогоyahoo:mot
, в этом нет необходимостиxmlns:yahoo2="http://www.yahoo.com/"
. Это просто создание другого (неиспользуемого) пространства имен-префикса, привязанного к тому же пространству имен, которое уже объявлено. Это просто беспорядок. Подумайте о префиксах пространства имен как о переменных, которым присвоено пространство имен. Нет необходимости в yahoo и yahoo2, если они имеют одинаковое значение.
Ответ №1:
Существует 2 различных пространства имен, объявленных:
Существует два префикса пространства имен, оба привязаны к http://www.yahoo.com/ пространство имен:
- yahoo
- yahoo2
Некоторые элементы объявлены без префикса пространства имен, но все равно привязаны к пространству имен:
- /*:перепроверка = http://www.google.com/
- /:повторное исследование/:mots-clefs = http://www.yahoo.com/
- /:проверка/:mot = http://www.yahoo.com/
- /:проверка/:mot/*:nombre = http://www.google.com/
Обратите внимание, что nombre
элемент привязан к http://www.google.com/ пространство имен, потому что у него нет префикса пространства имен, а у первого предка, у которого нет префикса recherche
пространства имен, пространство имен имеет значение http://www.google.com/.
В XPath вы можете спросить, каково пространство имен для элемента, используя namespace-uri()
функцию.
Из-за того, как наследуются пространства имен, это может сбивать с толку (и приводить к ошибкам), когда люди имеют смешанные пространства имен и не используют префиксы пространства имен пользователей. В общем, рекомендуется применять префиксы пространства имен, чтобы избежать такой путаницы.
Если вы вручную кодируете XML, установка пространства имен без префикса может облегчить создание XML и избежать повторения одного и того же.
Ответ №2:
Да, XML поддерживает два определения пространства имен по умолчанию и два определения с префиксами пространства имен. Из-за перекрывающегося присутствия обоих, базовые теги имеют нюансы наследования области видимости.
В соответствии со спецификациями XML 1.0, касающимися области действия пространства имен:
Область объявления пространства имен, объявляющего префикс, простирается от начала начального тега, в котором он отображается, до конца соответствующего конечного тега, исключая область любых внутренних объявлений с той же частью NSAttName. В случае пустого тега областью действия является сам тег.
Такое объявление пространства имен применяется ко всем именам элементов и атрибутов в его области, префикс которых совпадает с указанным в объявлении.
Расширенное имя, соответствующее имени элемента или атрибута с префиксом, содержит URI, к которому привязан префикс, в качестве имени пространства имен, а локальная часть-в качестве локального имени.
Таким образом, хотя в опубликованном XML-файле есть два пространства имен по умолчанию, внутреннее объявленное пространство имен по умолчанию заменяет внешнее пространство имен по умолчанию в области видимости, но только для этого конкретного тега и его потомков.
Более того, любые методы библиотеки DOM, которые намерены анализировать содержимое корневого <recherche>
каталога и всех его потомков, не помеченных префиксами, должны подтверждать URI Google. Однако только для <mots-clefs>
и все его потомки без префикса (которые не являются ни одним, кроме текстового узла) должны использовать текущую область пространства имен по умолчанию URI Yahoo.
Для дополнительной иллюстрации см. Комментарии к области пространства имен в версии XML с отступом. Обратите <nombre>
внимание, что тег, являющийся потомком <recherche>
и не имеющий префикса, разделенного двоеточием, по умолчанию будет первым объявленным пространством имен по умолчанию.
<?xml version="1.0"?> <!-- NMSP SCOPES: -->
<recherche xmlns="http://www.google.com/" xmlns:yahoo="http://www.yahoo.com/"> <!-- GOOGLE URI -->
<mots-clefs xmlns="http://www.yahoo.com/">fraise, orange</mots-clefs> <!-- YAHOO URI -->
<yahoo:mot xmlns:yahoo2="http://www.yahoo.com/"> <!-- YAHOO PREFIX -->
<nombre>3</nombre> <!-- GOOGLE URI -->
</yahoo:mot>
</recherche>