понимание пространств имен xml

#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 различных пространства имен, объявленных:

  1. http://www.google.com/
  2. http://www.yahoo.com/

Существует два префикса пространства имен, оба привязаны к http://www.yahoo.com/ пространство имен:

  1. yahoo
  2. yahoo2

Некоторые элементы объявлены без префикса пространства имен, но все равно привязаны к пространству имен:

Обратите внимание, что 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>