Що означає "xmlns" у XML?


415

У XML-файлі я побачив наступний рядок:

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

Я також бачив xmlnsу багатьох інших XML-файлах, які я натрапив.

Що це?




Тепер ви також мали б знати про те, чому ми отримуємо помилки в 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
@Patrick так, його просто URI, який повинен бути унікальним, щоб вказувати на те, що це окремий простір імен від інших, тому будь-які потенційні повторювані теги будуть інтерпретовані правильно. Тож URI часто вказує ні на що.
foochow

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 з вашого простору імен, можна відрізнити від фону з іншого простору імен.

Через цю унікальність вам не потрібно турбуватися, що якщо ви створите власний атрибут, у вас виникне зіткнення імен.


Привіт, Морфідон. Чи можете ви додати у відповідь посилання на посилання на те, що вміст чи URL-адреса можуть бути будь-якими? Що повинно бути унікальним? Будь ласка, уточнюйте унікальність: ім'я простору імен XML чи вміст URL-адреси? Ура
олібре

@olibre Якщо ви хочете використовувати простір імен Android, ви повинні використовувати їх ім'я. Ось їхня унікальна назва. Вони вирішили поставити там URL. Якщо ви створюєте свій власний простір імен, тоді ви можете називати його все, що завгодно, просто переконайтеся, що він унікальний. Кажуть, що ви повинні використовувати URL, який вказує на місце, де ви описуєте, що знаходиться в цьому просторі імен, але, як ви бачите, навіть творці простору імен Android не зробили цього.
Морфідон

Дякую Морфідон. Я, нарешті, зрозумів цю точку, читаючи відповідь Роба . Мені подобається ваша відповідь, оскільки вона висвітлює важливий аспект, який недостатньо відомий. Але, будь ласка, спробуйте покращити свою відповідь, уточнити, яка частина повинна бути унікальною, надайте посилання, перефразовуйте, перевірте формулювання ... Деякі читачі можуть збентежити вашу поточну відповідь. Ура
олібре

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% часу це насправді не має значення, але коли ви ставите це в перспективі The Semantic Web , воно починає набувати важливого значення.

Наприклад, ви можете зробити XML-розбір різних схем, просто скориставшись відповідними xmlns. Наприклад, замісити товариша друга з vCard тощо.


для тривіального xml це, можливо, мені ігнорується, адже для всіх інших простори імен надзвичайно важливі. + Я дійсно не бачу зв’язку між семантичним Інтернетом та простором імен. Семантична павутина - це поняття, простір імен є частиною стандарту XML, ви змішуєте визначення інтерфейсу та деталі реалізації.
Ньютопський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.