2011-08-25 12 views
58

In un documento dello schema xml, se si dispone sia di targetNamespace che di xmlns senza prefisso.targetNamespace e xmlns senza prefisso, qual è la differenza?

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

Qual è la differenza esatta tra di loro? La mia comprensione è che se si ha un xmlns senza prefisso, tutti gli elementi senza prefisso ottengono quel namespace e ... lo stesso vale per lo spazio dei nomi target.

+0

potrei mancare una certa conoscenza su questo argomento, ma non poteva essere la risposta basta: xmlns è il namespace di default per questo documento (il documento dello schema), mentre targetNamespace è lo spazio dei nomi che questo documento dello schema valida? E in questo modo xmlns e targetNamespace sono due cose diverse? – Vering

+0

@Verché i risultati del mio test sono in concomitanza con la prima frase sì, lo spazio dei nomi di destinazione si riferisce sicuramente al documento che lo schema convalida. La presenza di targetNamespace sembra inoltre richiedere la presenza di "xmlns" o "xmlns: xxx". In effetti puoi combinare molti 'xmlns: xxx', 'xmlns: yyy' e 'xmlns' insieme e continua a convalidare. – ifelsemonkey

risposta

67

targetNamespace è uno "schema" XML Schema; il suo scopo: indicare quale particolare spazio dei nomi XML descrive il file dello schema.

xmlns - poiché lo schema XML è un documento XML, è quindi possibile definire uno spazio dei nomi XML predefinito per il file XML stesso (questo è ciò che fa l'attributo xmlns); le implicazioni sono molteplici: creazione e composizione. Ad esempio, non è necessario utilizzare un prefisso per gli elementi definiti nello schema, che vengono successivamente indicati altrove nello stesso file (ad esempio un tipo semplice globale utilizzato come tipo per un attributo o elemento).

Dalla mia esperienza, molti autori di schemi XML considerano questa "best practice" ... quindi siete sulla strada giusta.

In termini di XSD, lo spazio dei nomi target prescrive la parte dello spazio dei nomi di un nome qualificato di un componente dello schema, che include elementi, attributi, gruppi e gruppi di attributi e tipi semplici e complessi. Alcuni dei nomi qualificati definiti in un XSD (elementi e attributi) sono "direttamente" utilizzati da un documento di istanza XML. Altri, come per i tipi, possono essere referenziati tramite l'attributo xsi:type nei documenti XML di istanza. Il resto (gruppi, gruppi di attributi) ci sono per facilitare la composizione dello schema (attraverso i riferimenti).

Sono anche del parere che (in generale) la gente viene a progettare XSD da due angolazioni:

  • per abbinare un XML esistente. In questo caso, se il tuo XML utilizza spazi dei nomi, per ciascuno degli spazi dei nomi utilizzati, ti ritroverai con un elemento dello schema XSD con un attributo targetNamespace corrispondente.

  • modellazione pura. Quindi pensi a targetNamespace simile a un pacchetto UML, a uno schema di database, a un pacchetto Java o a uno spazio dei nomi .NET e tutto ciò significa in questo caso. Fondamentalmente è un meccanismo per evitare di nominare collisioni; tuttavia, è anche un meccanismo per partizionare modelli in aree soggette, ecc

13

xmlns

xmlns attributo imposta lo spazio di nomi predefinito dell'elemento descritto. Lo spazio dei nomi predefinito viene quindi applicato a tutti gli elementi all'interno dell'elemento descritto, che non dichiarano esplicitamente un altro spazio dei nomi per se stessi.

Lo spazio nome di default è impostato su un valore standard per i file WSDL: http://www.w3.org/ns/wsdl

targetNamespace

Questo attributo contiene lo spazio nome del servizio web. Puoi scegliere liberamente questo spazio dei nomi, ma c'è una convenzione che dice che l'URI dovrebbe puntare al WSDL del servizio.

xmlns: TNS

Questo spazio nome dovrebbe essere impostati sullo stesso URI come attributo targetNamespace. In questo modo puoi fare riferimento allo spazio dei nomi di destinazione tramite questo prefisso dello spazio dei nomi (tns).

Fonte: http://tutorials.jenkov.com/wsdl/description.html

14

Per coloro che sono ancora confuso, prendere in considerazione questi tre XSD. Tutti definiscono un tipo globale e una definizione di elemento globale che lo fa riferimento.

In primo luogo, un xsd come quello pubblicato sopra. Esso utilizza il prefisso 'XSD' per lo spazio dei nomi dello schema, e uno spazio dei nomi predefinito per il 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> 

Ora lo stesso XSD, ma la definizione e l'utilizzo di un prefisso dello spazio dei nomi per lo spazio dei nomi di destinazione:

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

... e, infine, una versione che utilizza uno spazio dei nomi di default al posto di 'XSD' per lo spazio dei nomi dello schema 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> 

la maggior parte dello schema autori scelgono il primo o l'ultimo, perché se la funzione di namespace predefinita è disponibile, quindi potremmo anche utilizzarla per qualcosa.

-1

Dopo alcuni test approfonditi utilizzando xmllint Penso di aver trovato la spiegazione definitiva qui. Si consideri il seguente schema:

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

È possibile che questo schema di convalida per il documento qui sotto:

<?xml version="1.0"?> 

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

Il motivo per cui funziona è perché xmlns = "http://yyyzzz.com" lega automaticamente anche l'elemento viene definito dallo schema! Ciò significa che si lega anche all'elemento recipeType.

Ora, con lo stesso documento XML ma con schema leggermente modificato, come di seguito convalida anche e dare un'occhiata da vicino la differenza:

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

Ignora se gli altri xmlns perse le tracce, ma invece guardare da vicino type = "EGboy: recipeType". Non possiamo più fare affidamento sullo xmlns perché ha un valore diverso quindi, dobbiamo mettere il prefisso EGboy di fronte a recipeType.

Il documento XML non ha nemmeno la cura del prefisso EGboy questo prefisso è solo per lo schema per fare riferimento alle appropriate xmlns nel caso in cui ci sono molti.

2

targetNamespace è un attributo di schema elemento definisce lo spazio dei nomi e il pacchetto nel file XSD. Per convenzione usiamo URI/URL, ma potremmo usare qualsiasi stringa.

xmlns è un attributo viene utilizzato per riferirsi a elementi e tipi di dati che provengono dal valore di attributo xmlns per l'ambito di elementi corrente.

Per esempio:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" è con prefisso xsd significa namespace deve essere preceduto xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" senza prefisso è predefinita
  • xmlns: p = "http: //www.example. com/People "con prefisso p significa spazio dei nomi deve essere preceduto da p:

Dove xmlns:xsd e xmlns:p sono QNames e xmlns è il nome locale.

L'immagine seguente aiuta a comprendere XSD utilizzando Java analogia come per la mia conoscenza:

enter image description here