Apa arti "xmlns" dalam XML?

415

Saya melihat baris berikut dalam file XML:

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

Saya juga melihat xmlnsbanyak file XML lain yang saya temui.

Apa itu?

pengguna88637
sumber
Sekarang Anda juga harus tahu bahwa mengapa kami mendapatkan kesalahan di xml ketika kami menggunakan tag salah atau di tempat yang salah. :)
Vaibs

Jawaban:

299

Ini mendefinisikan XML Namespace .

Dalam contoh Anda, Awalan Namespace adalah " android " dan URI Namespace adalah " http://schemas.android.com/apk/res/android "

Di dokumen, Anda melihat elemen seperti: <android:foo />

Pikirkan awalan namespace sebagai variabel dengan alias nama pendek untuk URI namespace lengkap. Ini sama <http://schemas.android.com/apk/res/android:foo />dengan menulis berkaitan dengan apa artinya "ketika parser XML membaca dokumen.

CATATAN: Anda tidak dapat benar-benar menggunakan URI namespace lengkap sebagai pengganti awalan namespace dalam dokumen contoh XML.

Lihatlah tutorial ini di namespaces: http://www.sitepoint.com/xml-namespaces-explained/

Mads Hansen
sumber
62
Saya selalu menempelkan URI tersebut ke dalam browser web hanya untuk melihat apa yang dilihat parser, tetapi selalu mengembalikan 404. Apakah itu seharusnya menjadi URI nyata yang memerlukan nama file standar ditempelkan di akhir, atau itu hanya teknik untuk membuat id unik?
Patrick
36
@ Patrick, ya, itu hanya URI yang perlu unik sehingga menunjukkan bahwa itu adalah namespace yang terpisah dari yang lain dan karena itu setiap tag duplikat potensial akan ditafsirkan dengan benar. Jadi URI sering tidak menunjukkan apa-apa.
foochow
3
Hmm ... senang tahu itu namespace. Saya dulu bertanya-tanya apakah menentukan URI membuat halaman html benar-benar mengakses situs web itu untuk menentukan skema.
Nav
17
@ Patrick, URI tidak sama dengan URL. URL adalah pelacak dan URI hanyalah pengidentifikasi. Anda dapat dengan sangat baik memilih GUID sebagai URI. Faktanya, ISBN yang kami miliki untuk buku adalah bentuk URI.
Jaywalker
lalu bagaimana cara kerja tag? Maksud saya <LinearLayoutkarya tanpa awalan?
Asif Mushtaq
676

Ini berarti namespace XML .

Pada dasarnya, setiap elemen (atau atribut) dalam XML milik namespace, cara "memenuhi syarat" nama elemen.

Bayangkan Anda dan saya sama-sama menciptakan XML kami sendiri. Anda menciptakan XML untuk menggambarkan orang, saya menciptakan tambang untuk menggambarkan kota. Kami berdua memasukkan elemen yang disebut name. Milik Anda mengacu pada nama orang tersebut, dan nama saya adalah nama kota — OK, itu sedikit dibuat-buat.

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

Jika dua XML kami digabungkan menjadi satu dokumen, bagaimana kami membedakan kedua nama? Seperti yang Anda lihat di atas, ada dua nameelemen, tetapi keduanya memiliki makna yang berbeda.

Jawabannya adalah Anda dan saya akan menetapkan namespace untuk XML kami, yang akan kami buat unik:

<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>

Sekarang kami telah sepenuhnya memenuhi syarat XML kami, tidak ada ambiguitas tentang apa arti setiap nameelemen. Semua tag yang dimulai dengan personxml:adalah tag milik XML Anda, semua yang dimulai dengan cityxml:milik saya.

Ada beberapa hal yang perlu diperhatikan:

  • Jika Anda mengecualikan deklarasi namespace, semuanya dianggap berada di namespace default.

  • Jika Anda mendeklarasikan namespace tanpa pengenal, yaitu xmlns="http://somenamespace", alih-alih xmlns:rob="somenamespace", itu menentukan namespace default untuk dokumen.

  • Namespace itu sendiri, sering kali merupakan IRI , tidak memiliki konsekuensi nyata. Itu harus unik, sehingga orang cenderung memilih IRI / URI yang mereka miliki, tetapi tidak memiliki makna yang lebih besar dari itu. Kadang-kadang orang akan menempatkan skema (definisi) untuk XML pada IRI yang ditentukan, tetapi itu adalah konvensi beberapa orang saja.

  • Awalan juga tidak ada konsekuensi. Satu-satunya hal yang penting adalah apa namespace awalan didefinisikan sebagai. Beberapa tag dimulai dengan awalan yang berbeda, yang semuanya peta ke namespace yang sama dianggap sama.

    Misalnya, jika awalan personxmldan mycityxmlkeduanya dipetakan ke namespace yang sama (seperti dalam cuplikan di bawah), maka tidak masalah jika Anda awalan elemen tertentu dengan personxmlatau mycityxml, keduanya akan diperlakukan sebagai hal yang sama oleh parser XML . Intinya adalah bahwa parser XML tidak peduli apa yang Anda pilih sebagai awalan, hanya namespace yang dipetakan juga. Awalan hanyalah tipuan yang menunjuk ke namespace.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Atribut dapat dikualifikasikan tetapi pada umumnya tidak. Mereka juga tidak mewarisi ruang nama mereka dari elemen yang mereka gunakan, sebagai lawan dari elemen (lihat di bawah).

Juga, ruang nama elemen diwarisi dari elemen induk. Dengan kata lain saya bisa juga menulis XML di atas sebagai

