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

415

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

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

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

Что это?

user88637
источник
Смотрите также Где определен атрибут xmlns?
khhughes
Теперь вы также узнали бы, почему мы получаем ошибки в XML, когда мы используем теги неправильно или не в том месте. :)
Вайбс

Ответы:

299

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

В вашем примере префикс пространства имен - « android », а 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/

Мадс Хансен
источник
62
Я всегда вставляю эти URI в веб-браузер, просто чтобы посмотреть, на что смотрит парсер, но он всегда возвращает 404. Должен ли это быть реальный URI, который требует стандартного имени файла, прикрепленного к концу, или это просто методика? для создания уникального идентификатора?
Патрик
36
@ Патрик да, это просто URI, который должен быть уникальным, чтобы указывать, что это отдельное пространство имен от других, и поэтому любые потенциальные дубликаты тегов будут интерпретироваться правильно. Таким образом, URI часто будет указывать на ничто.
Фучжоу
3
Хм ... приятно знать, что это пространство имен. Раньше я задавался вопросом, действительно ли указание URI позволило html-странице получить доступ к этому веб-сайту для определения схемы.
Nav
17
@Patrick, URI не совпадает с URL. URL - это локатор, а URI - просто идентификатор. Вы могли бы очень хорошо выбрать GUID в качестве URI. Фактически, ISBN, который мы имеем для книг, является формой URI.
Jaywalker
тогда как работают теги? Я имею ввиду <LinearLayoutработает без префикса?
Асиф Муштак
676

Это означает пространство имен 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>
Роб Левайн
источник
13
+1 хороший, полезный концептуальный ответ. Возможно, вы захотите определить «По сути, каждый элемент (или атрибут) в xml принадлежит пространству имен», поскольку некоторые элементы и атрибуты называются «нет пространства имен». Хотя я понимаю, что вы давали основы.
LarsH
1
@Rob Levine "Атрибуты могут быть пространством имен, но обычно это не так." А как насчет Android?
Павел Бревчински,
1
Так, например, как используется « your.example.com/xml/person »? Хорошо, у меня есть тег <person: name>, и что теперь? Можете ли вы объяснить это, пожалуйста?
Корай Тугай
1
@WORMSS - Да, вы правы. Когда вы определяете свой запрос, вам нужно указать пространство имен, вероятно, через префикс. Например, в мире C # System.Xml вы регистрируете префикс в менеджере пространства имен, используя XmlNamespaceManager.AddNamespace, а затем используете этот префикс в своем запросе. Тот факт, что префикс не появляется в документе, не имеет значения - только то, какое пространство имен он отображает.
Роб Левайн
2
Эта ссылка на документ Microsoft: « msdn.microsoft.com/en-us/library/aa468565.aspx » очень хорошо объясняет пространство имен в XML.
Дин Джон
16

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

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

можно также назвать это так:

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

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

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

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

Morfidon
источник
Привет, Морфидон. Пожалуйста, не могли бы вы добавить в свой ответ ссылку на ссылку, указывающую, что контент или URL может быть чем угодно? Что должно быть уникальным? Также уточните уникальность: имя пространства имен XML или содержание URL? Приветствия
olibre
@olibre Если вы хотите использовать пространство имен Android, вы должны использовать их имя. Это их уникальное имя. Они решили разместить там URL. Если вы создаете свое собственное пространство имен, вы можете называть его как хотите, просто убедитесь, что оно уникально. Говорят, что вы должны использовать URL, который указывает на место, где вы описываете, что находится внутри этого пространства имен, но, как вы можете видеть, даже создатели пространства имен Android не делали этого.
Морфидон
Спасибо Морфидон. Я наконец понял этот момент, читая ответ Роба . Мне нравится ваш ответ, потому что он подчеркивает важный аспект, который не очень известен. Но, пожалуйста, постарайтесь улучшить свой ответ, уточнить, какая часть должна быть уникальной, предоставить ссылки, перефразировать, проверить формулировку ... Некоторые читатели могут быть смущены вашим текущим ответом. Приветствия
olibre
1
Это ответ мне нужен! Поэтому сложно использовать URI для этого значения атрибута, потому что люди думают, что URI = URL, и ожидают, что какой-то документ должен находиться в этом месте. Но AFAICT вполне нормально, если URI возвращает 404. Это просто уникальный идентификатор, который выглядит как адрес. Могут быть некоторые специальные валидаторы, которые ожидают найти схему или DTD в этом месте (что имело бы смысл), но я думаю, что это особые случаи. Пожалуйста, поправьте меня, если я здесь не прав.
brennanyoung
1
@brennanyoung это именно так, как вы сказали :)
Morfidon
12

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-файле. Без пространств имен этот файл был бы недействительным.

Юрий
источник
4

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

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

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