W pliku XML zobaczyłem następujący wiersz:
xmlns:android="http://schemas.android.com/apk/res/android"
Widziałem także xmlns
w wielu innych plikach XML, które napotkałem.
Co to jest?
W pliku XML zobaczyłem następujący wiersz:
xmlns:android="http://schemas.android.com/apk/res/android"
Widziałem także xmlns
w wielu innych plikach XML, które napotkałem.
Co to jest?
Odpowiedzi:
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/
<LinearLayout
prace bez prefiksu?
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 name
elementy, 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 name
oznacza 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 personxml
i mycityxml
oba zostały zmapowane do tej samej przestrzeni nazw (jak w poniższym fragmencie), nie miałoby znaczenia, czy dany element został poprzedzony znakiem personxml
lub 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>
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.
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 node
elementy w jednym pliku xml. Bez przestrzeni nazw ten plik nie byłby prawidłowy.
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.