<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>
Rob Levine
sumber
13
+1 jawaban konseptual yang baik dan bermanfaat. Anda mungkin ingin memenuhi syarat "Pada dasarnya, setiap elemen (atau atribut) dalam xml adalah milik namespace", karena beberapa elemen dan atribut dikatakan dalam "no namespace". Meskipun saya mengerti Anda memberikan dasar-dasarnya.
LarsH
1
@Rob Levine "Atribut dapat diberi spasi nama tetapi umumnya tidak." Bagaimana dengan Android?
Paul Brewczynski
1
Jadi, bagaimana misalnya " your.example.com/xml/person " digunakan? Ok saya punya tag <person: name>, sekarang apa? Bisakah Anda menjelaskan ini juga?
Koray Tugay
1
@WORMSS - Ya - Anda benar. Saat Anda menentukan kueri Anda, Anda perlu menentukan namespace, mungkin melalui awalan. Di dunia C # System.Xml, misalnya, Anda akan mendaftarkan awalan dengan manajer namespace menggunakan XmlNamespaceManager.AddNamespace, lalu gunakan awalan ini dalam kueri Anda. Fakta bahwa awalan tidak muncul dalam dokumen tidak masalah - hanya apa namespace yang dipetakan juga.
Rob Levine
2
Tautan dokumen microsoft ini: " msdn.microsoft.com/en-us/library/aa468565.aspx " menjelaskan namespace dalam XML dengan sangat baik.
Deen John
16

Saya pikir kebingungan terbesar adalah bahwa namespace xml menunjuk ke beberapa jenis URL yang tidak memiliki informasi apa pun. Tetapi kenyataannya adalah orang yang menemukan di bawah namespace:

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

bisa juga menyebutnya seperti itu:

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

Ini hanya pengidentifikasi unik. Namun ditetapkan bahwa Anda harus meletakkan URL di sana yang unik dan berpotensi menunjukkan spesifikasi tag / atribut yang digunakan di namespace tersebut. Itu tidak wajib.

Kenapa harus unik? Karena tujuan namespaces adalah untuk membuatnya unik sehingga atribut misalnya disebut latar belakang dari namespace Anda dapat dibedakan dari latar belakang dari namespace lain.

Karena keunikan itu Anda tidak perlu khawatir bahwa jika Anda membuat atribut khusus Anda, Anda akan memiliki tabrakan nama.

Morfidon
sumber
Hai Morfidon. Tolong, bisakah Anda menambahkan di tautan tautan ke referensi yang menyatakan konten atau URL itu bisa apa saja? Apa yang harus unik? Tolong juga klarifikasi keunikannya: Nama XML namespace atau konten URL? Cheers
olibre
@ Colibre Jika Anda ingin menggunakan namespace android, Anda harus menggunakan namanya. Itu nama unik mereka. Mereka memutuskan untuk meletakkan URL di sana. Jika Anda membuat namespace Anda sendiri maka Anda dapat menyebutnya apa pun yang Anda inginkan, pastikan itu unik. Dikatakan bahwa Anda harus menggunakan URL yang menunjuk ke tempat di mana Anda menggambarkan apa yang ada di dalam namespace itu tetapi karena Anda dapat melihat bahkan pembuat namespace android tidak melakukannya.
Morfidon
Terima kasih, Morfidon. Saya akhirnya mengerti poin itu ketika membaca jawaban Rob . Saya suka jawaban Anda karena menyoroti aspek penting yang tidak dikenal. Tetapi tolong coba tingkatkan jawaban Anda, jelaskan bagian mana yang harus unik, berikan referensi, ulangi, periksa kata-katanya ... Beberapa pembaca mungkin bingung dengan jawaban Anda saat ini. Cheers
olibre
1
Ini jawaban yang saya butuhkan! Jadi membingungkan untuk menggunakan URI untuk nilai atribut ini, karena orang berpikir URI = URL, dan berharap bahwa beberapa dokumen harus berada di lokasi. Tapi AFAICT benar-benar baik-baik saja jika URI mengembalikan 404. Ini hanya pengidentifikasi unik yang kebetulan terlihat seperti alamat. Mungkin ada beberapa validator khusus yang berharap untuk menemukan skema atau DTD di lokasi itu (yang masuk akal), tetapi saya rasa ini adalah kasus khusus. Harap perbaiki saya jika saya salah di sini.
brennanyoung
1
@brennanyoung persis seperti yang Anda katakan :)
Morfidon
12

xmlns - xml namespace. Itu hanya metode untuk menghindari konflik nama elemen. Sebagai contoh:

<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>

Dua nodeelemen berbeda dalam satu file xml. Tanpa ruang nama file ini tidak akan valid.

Yuriy
sumber
4

Anda memiliki ruang nama sehingga Anda dapat memiliki elemen unik secara global. Namun, 99% dari waktu ini tidak terlalu penting, tetapi ketika Anda menempatkannya dalam perspektif The Semantic Web , itu mulai menjadi penting.

Misalnya, Anda bisa membuat XML mash-up dari berbagai skema hanya dengan menggunakan yang sesuai xmlns. Misalnya, tumbuk teman teman dengan vCard , dll.

Jon
sumber
untuk xml sepele mungkin saya abaikan, karena semua ruang nama yang lain sangat penting. + Saya benar-benar tidak melihat hubungan antara web semantik dan namespace. Web semantik adalah sebuah konsep, namespace adalah bagian dari standar XML, Anda mencampurkan definisi antarmuka dan detail implementasi.
Newtopian