targetNamespace i xmlns bez prefiksu, jaka jest różnica?

W dokumencie schematu xml, jeśli mam zarówno targetNamespace, jak i xmlns bez prefiksu .

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://example.com/" xmlns="http://example.com/">
Jaka jest dokładna różnica między nimi? Rozumiem, że jeśli masz xmlns bez prefiksu, wszystkie elementy bez prefiksu otrzymują tę przestrzeń nazw i...mylnie to samo dotyczy targetNamespace.
Author: M. A. Kishawy, 2011-08-25

5 answers

TargetNamespace to "artefakt" schematu XML; jego cel: wskazanie, jaką konkretną przestrzeń nazw XML opisuje plik schematu.

Xmlns - ponieważ schemat XML jest dokumentem XML, możliwe jest zdefiniowanie domyślnej przestrzeni nazw XML dla samego pliku XML (tak robi atrybut xmlns); implikacje są wielokrotne: authoring i skład. Na przykład, nie trzeba używać prefiksu dla elementów zdefiniowanych w schemacie, które są później odwołuje się w innym miejscu w tym samym pliku (np. globalny simpleType używany jako typ atrybutu lub elementu).

Z mojego doświadczenia wynika, że wielu autorów XML Schema uważa to za"najlepszą praktykę"... więc jesteś na dobrej drodze.

W odniesieniu do XSD, targetNamespace określa część przestrzeni nazw kwalifikowanej nazwy komponentu schematu, która zawiera elementy, atrybuty, grupy i grupy atrybutów oraz typy proste i złożone. Niektóre z kwalifikowanych nazw zdefiniowanych w XSD (elementy i atrybuty) są" bezpośrednio " używane przez dokument instancji XML. Inne, takie jak dla typów, mogą być odwołane za pomocą atrybutu xsi:type w przykładowych dokumentach XML. Pozostałe (grupy, grupy atrybutów) mają ułatwić skład schematów (poprzez odniesienia).

Jestem też zdania, że (ogólnie) ludzie przy projektowaniu XSD pod dwoma kątami:

  • Aby dopasować istniejący XML. W tym przypadku, jeśli twój XML używa przestrzeni nazw, dla każdego z przestrzenie nazw używane, skończysz z elementem schematu XSD z dopasowanym atrybutem targetNamespace.

  • Czyste modelowanie. Następnie myślimy o przestrzeni targetNamespace podobnej do pakietu UML, schematu bazy danych, pakietu Java lub przestrzeni nazw. NET i wszystko, co w tym przypadku oznacza. Zasadniczo jest to mechanizm unikania kolizji nazw; niemniej jednak jest to również mechanizm podziału modeli w obszarach tematycznych itp.

 71
Author: Petru Gardea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 12:56:52

Dla tych, którzy nadal są zdezorientowani, rozważ te trzy XSD. Wszystkie one definiują jeden globalny typ i jedną globalną definicję elementu, która się do niego odwołuje.

Po pierwsze, xsd jak ten zamieszczony powyżej. Używa prefiksu "xsd" dla przestrzeni nazw schematu i domyślnej przestrzeni nazw dla targetNamespace:

<xsd:schema 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://example.com/" 
  xmlns="http://example.com/">

  <xsd:element name="aGlobalElement" type="aGlobalType"/>

  <xsd:simpleType name="aGlobalType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>   
</xsd:schema>  

Teraz ten sam xsd, ale definiowanie i używanie prefiksu przestrzeni nazw dla docelowej przestrzeni nazw:

<xsd:schema 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://example.com/" 
  xmlns:tns="http://example.com/">

  <xsd:element name="aGlobalElement" type="tns:aGlobalType"/>

  <xsd:simpleType name="aGlobalType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType> 
</xsd:schema>  

...i wreszcie wersja, która używa domyślnej przestrzeni nazw zamiast "xsd" dla przestrzeni nazw schematu XML:

<schema 
  xmlns="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://example.com/" 
  xmlns:tns="http://example.com/">

  <element name="aGlobalElement" type="tns:aGlobalType"/>

  <simpleType name="aGlobalType">
    <restriction base="string"/>
  </simpleType>
</schema>

Większość autorów schematu wybiera pierwszy lub ostatni, ponieważ jeśli domyślna przestrzeń nazw jest dostępna, możemy równie dobrze użyć jej do czegoś .

 15
