Co oznacza „xmlns” w XML?

415

W pliku XML zobaczyłem następujący wiersz:

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

Widziałem także xmlnsw wielu innych plikach XML, które napotkałem.

Co to jest?

użytkownik88637
źródło
Teraz musisz także wiedzieć, dlaczego otrzymujemy błędy w pliku XML, gdy używamy tagów niepoprawnie lub w niewłaściwym miejscu. :)
Vaibs

Odpowiedzi:

299

Definiuje przestrzeń nazw XML .

W twoim przykładzie prefiks przestrzeni nazw to „ android ”, a identyfikator URI przestrzeni nazw to „ http://schemas.android.com/apk/res/android

W dokumencie widać elementy takie jak: <android:foo />

Pomyśl o prefiksie przestrzeni nazw jako o zmiennej z krótkim aliasem nazwy dla pełnego identyfikatora URI przestrzeni nazw. Jest to odpowiednik pisania <http://schemas.android.com/apk/res/android:foo />w odniesieniu do tego, co „znaczy”, gdy parser XML odczytuje dokument.

UWAGA: W rzeczywistości nie można użyć pełnego identyfikatora URI przestrzeni nazw zamiast przedrostka przestrzeni nazw w dokumencie instancji XML.

Sprawdź ten samouczek dotyczący przestrzeni nazw: http://www.sitepoint.com/xml-namespaces-explained/

Mads Hansen
źródło
62
Zawsze wklejam te identyfikatory URI do przeglądarki internetowej, aby zobaczyć, na co patrzy analizator składni, ale zawsze zwraca 404. Czy to powinien być prawdziwy identyfikator URI, który wymaga podania standardowej nazwy pliku na końcu, czy to tylko technika za zrobienie unikalnego identyfikatora?
Patrick
36
@Patrick tak, to tylko identyfikator URI, który musi być unikalny, aby wskazać, że jest to oddzielna przestrzeń nazw od innych i dlatego wszelkie potencjalne zduplikowane tagi zostaną poprawnie zinterpretowane. Dlatego identyfikator URI często wskazuje na nic.
foochow
3
Hmm ... dobrze wiedzieć, że to przestrzeń nazw. Zastanawiałem się kiedyś, czy podanie identyfikatora URI sprawiło, że strona html faktycznie uzyskała dostęp do tej witryny w celu ustalenia schematu.
Nav
17
@Patrick, identyfikator URI nie jest taki sam jak adres URL. Adres URL to lokalizator, a identyfikator URI to tylko identyfikator. Możesz bardzo dobrze wybrać identyfikator GUID jako identyfikator URI. W rzeczywistości ISBN, który mamy dla książek, jest formą URI.
Jaywalker
jak działają tagi? Mam na myśli <LinearLayoutprace bez prefiksu?
Asif Mushtaq,
676

Oznacza przestrzeń nazw XML .

Zasadniczo każdy element (lub atrybut) w XML należy do przestrzeni nazw, co jest sposobem „kwalifikowania” nazwy elementu.

Wyobraź sobie, że oboje tworzymy własny XML. Wymyślasz XML, aby opisywać ludzi, ja tworzę mój, by opisywać miasta. Oboje zawierają element o nazwie name. Twoje odnosi się do nazwiska osoby, a moje do nazwy miasta - OK, to trochę wymyślone.

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

Gdyby nasze dwa pliki XML zostały połączone w jeden dokument, jak rozróżnilibyśmy te dwie nazwy? Jak widać powyżej, istnieją dwa nameelementy, ale oba mają różne znaczenia.

Odpowiedź jest taka, że ​​ty i ja obaj przypisalibyśmy przestrzeń nazw do naszego XML, co uczynilibyśmy unikalnym:

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

Teraz w pełni zakwalifikowaliśmy nasz kod XML, nie ma dwuznaczności co do tego, co nameoznacza każdy element. Wszystkie znaczniki, które zaczynają się od, personxml:są znacznikami należącymi do Twojego XML, wszystkie, które zaczynają się, cityxml:są moje.

