Cosa elementFormDefault fare XSD?
-
13-09-2019 - |
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>
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 cheassignment
è nello spazio dei nomi di destinazione, come sarebbe aspetta.
- Questo perché il valore di default per
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
luoghiassignments
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 unassignment
elemento. (WTF) - Che cosa questo significa veramente:Il
{
e}
intornoassignment
significa che era in attesa di convalidaassignment
in nessuno spazio dei nomi qui.Purtroppo, quando si dice che ha trovato unassignment
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 ilxsd: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, aggiungendoxmlns=""
per ilassignment
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