У XML-файлі я побачив наступний рядок:
xmlns:android="http://schemas.android.com/apk/res/android"
Я також бачив xmlns
у багатьох інших XML-файлах, які я натрапив.
Що це?
У XML-файлі я побачив наступний рядок:
xmlns:android="http://schemas.android.com/apk/res/android"
Я також бачив xmlns
у багатьох інших XML-файлах, які я натрапив.
Що це?
Відповіді:
Він визначає простір імен 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/
<LinearLayout
твори без префікса?
Це означає простір імен 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>
Думаю, найбільша плутанина полягає в тому, що простір імен xml вказує на якусь URL-адресу, яка не має ніякої інформації. Але правда полягає в тому, що людина, яка вигадала нижче простір імен:
xmlns:android="http://schemas.android.com/apk/res/android"
можна також назвати так:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
Це просто унікальний ідентифікатор. Однак встановлено, що вам слід вказати унікальну URL-адресу, яка потенційно може вказувати на специфікацію використовуваних тегів / атрибутів у цьому просторі імен. Це не потрібно.
Чому він повинен бути унікальним? Оскільки, простори імен мають на меті створити їх унікальні, тож атрибут, наприклад, названий background з вашого простору імен, можна відрізнити від фону з іншого простору імен.
Через цю унікальність вам не потрібно турбуватися, що якщо ви створите власний атрибут, у вас виникне зіткнення імен.
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-файлі. Без просторів імен цей файл не був би дійсним.
У вас є простори імен, щоб ви могли мати унікальні в усьому світі елементи. Однак 99% часу це насправді не має значення, але коли ви ставите це в перспективі The Semantic Web , воно починає набувати важливого значення.
Наприклад, ви можете зробити XML-розбір різних схем, просто скориставшись відповідними xmlns
. Наприклад, замісити товариша друга з vCard тощо.