Author: kimbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-08 14:35:24

Xmlns

Atrybut xmlns Ustawia domyślną przestrzeń nazw opisywanego elementu. Domyślna przestrzeń nazw jest zatem stosowana do wszystkich elementów wewnątrz opisywanego elementu, które nie deklarują jawnie innej przestrzeni nazw dla siebie.

Domyślna przestrzeń nazw jest ustawiona na standardową wartość dla plików WSDL: http://www.w3.org/ns/wsdl

TargetNameSpace

Ten atrybut zawiera Przestrzeń nazw twojego serwisu internetowego. Możesz wybieraj tę przestrzeń nazw swobodnie, ale istnieje konwencja mówiąca, że URI powinien wskazywać na WSDL usługi.

Xmlns: tns

Ta przestrzeń nazw powinna być ustawiona na ten sam URI co atrybut targetNameSpace. W ten sposób możesz odnosić się do docelowej przestrzeni nazw za pomocą prefiksu przestrzeni nazw (TNS).

Źródło: http://tutorials.jenkov.com/wsdl/description.html

 13
Author: HakunaMatata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-15 19:39:13

targetNamespace jest atrybutem schema elementu definiuje przestrzeń nazw tj. pakiet w pliku XSD. Zgodnie z konwencją używamy URI / Urli, ale możemy użyć dowolnego ciągu znaków.

xmlns is atrybut jest używany do odwoływania się do elementów i typów danych, które pochodzą z wartości atrybutu xmlns dla bieżącego zakresu elementu.

Na Przykład:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" jest z prefiksem jako xsd oznacza, że przestrzeń nazw powinna być poprzedzona prefiksem xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" bez prefiksu jest domyślne
  • xmlns: p="http://www.example.com/People" jest z prefiksem jako p oznacza, że przestrzeń nazw powinna być poprzedzona prefiksem p:

Gdzie xmlns:xsd i xmlns:p są nazwami QNames, a xmlns jest nazwą lokalną.

Poniższy obrazek pomaga zrozumieć XSD używając analogii Javy zgodnie z moją wiedzą:

Tutaj wpisz opis obrazka

 3
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-11 12:29:55

Po kilku dokładnych testach z użyciem xmllint myślę, że znalazłem dokładne wyjaśnienie tutaj. Rozważ poniższy schemat:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns:p="http://abced.com"
xmlns:q="http://pqr.com"
xmlns="http://yyyzzz.com">

<xsd:element name="recipe" type="recipeType" />

<xsd:complexType name="recipeType">
    <xsd:simpleContent>
        <xsd:extension base="xsd:string">
        <xsd:attribute name="desc" type="xsd:string"  />
        <xsd:attribute name="archetype" type="xsd:string" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>
</xsd:schema>

Powyższy schemat jest zgodny z poniższym dokumentem:

<?xml version="1.0"?>

<recipe xmlns="http://yyyzzz.com">
    Deciphering the purpose of targetNamespace
</recipe>

Powodem, dla którego działa, jest to, że xmlns="http://yyyzzz.com" automatycznie wiąże się również z elementem zdefiniowanym przez schemat! Oznacza to, że wiąże się również z elementem recipeType .

Teraz z tym samym dokumentem xml, ale z nieco zmodyfikowanym schematem jak poniżej również waliduje i przyjrzyj się bliżej różnicy:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns="http://eigenfield.aparicio.com"
xmlns:EGboy="http://yyyzzz.com">

<xsd:element name="recipe" type="EGboy:recipeType" />

<xsd:complexType name="recipeType">
    <xsd:simpleContent>
        <xsd:extension base="xsd:string">
        <xsd:attribute name="desc" type="xsd:string"  />
        <xsd:attribute name="archetype" type="xsd:string" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

</xsd:schema> 

Ignoruj, jeśli inne xmlns zaginęły, ale zamiast tego przyjrzyj się uważnie type= "EGboy: recipeType" . Nie możemy już polegać na xmlns, ponieważ ma inną wartość, dlatego musimy umieścić prefiks EGboy przed recipeType.

Dokument xml nawet nie dba o prefiks EGboy ten prefiks jest tylko dla schematu, aby odnosić się do właściwego xmlns W przypadku, gdy jest ich wiele.

 -1
Author: ifelsemonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 06:14:46