Domanda

Cosa elementFormDefault fare, e quando dovrebbe essere utilizzato?

Così ho trovato alcune definizioni per elementFormDefault valori:

qualificato - gli elementi e gli attributi sono in targetNamespace del schema

non qualificato - elementi e gli attributi non si dispone di uno spazio dei nomi

Quindi, da tale definizione mi sembra che se uno schema è impostato qualificato allora perché devi anteporre il tipo con lo spazio dei nomi?E quali sono gli scenari che si potrebbero avere anche un set di incompetenti per quella materia?Ho cercato su Google, ma tutto quello che ho avuto sono stati un paio di W3C pagine che erano estremamente difficili da capire.

Questo è il file che sto lavorando proprio ora, perché ho bisogno di dichiarare il tipo di target:TypeAssignments quando dichiaro il targetNamespace come la stessa, come xmlns:target?

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>
È stato utile?

Soluzione

elementFormDefault non ha nulla a che fare con namespace dei tipi nello schema, si tratta di spazi dei nomi degli elementi nei documenti XML conformi con lo schema.

Ecco la sezione relevent della specifica:

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.

Ciò significa che il targetNamespace hai dichiarato in cima dello schema si applica solo agli elementi nel documento XML compatibile con lo schema se uno elementFormDefault è "qualificato" o l'elemento viene dichiarato in modo esplicito nello schema come aventi forma = "qualificato".

Per esempio: se elementFormDefault è qualificato -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

inserirà aspettarsi elementi "nome" di essere nel targetNamespace e gli elementi di "pagina" di essere nel namespace nulla.

Per evitare di dover mettere form = "qualificato" su ogni dichiarazione di elemento, affermando elementFormDefault = "qualificato" significa che il targetNamespace si applica ad ogni elemento a meno che non prevalga mettendo form = "senza riserve" sulla dichiarazione elemento.

Altri suggerimenti

Si consideri il seguente AuthorType ComplexType usato da elemento author

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>

Se elementFormDefault="unqualified"

poi seguendo Istanza XML è valido

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>

attributo il nome del autori è consentita senza specificare lo spazio dei nomi (non qualificata). Eventuali elementi che sono una parte di <xsd:complexType> sono considerati come locale per complexType.

se elementFormDefault="qualified"

quindi l'istanza deve avere gli elementi locali qualificati

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

questo link per maggiori dettagli

Nuova, dettagliata risposta e spiegazione di un vecchio, domande frequenti...

Risposta breve:Se non aggiungi elementFormDefault="qualified" per xsd:schema, quindi il default unqualified valore significa che localmente dichiarato elementi sono in nessuno spazio dei nomi.

C'è un sacco di confusione per quel che riguarda elementFormDefault fa, ma questo può essere rapidamente chiarito con un breve esempio...

Versione semplificata della vostra XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>

Punti chiave:

  • Il assignment elemento è definito a livello locale.
  • Elementi definiti a livello locale in XSD sono in alcun spazio dei nomi predefinito.
    • Questo perché il valore di default per elementFormDefault è unqualified.
    • Questo probabilmente è un errore di progetto dai creatori di XSD.
    • La pratica Standard è quello di utilizzare sempre elementFormDefault="qualified" in modo che assignment è nello spazio dei nomi di destinazione, come sarebbe aspetta.

Apparentemente XML Valido

Questo XML sembra che dovrebbe essere valido, secondo la XSD:

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>

Avviso:

  • Lo spazio dei nomi predefinito su assignments luoghi assignments e tutti i suoi discendenti in lo spazio dei nomi predefinito (http://www.levijackson.net/web340/ns).

Sconcertante Errore Di Convalida

Nonostante cercando validi, di cui sopra, XML consente di ottenere i seguenti confusione di errore di convalida:

[Errore] provare.xml:4:23:cvc-complex-type.2.4.a:Il contenuto non valido è stato partire con l'elemento 'assegnazione'.Uno dei '{assegnazione}' e un previsto.

Note:

  • Non sarebbe il primo sviluppatore di maledizione questo strumento di diagnostica che sembra dire che il contenuto non è valido perché si aspetta di trovare un assignment elemento, ma in realtà si trova un assignment elemento. (WTF)
  • Che cosa questo significa veramente:Il { e } intorno assignment significa che era in attesa di convalida assignment in nessuno spazio dei nomi qui.Purtroppo, quando si dice che ha trovato un assignment elemento, non dire che è trovato in uno spazio dei nomi predefinito, che differisce da nessuno spazio dei nomi.

Soluzione

  • Stragrande maggioranza del tempo: Aggiungere elementFormDefault="qualified" per il xsd:schema elemento XSD.Questo significa XML valido deve posizionare gli elementi nello spazio dei nomi di destinazione quando localmente dichiarato nel XSD;in caso contrario, XML valido deve mettere dichiarati localmente elementi in nessuno spazio dei nomi.
  • Piccola minoranza di tempo: Modificare l'XML conforme ai XSD requisito che assignment nessuno spazio dei nomi.Questo obiettivo può essere raggiunto, per esempio, aggiungendo xmlns="" per il assignment elemento.

Importante notare con elementFormDefault è che essa si applica a localmente elementi definiti, elementi tipicamente di nome all'interno di un blocco di complexType, al contrario di elementi globali definiti in alto a livello di schema. Con elementFormDefault = "qualificato" è possibile indirizzare gli elementi locali nello schema dall'interno del documento XML utilizzando namespace di destinazione dello schema come namespace di default del documento.

In pratica, utilizzare elementFormDefault = "qualificato" per essere in grado di dichiarare elementi in blocchi nidificati, altrimenti dovrete dichiarare tutti gli elementi al livello superiore e fare riferimento ad essi nello schema di elementi nidificati che utilizzano l'attributo ref, con conseguente uno schema molto meno compatto.

Questo bit nei colloqui XML Schema Primer su di esso: http://www.w3.org/TR / XmlSchema-0 / # NS

elementFormDefault = "qualificato" è utilizzato per controllare l'utilizzo di spazi dei nomi nei documenti di istanza XML (file .xml), piuttosto che gli spazi dei nomi nel documento dello schema stesso (file XSD).

Specificando elementFormDefault = "qualificato" applichiamo la dichiarazione dello spazio dei nomi da utilizzare nei documenti convalidati con questo schema.

E 'pratica comune per specificare questo valore per dichiarare che gli elementi devono essere qualificati e non qualificati. Tuttavia, dal momento che attributeFormDefault = "non qualificata" è il valore di default, non ha bisogno di essere specificato nel documento dello schema, se non si vuole qualificare gli spazi dei nomi.

Ho notato che XMLSpy (versione almeno 2011) ha bisogno di un targetNamespace definito se elementFormDefault = "qualificato" è utilizzato. In caso contrario, non convaliderà. E, inoltre, non genererà XMLs con prefissi di namespace

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top