Należy zwrócić uwagę na kilka punktów:

  • Jeśli wykluczysz jakiekolwiek deklaracje przestrzeni nazw, rzeczy będą uważane za znajdujące się w domyślnej przestrzeni nazw.

  • Jeśli zadeklarujesz przestrzeń nazw bez identyfikatora, to znaczy xmlns="http://somenamespace"zamiast xmlns:rob="somenamespace"określa domyślną przestrzeń nazw dla dokumentu.

  • Rzeczywista sama przestrzeń nazw, często IRI , nie ma rzeczywistych konsekwencji. Powinien być wyjątkowy, więc ludzie wybierają posiadany IRI / URI, ale nie ma to większego znaczenia. Czasami ludzie umieszczają schemat (definicję) XML w określonym IRI, ale jest to konwencja tylko dla niektórych osób.

  • Prefiks również nie ma znaczenia. Liczy się tylko to, jaka przestrzeń nazw jest zdefiniowana jako prefiks. Kilka znaczników rozpoczynających się od różnych prefiksów, z których wszystkie są mapowane do tej samej przestrzeni nazw, uważa się za takie same.

    Na przykład, jeśli prefiksy personxmli mycityxmloba zostały zmapowane do tej samej przestrzeni nazw (jak w poniższym fragmencie), nie miałoby znaczenia, czy dany element został poprzedzony znakiem personxmllub mycityxml, obie byłyby traktowane tak samo przez parser XML . Chodzi o to, że parser XML nie dba o to, co wybrałeś jako przedrostek, tylko o odwzorowaną przestrzeń nazw. Prefiks to tylko pośrednia wskazówka na przestrzeń nazw.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Atrybuty mogą być kwalifikowane, ale generalnie nie są. Także oni nie dziedziczą ich nazw od elementu są one na, w przeciwieństwie do elementów (patrz niżej).

Ponadto przestrzenie nazw elementów są dziedziczone z elementu nadrzędnego. Innymi słowy, równie dobrze mogłem napisać powyższy XML jako

<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
źródło
13
+1 dobra, pomocna odpowiedź pojęciowa. Możesz zakwalifikować się „Zasadniczo każdy element (lub atrybut) w xml należy do przestrzeni nazw”, ponieważ niektóre elementy i atrybuty są w „brak przestrzeni nazw”. Chociaż rozumiem, że dałeś podstawy.
LarsH
1
@Rob Levine „Atrybuty mogą mieć przestrzeń nazw, ale generalnie nie są”. Co z Androidem?
Paul Brewczynski
1
Jak na przykład używany jest „ twój.przyklad.com/xml/person ”? Ok mam tag <person: name>, co teraz? Czy możesz to również wyjaśnić?
Koray Tugay
1
@ WORMSS - Tak - masz rację. Podczas definiowania zapytania należy określić przestrzeń nazw, prawdopodobnie za pomocą prefiksu. Na przykład w świecie C # System.Xml należy zarejestrować prefiks w menedżerze przestrzeni nazw przy użyciu XmlNamespaceManager.AddNamespace, a następnie użyć tego prefiksu w zapytaniu. Fakt, że przedrostek nie pojawia się w dokumencie, nie ma znaczenia - tylko to, jaką przestrzeń nazw odwzorowuje.
Rob Levine,
2
Ten link do dokumentu Microsoft: „ msdn.microsoft.com/en-us/library/aa468565.aspx ” bardzo dobrze wyjaśnia przestrzeń nazw w XML.
Deen John,
16

Myślę, że największym zamieszaniem jest to, że przestrzeń nazw xml wskazuje na jakiś adres URL, który nie zawiera żadnych informacji. Ale prawda jest taka, że ​​osoba, która wynalazła poniżej przestrzeni nazw:

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

może również tak to nazwać:

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

