Что означает «xmlns» в XML?

382

Я видел следующую строку в файле XML:

xmlns:android="http://schemas.android.com/apk/res/android"

Я также видел xmlns во многих других файлах XML, с которыми я столкнулся.

Что это?

Показать ещё 1 комментарий
Теги:
xml-namespaces

6 ответов

251
Лучший ответ

Он определяет пространство имен XML.

В вашем примере Префикс пространства имен - это "андроид", а URI пространства имен - http://schemas.android.com/apk/res/android "

В документе вы видите такие элементы, как: <android:foo />

Подумайте о префиксе пространства имен как переменной с кратким псевдонимом имени для полного URI пространства имен. Это эквивалент записи <http://schemas.android.com/apk/res/android:foo /> в отношении того, что он означает, когда XML-парсер читает документ.

ПРИМЕЧАНИЕ.. Фактически вы не можете использовать полный URI пространства имен вместо префикса пространства имен в документе экземпляра XML.

Ознакомьтесь с этим руководством по пространствам имен: http://www.sitepoint.com/xml-namespaces-explained/

  • 54
    Я всегда вставляю эти URI в веб-браузер, просто чтобы посмотреть, на что смотрит парсер, но он всегда возвращает 404. Должен ли это быть реальный URI, для которого нужно добавить стандартное имя файла в конец, или это просто методика? для создания уникального идентификатора?
  • 33
    @ Патрик да, это просто URI, который должен быть уникальным, чтобы указывать, что это отдельное пространство имен от других, и поэтому любые потенциальные дублирующие теги будут интерпретироваться правильно. Таким образом, URI часто будет указывать на ничто.
Показать ещё 4 комментария
612

Это означает пространство имен XML.

В принципе, каждый элемент (или атрибут) в XML принадлежит пространству имен, способ "квалифицировать" имя элемента.

Представьте, что вы и я изобретаем собственный XML. Вы изобретаете XML для описания людей, я придумываю для описания городов. Мы оба включаем элемент с именем name. Ваше имя относится к имени человека, а мое - к имени города - ОК, его немного надуло.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Если бы наши два XML были объединены в один документ, как бы мы разделили эти два имени? Как вы можете видеть выше, есть два элемента name, но оба они имеют разные значения.

Ответ заключается в том, что мы с вами будем присваивать пространство имен нашему XML, что мы сделаем уникальным:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

Теперь мы полностью квалифицируем наш XML, нет никакой двусмысленности в отношении того, что означает каждый элемент name. Все теги, начинающиеся с personxml:, являются тегами, принадлежащими вашему XML, все те, которые начинаются с cityxml:, являются моими.

Есть несколько замечаний:

  • Если вы исключаете любые объявления пространства имен, считается, что все они находятся в пространстве имен по умолчанию.

  • Если вы объявляете пространство имен без идентификатора, то есть xmlns="http://somenamespace", а не xmlns:rob="somenamespace", оно указывает пространство имен по умолчанию для документа.

  • Фактическое пространство имен, часто IRI, не имеет никакого реального последствия. Он должен быть уникальным, поэтому люди склонны выбирать IRI/URI, которым они владеют, но это не имеет большого значения, чем это. Иногда люди помещают схему (определение) для XML в указанный IRI, но это соглашение только для некоторых людей.

  • Префикс тоже не имеет значения. Единственное, что имеет значение, это то, что пространство имен префикс определяется как. Несколько тегов, начинающихся с разных префиксов, все из которых сопоставляются с тем же пространством имен, считаются одинаковыми.

    Например, если префиксы personxml и mycityxml сопоставлены с одним и тем же пространством имен (как в приведенном ниже фрагменте), то не имеет значения, префикс ли данный элемент с помощью personxml или mycityxml, они будут рассматриваться как одно и то же с помощью парсера XML. Дело в том, что парсер XML не заботится о том, что вы выбрали в качестве префикса, и только в пространстве имен, которое оно отображает. Префикс - это просто косвенное указание на пространство имен.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
    
  • Атрибуты могут быть квалифицированы, но, как правило, нет. Они также не наследуют свое пространство имен от элемента, в котором они находятся, в отличие от элементов (см. Ниже).

Кроме того, пространства имен элементов наследуются от родительского элемента. Другими словами, я мог бы также написать указанный выше XML как

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>
  • 10
    +1 хороший, полезный концептуальный ответ. Возможно, вы захотите определить «По сути, каждый элемент (или атрибут) в xml принадлежит пространству имен», поскольку некоторые элементы и атрибуты называются «нет пространства имен». Хотя я понимаю, что вы давали основы.
  • 1
    @Rob Levine "Атрибуты могут быть пространством имен, но обычно это не так." А как насчет Android?
Показать ещё 12 комментариев
11

xmlns - пространство имен xml. Это просто метод, позволяющий избежать конфликтов имен элементов. Например:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

Два разных элемента node в одном XML файле. Без пространств имен этот файл недействителен.

9

Я думаю, что самая большая путаница в том, что пространство имен xml указывает на какой-то URL-адрес, который не имеет никакой информации. Но правда в том, что человек, который придумал ниже пространства имен:

xmlns:android="http://schemas.android.com/apk/res/android"

также может называть его следующим:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

Это просто уникальный идентификатор. Однако установлено, что вы должны поместить туда уникальный URL-адрес, который может указывать на спецификацию используемых тегов/атрибутов в этом пространстве имен. Это не требуется.

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

Из-за этой уникальности вам не нужно беспокоиться о том, что если вы создадите свой собственный атрибут, у вас будет столкновение имен.

  • 0
    Привет, Морфидон. Пожалуйста, не могли бы вы добавить в свой ответ ссылку на ссылку, указывающую, что контент или URL может быть чем угодно? Что должно быть уникальным? Также уточните уникальность: имя пространства имен XML или содержание URL? ура
  • 0
    @olibre Если вы хотите использовать пространство имен Android, вы должны использовать их имя. Это их уникальное имя. Они решили разместить там URL. Если вы создаете свое собственное пространство имен, вы можете называть его как угодно, просто убедитесь, что оно уникально. Говорят, что вы должны использовать URL, который указывает на место, где вы описываете, что находится внутри этого пространства имен, но, как вы можете видеть, даже создатели пространства имен Android не делали этого.
Показать ещё 1 комментарий
4

У вас есть пространства имен, поэтому вы можете иметь глобально уникальные элементы. Тем не менее, в 99% случаев это не имеет особого значения, но когда вы ставите его в точку зрения The Semantic Web, он начинает становятся важными.

Например, вы можете создать XML-разметку различных схем, используя соответствующий xmlns. Например, перепутайте друга друга с vCard и т.д.

  • 0
    для тривиального xml это может меня игнорировать, для всего остального пространства имен чрезвычайно важны. + Я действительно не вижу связи между семантической паутиной и пространством имен. Семантическая сеть - это концепция, пространство имен является частью стандарта XML, вы смешиваете определение интерфейса и детали реализации.
0

Пространства имен XML предоставляют метод, позволяющий избежать конфликтов имен элементов. В XML имена элементов определяются разработчиком. Это часто приводит к конфликту при попытке объединить XML-документы из разных приложений XML.

Конфликты имен в XML можно легко избежать, используя префикс имени. При использовании префиксов в XML необходимо определить пространство имен для префикса.

Пространство имен может быть определено атрибутом xmlns в начальном теге элемента. Объявление пространства имен имеет следующий синтаксис. XMLNS:. Префикс = "URI"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню