XML'deki “xmlns” ne anlama geliyor?


415

Bir XML dosyasında aşağıdaki satırı gördüm:

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

Karşılaştığım xmlnsbirçok XML dosyasında da gördüm .

Bu ne?




Şimdi, etiketleri yanlış veya yanlış yerde kullandığımızda neden xml'de hata aldığımızı bilmelisiniz. :)
Vaibs

Yanıtlar:


299

Bir XML Ad Alanı tanımlar .

Örneğin, Ad Alanı Öneki " android " ve Ad Alanı URI'si " http://schemas.android.com/apk/res/android "

Belgede aşağıdaki gibi öğeler görürsünüz: <android:foo />

Ad alanı önekini, tam ad alanı URI'sı için kısa ad takma adı olan bir değişken olarak düşünün. <http://schemas.android.com/apk/res/android:foo />Bir XML ayrıştırıcısı belgeyi okuduğunda bunun "ne anlama geldiğine" ilişkin olarak yazmanın karşılığıdır .

NOT: Bir XML örneği belgesindeki ad alanı öneki yerine tam ad alanı URI'sini kullanamazsınız.

Ad alanlarındaki bu eğiticiye göz atın: http://www.sitepoint.com/xml-namespaces-explained/


62
Ayrıştırıcının neye baktığını görmek için her zaman bu URI'leri bir web tarayıcısına yapıştırırım, ancak her zaman 404 döndürür. Sonuna kadar standart bir dosya adına ihtiyaç duyan gerçek bir URI olması mı gerekiyor yoksa sadece bir teknik mi? benzersiz bir kimlik oluşturmak için?
Patrick

36
@Patrick evet, diğerlerinden ayrı bir ad alanı olduğunu ve bu nedenle olası yinelenen etiketlerin doğru şekilde yorumlanacağını göstermek için benzersiz olması gereken bir URI. Bu yüzden URI genellikle hiçbir şeye işaret etmeyecektir.
Foochow

3
Hmm ... bunun bir isim alanı olduğunu bilmek güzel. Bir URI belirtmenin html sayfasını gerçekten bir şema belirlemek için bu web sitesine erişmesini sağlayıp sağlamadığını merak ederdim.
Nav

17
@Patrick, URI URL ile aynı değil. Bir URL bir konumlandırıcıdır ve bir URI yalnızca bir tanımlayıcıdır. Bir GUID'yi URI olarak çok iyi seçebilirsiniz. Aslında, kitaplar için sahip olduğumuz ISBN bir URI biçimidir.
Jaywalker

Etiketler nasıl çalışır? <LinearLayoutÖnek olmadan çalışır yani ?
Asif Mushtaq

676

XML ad alanı anlamına gelir .

Temel olarak, her elemanın (veya nitelik) XML bir ad, elemanın "eleme" isminin bir şekilde aittir.

Siz ve ben, kendi XML'imizi icat ettiğimizi düşünün. Sen insanları tanımlamak için XML icat, ben şehirleri tanımlamak için benim icat. Kimizde de denilen bir element var name. Seninki kişinin adına, benimki de şehir adına atıfta bulunuyor - Tamam, biraz yapmacık.

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

İki XML'imiz tek bir belgede birleştirildiyse, iki adı nasıl birbirinden ayırabiliriz? Yukarıda görebileceğiniz gibi, iki nameunsur vardır, ancak her ikisinin de farklı anlamları vardır.

Cevap, siz ve ben XML'imize benzersiz bir ad alanı atayacağımızdır:

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

Şimdi XML'imizi tam olarak nitelendirdik, her bir nameöğenin ne anlama geldiği konusunda bir belirsizlik yok . İle başlayan personxml:tüm etiketler XML'inize ait etiketlerdir, ile başlayan tüm etiketler cityxml:benimdir.

Unutulmaması gereken birkaç nokta vardır:

  • Herhangi bir ad alanı bildirimini hariç tutarsanız, işler varsayılan ad alanında kabul edilir.

  • Tanımlayıcı olmadan bir ad alanı bildirirseniz , bunun xmlns="http://somenamespace"yerine xmlns:rob="somenamespace"belgenin varsayılan ad alanını belirtir.

  • Gerçek ad alanının kendisi, genellikle bir IRI , gerçek bir sonucu yoktur. Benzersiz olmalı, bu yüzden insanlar sahip oldukları bir IRI / URI'yi seçme eğilimindedir, ancak bundan daha büyük bir anlamı yoktur. Bazen insanlar XML için şemayı (tanım) belirtilen IRI'ye yerleştirir, ancak bu sadece bazı kişilerin konvansiyonudur.

  • Ön ekin de bir sonucu yoktur. Önemli olan tek şey önekin tanımlandığı ad alanıdır. Farklı öneklerle başlayan ve hepsi aynı ad alanına eşlenen birkaç etiket aynı kabul edilir.

    Örneğin, önekler personxmlve mycityxmlher ikisi de aynı ad alanına eşlendiyse (aşağıdaki snippet'te olduğu gibi), belirli bir öğeye ön ek eklemiş olmanız personxmlveya mycityxmlher ikisine de XML ayrıştırıcısı tarafından aynı şey olarak davranılması önemli değildir. . Mesele şu ki, bir XML ayrıştırıcısı önek olarak ne seçtiğinizi umursamaz, sadece haritaladığı ad alanını da dikkate alır. Öneki sadece bir indirection ad işaret.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Nitelikler kalifiye olabilir ancak genellikle değildir. Onlar da bunu değil elemanları (aşağıya bakınız) aksine, bunlar üzerinde eleman kendi ad devralır.

Ayrıca, öğe ad alanları üst öğeden devralınır. Başka bir deyişle, yukarıdaki XML'yi eşit olarak yazabilirdim

<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 iyi, yararlı kavramsal cevap. Bazı öğeler ve özniteliklerin "ad alanı" olmadığı söylendiği için "Temel olarak, xml'deki her öğe (veya öznitelik) bir ad alanına aittir" seçeneğini kullanmak isteyebilirsiniz. Gerçi temelleri verdiğinizi anlıyorum.
LarsH

1
@Rob Levine "Nitelikler ad boşluklu olabilir, ancak genellikle değildir." Android ne olacak?
Paul Brewczynski

1
Peki, örneğin " your.example.com/xml/person " nasıl kullanılır? Tamam bir <person: name> etiketim var, şimdi ne olacak? Bunu da açıklayabilir misiniz lütfen?
Koray Tugay

1
@WORMSS - Evet - haklısın. Sorgunuzu tanımladığınızda, muhtemelen bir önek aracılığıyla ad alanını belirtmeniz gerekir. Örneğin, C # System.Xml dünyasında, XmlNamespaceManager.AddNamespace'i kullanarak ad alanı yöneticisine bir önek kaydeder ve ardından sorgunuzda bu öneki kullanırsınız. Ön ekin belgede görünmemesi önemli değildir - yalnızca hangi ad alanını da eşleştirir.
Rob Levine

2
Bu microsoft belge bağlantısı: " msdn.microsoft.com/en-us/library/aa468565.aspx " XML'deki ad alanını çok iyi açıklıyor.
Deen John

16

Bence en büyük karışıklık xml ad alanının herhangi bir bilgi içermeyen bir tür URL'yi işaret ediyor olmasıdır. Ama gerçek şu ki, ad alanının altında icat eden kişi:

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

ayrıca şöyle diyebiliriz:

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

Bu sadece benzersiz bir tanımlayıcıdır. Bununla birlikte, benzersiz olan ve potansiyel olarak bu ad alanında kullanılan etiketlerin / özelliklerin belirtilmesine işaret edebilecek bir URL koymanız gerektiği tespit edilmiştir. Tho gerekli değildir.

Neden benzersiz olmalı? Ad alanlarının amacı onları benzersiz kılmaktır, böylece ad alanınızdan arka plan olarak adlandırılan öznitelik , başka bir ad alanından arka plandan ayırt edilebilir .

Bu benzersizlik nedeniyle, özel özelliğinizi oluşturursanız isim çarpışması yaşayacağınızdan endişelenmenize gerek yoktur.


Merhaba Morfidon. Lütfen yanıtınıza içeriğin veya URL'nin herhangi bir şey olabileceğini belirten bir referansa bağlantı ekleyebilir misiniz? Benzersiz olan ne olmalı? Lütfen benzersizliği de netleştirin: XML ad alanının adı mı yoksa URL'nin içeriği mi? Şerefe
olibre

@olibre Android'in ad alanını kullanmak istiyorsanız, adlarını kullanmalısınız. Bu onların benzersiz adı. Oraya bir URL koymaya karar verdiler. Kendi ad alanınızı oluşturuyorsanız, istediğiniz her şeyi arayabilirsiniz, benzersiz olduğundan emin olun. Bu ad alanının içinde ne olduğunu açıkladığınız yere işaret eden URL'yi kullanmanız gerektiği, ancak android ad alanının yaratıcılarının bile görmediği söyleniyor.
Morfidon

Teşekkürler Morfidon. Sonunda Rob'un cevabını okurken bu noktayı anladım . Cevabınızı seviyorum çünkü iyi bilinmeyen önemli bir yönü vurguluyor. Ancak lütfen cevabınızı geliştirmeye çalışın, hangi bölümün benzersiz olması gerektiğini netleştirin, referanslar verin, yeniden ifade edin, ifadeleri kontrol edin ... Bazı okuyucular mevcut cevabınızla karıştırılabilir. Şerefe
olibre

1
İhtiyacım olan cevap bu! Bu özellik değeri için bir URI kullanmak çok kafa karıştırıcıdır, çünkü insanlar URI = URL'yi düşünür ve bazı belgelerin konumda bulunmasını bekler. Ancak, URI bir 404 döndürürse AFAICT tamamdır. Bu sadece bir adres gibi görünen benzersiz bir tanımlayıcıdır. Bu konumda bir şema veya DTD bulmayı bekleyen bazı özel doğrulayıcılar olabilir (ki bu mantıklı olacaktır), ancak bunlar bence özel durumlar. Burada yanılıyorsam lütfen beni düzeltin.
brennanyoung

1
@brennanyoung tam olarak söylediğin gibi :)
Morfidon

12

xmlns - xml ad alanı. Sadece öğe adı çakışmalarını önlemek için bir yöntem. Örneğin:

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

nodeBir xml dosyasında iki farklı öğe. Ad alanları olmadan bu dosya geçerli olmaz.


4

Global olarak benzersiz öğelere sahip olabilmeniz için ad alanlarınız var. Bununla birlikte, zamanın% 99'u gerçekten önemli değil, ancak Anlamsal Web'in , önemli olmaya başlar.

Örneğin, yalnızca uygun olanı kullanarak farklı şemaların XML birleşimini yapabilirsiniz xmlns. Örneğin, bir arkadaşınızın arkadaşını vCard vb.İle karıştırın .


önemsiz xml için göz ardı edilebilir, diğer her şey için ad alanları son derece önemlidir. + Anlamsal web ve ad alanı arasındaki bağlantıyı gerçekten görmüyorum. Anlamsal web bir kavramdır, ad alanı XML standardının bir parçasıdır, arayüz tanımını ve uygulama ayrıntılarını karıştırıyorsunuz.
Newtopian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.