To tylko unikalny identyfikator. Jednak ustalono, że powinieneś umieścić tam URL, który jest unikalny i może potencjalnie wskazywać na specyfikację używanych tagów / atrybutów w tej przestrzeni nazw. To nie jest wymagane.

Dlaczego powinien być wyjątkowy? Ponieważ celem przestrzeni nazw jest ich unikalność, aby na przykład atrybut o nazwie tło z przestrzeni nazw mógł być odróżniony od tła z innej przestrzeni nazw.

Ze względu na tę wyjątkowość nie musisz się martwić, że po utworzeniu niestandardowego atrybutu wystąpi kolizja nazwy.

Morfidon
źródło
Cześć Morfidon. Czy mógłbyś dodać w swojej odpowiedzi link do referencji określającej, że treść lub adres URL mogą być czymkolwiek? Co musi być wyjątkowe? Proszę również wyjaśnić wyjątkowość: nazwę przestrzeni nazw XML lub treść adresu URL? Na zdrowie
olibre
@olibre Jeśli chcesz korzystać z przestrzeni nazw Androida, powinieneś użyć ich nazwy. To jest ich unikalna nazwa. Postanowili umieścić tam adres URL. Jeśli tworzysz własną przestrzeń nazw, możesz ją nazwać, jak chcesz, tylko upewnij się, że jest wyjątkowa. Mówi się, że powinieneś używać adresu URL, który wskazuje miejsce, w którym opisujesz, co jest w tej przestrzeni nazw, ale jak widać, nawet twórcy przestrzeni nazw Androida tego nie zrobili.
Morfidon,
Dzięki Morfidon. W końcu zrozumiałem ten punkt, czytając odpowiedź Roba . Podoba mi się twoja odpowiedź, ponieważ podkreśla ważny aspekt, który nie jest dobrze znany. Ale spróbuj poprawić swoją odpowiedź, wyjaśnij, która część musi być unikalna, podaj odniesienia, przeformułowanie, sprawdź sformułowanie ... Niektórzy czytelnicy mogą być zdezorientowani obecną odpowiedzią. Na zdrowie
olibre
1
Oto odpowiedź, której potrzebowałem! Mylące jest używanie URI dla tej wartości atrybutu, ponieważ ludzie myślą, że URI = URL i oczekują, że jakiś dokument powinien znajdować się w tej lokalizacji. Ale AFAICT jest całkowicie w porządku, jeśli URI zwraca 404. To tylko unikalny identyfikator, który wygląda jak adres. Mogą istnieć specjalne walidatory, które spodziewają się znaleźć schemat lub DTD w tej lokalizacji (co miałoby sens), ale myślę, że są to szczególne przypadki. Popraw mnie, jeśli się tu mylę.
brennanyoung
1
@brennanyoung jest dokładnie tak, jak powiedziałeś :)
Morfidon
12

xmlns - przestrzeń nazw xml. To tylko metoda uniknięcia konfliktów nazw elementów. Na przykład:

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

Dwa różne nodeelementy w jednym pliku xml. Bez przestrzeni nazw ten plik nie byłby prawidłowy.

Jurij
źródło
4

Masz przestrzenie nazw, dzięki czemu możesz mieć globalnie unikalne elementy. Jednak w 99% przypadków to nie ma znaczenia, ale kiedy spojrzysz na to z perspektywy Sieci Semantycznej , zaczyna ona nabierać znaczenia.

Na przykład można wykonać połączenie różnych schematów XML za pomocą odpowiedniego xmlns. Na przykład zmiksuj znajomego znajomego za pomocą vCard itp.

Jon
źródło
w przypadku trywialnego XML-a mógłbym to zignorować, ponieważ wszystkie inne przestrzenie nazw są niezwykle ważne. + Naprawdę nie widzę związku między siecią semantyczną a przestrzenią nazw. Sieć semantyczna jest pojęciem, przestrzeń nazw jest częścią standardu XML, łączysz definicję interfejsu i szczegóły implementacji.
Newtopian