Szukaj…


Uwagi

Nazwy elementów i atrybutów w XML nazywane są QNames (nazwy kwalifikowane).

Nazwa QName składa się z:

  • przestrzeń nazw (URI)
  • prefiks (NCName, NC, ponieważ nie zawiera dwukropka)
  • nazwa lokalna (nazwa NCName)

Tylko przestrzeń nazw i nazwa lokalna są odpowiednie do porównywania dwóch nazw QNames. Prefiks jest tylko proxy do przestrzeni nazw.

Przestrzeń nazw i prefiks są opcjonalne, ale przestrzeń nazw jest zawsze obecna, jeśli prefiks jest obecny (jest to zapewnione na poziomie składniowym, więc nie można tego zrobić źle).

Przedstawienie leksykalne nazwy QName to prefix:local-name . Przestrzeń nazw jest powiązana osobno za pomocą specjalnych atrybutów xmlns:... (przypomnienie: atrybuty zaczynające się od xml są zarezerwowane w XML).

Jeśli prefiks jest pusty, w reprezentacji leksykalnej nazwy QName nie jest używany dwukropek, który zawiera tylko nazwę local-name . Nazwy Q z pustym prefiksem albo nie mają przestrzeni nazw (jeśli nie ma domyślnej przestrzeni nazw) lub znajdują się w domyślnej przestrzeni nazw.

Powiąż prefiks z przestrzenią nazw

Przestrzeń nazw to identyfikator URI, ale w celu uniknięcia gadatliwości prefiksy są używane jako proxy.

W poniższym przykładzie prefiks my-prefix jest powiązany z przestrzenią nazw http://www.example.com/my-namespace przy użyciu specjalnego atrybutu xmlns:my-prefix ( my-prefix można zastąpić dowolnym innym prefiksem) :

<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
  <!-- the element my-prefix:foo
       lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>

Brak przestrzeni nazw

W XML nazwy elementów i atrybutów znajdują się w przestrzeniach nazw.

Domyślnie nie znajdują się w przestrzeni nazw:

<?xml version="1.0"?>
<foo attr="value">
  <!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>

Nieistotność prefiksów

Te dwa dokumenty są semantycznie równoważne, ponieważ ważne są przestrzenie nazw, a nie przedrostki.

<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>

<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>

Domyślna przestrzeń nazw

Domyślna przestrzeń nazw to przestrzeń nazw odpowiadająca brakowi jakiegokolwiek prefiksu. Można go zadeklarować za pomocą specjalnego atrybutu xmlns .

<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
  <!-- the element foo is in the namespace
       http://www.example.com/my-namespace -->
</foo>

Jeśli nie zostanie zadeklarowana domyślna przestrzeń nazw, wówczas nazwy bez przedrostka nie będą występować w przestrzeni nazw.

Nazwy atrybutów bez prefiksu

Elementy i atrybuty zachowują się inaczej w stosunku do domyślnych przestrzeni nazw. Jest to często źródłem zamieszania.

Atrybut, którego nazwa nie ma przedrostka, nie występuje w przestrzeni nazw, także gdy domyślny obszar nazw jest objęty zakresem .

<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
  <!-- The attribute attr is in no namespace, even though
       a default namespace is in scope. The element foo,
       however, is in the default namespace. -->
</foo>

Zakres powiązań przestrzeni nazw

Powiązanie przestrzeni nazw (specjalny xmlns lub xmlns:... ) obejmuje wszystkich potomków elementu otaczającego, w tym tego elementu.

<?xml version="1.0"?>
<root>
  <my:element xmlns:my="http://www.example.com/ns1">
    <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  </my:element>
  <my:element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2 -->
  </my:element>
</root>

Powiązanie można zastąpić w zagnieżdżonym elemencie (ma to jednak wpływ na czytelność):

<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:first-child-element/>

  <my:child-element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2,
         including for the element my:child-element -->
  </my:child-element>

  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:last-child-element/>

</my:element>

Bardzo często deklaruje się wszystkie powiązania przestrzeni nazw w elemencie głównym, co poprawia czytelność.

<?xml version="1.0"?>
<root
  xmlns="http://www.example.com/default-namespace"
  xmlns:ns1="http://www.example.com/ns1"
  xmlns:ns2="http://www.example.com/ns2">
  
  <ns1:element>
    <ns2:other-element/>
  </ns1:element>

</root>


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow