Was macht ElementFormDefault- in XSD?
-
13-09-2019 - |
Frage
Was bedeutet elementFormDefault
tun, und wann sollten sie eingesetzt werden?
So fand ich einige Definitionen für elementFormDefault
Werte:
qualifiziert - Elemente und Attribute in der Target der ARE Schema
unqualifizierte - Elemente und Attribute haben keinen Namespace
So von dieser Definition würde ich denken, dass, wenn ein Schema qualifiziert gesetzt ist, warum dann müssen Sie den Typ mit dem Namespacepräfix? Und was sind die Szenarien, die Sie würden sogar einen Satz zu unqualifiziert für diese Angelegenheit haben? Ich habe versucht, googeln, aber alles, was ich bekam, waren ein paar W3C-Seiten, die extrem schwer zu verstehen waren.
Dies ist die Datei, die ich mit jetzt arbeite, warum muss ich die Art, wie target:TypeAssignments
erklären, wenn ich die targetNamespace
als gleiche wie xmlns:target
erklären?
<?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>
Lösung
ElementFormDefault- hat nichts mit Namensraum der Typen im Schema, es geht um die Namensräume der Elemente in XML-Dokumenten, die mit dem Schema entsprechen.
zu tunHier ist der relevent Abschnitt der Spezifikation:
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·.
Was das bedeutet, ist, dass der Target Sie nur an der Spitze des Schemas deklariert haben, um Elemente in dem Schema konformen XML-Dokument gilt, wenn entweder ElementFormDefault- „qualifiziert“ ist oder das Element ist ausdrücklich als mit Form in Schema deklariert = "qualifiziert".
Zum Beispiel: Wenn ElementFormDefault- unqualifiziert -
<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
wird „namen“ Elemente in der Target und „Seite“ Elemente setzen erwarten in dem Null-Namensraum sein.
So speichern Sie form = „qualifiziert“ auf jeder Elementdeklaration setzen zu müssen, die besagt, ElementFormDefault- = „qualifiziert“ bedeutet, dass die Target jedes Element, wenn nicht außer Kraft gesetzt gelten durch Form = „unqualifizierte“ auf der Elementdeklaration setzen.
Andere Tipps
Sie sich das folgende Complex AuthorType
von author
Elemente verwendet
<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"/>
Wenn elementFormDefault="unqualified"
dann folgende XML-Instanz gilt
<x:author xmlns:x="http://example.org/publishing">
<name>Aaron Skonnard</name>
<phone>(801)390-4552</phone>
</x:author>
das Attribut Name des Autors ist ohne Angabe den Namensraumes (unqualifizierten) erlaubt. Alle Elemente, die ein Teil von <xsd:complexType>
sind, gelten als lokal für complex.
Wenn elementFormDefault="qualified"
dann sollte die Instanz haben die lokalen Elemente qualifiziert
<x:author xmlns:x="http://example.org/publishing">
<x:name>Aaron Skonnard</name>
<x:phone>(801)390-4552</phone>
</x:author>
siehe diesen Link für weitere Details
Neue, detaillierte Antwort und Erklärung zu einem alten, häufig gestellte Frage ...
Kurze Antwort . Wenn Sie elementFormDefault="qualified"
nicht in den xsd:schema
, wird der Standard unqualified
Wert bedeutet, dass lokal deklarierten Elemente sind in kein Namespace
Es gibt eine Menge Verwirrung darüber, was elementFormDefault
tut, aber das kann schnell mit einem kurzen Beispiel geklärt werden ...
Schlanke Version Ihres 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>
Kernpunkte:
- Das
assignment
Element lokal definiert. - Elemente lokal in XSD definiert sind in keinem Namespace standardmäßig aktiviert.
- Das ist, weil der Standardwert für
elementFormDefault
unqualified
ist. - Das ist wohl ein Design-Fehler von den Machern von XSD.
- Gängige Praxis ist es, immer
elementFormDefault="qualified"
zu verwenden so dassassignment
im Ziel-Namensraum, wie man es erwarten.
- Das ist, weil der Standardwert für
Scheinbar Valid XML
Dieses XML sieht aus wie es nach dem obigen XSD gültig sein sollte:
<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>
Hinweis:
- Der Standard-Namespace auf
assignments
Orteassignments
und alle seine Abkömmlinge im Standard-Namespace (http://www.levijackson.net/web340/ns
).
Perplexing Validierungsfehler
Trotz der Suche gültig, die über XML ergibt die folgenden verwirrenden Validierungsfehler:
[Fehler] try.xml: 4: 23: CVC-Komplex-type.2.4.a: ungültiger Inhalt war beginnend mit dem Element ‚Zuordnung‘ gefunden. Einer von ‚{Zuweisung}‘ ist erwartet.
Weitere Informationen:
- Sie wäre nicht das erste Entwickler sein, um diese Diagnose zu verfluchen, die das der Inhalt ist ungültig, weil es scheint zu sagen, erwartet ein
assignment
Element zu finden, aber es fand tatsächlich einassignment
Element. ( WTF ) - Was das wirklich bedeutet: Die
{
und}
umassignment
bedeutet, dass die Validierungassignment
erwartete in keinem Namespace hier. Leider, wenn es sagt, dass es einassignment
Element gefunden, ist es nicht zu erwähnen, dass es in einem Standard-Namespace, die von keinem Namespace unterscheidet gefunden.
Lösung
- überwiegende Mehrheit der Zeit:
elementFormDefault="qualified"
zumxsd:schema
Elemente der XSD hinzufügen. Dies bedeutet, gültige XML-Elemente im Ziel-Namespace platzieren müssen, wenn sie lokal in der XSD erklärt; Andernfalls müssen gültige XML lokal deklariert in keinem Namespace-Elemente setzen. - Tiny Minderheit der Zeit: , um die XML-Änderung mit dem XSD ist einzuhalten
Anforderung, dass in keinem Namespace
assignment
. Dies kann erreicht werden, beispielsweise durchxmlns=""
zumassignment
Element hinzugefügt wird.
Wichtig bei ElementFormDefault- zu beachten ist, dass es gilt für lokal Elemente definiert, die typischerweise genannte Elemente in einem complex Block, wie definiert globale Elemente gegen auf der obersten Ebene des Schemas. Mit ElementFormDefault- = „qualifiziert“ Sie lokale Elemente in dem Schema aus dem XML-Dokument adressieren kann das Schema der Ziel-Namensraum als die Standard-Namespace des Dokuments verwendet wird.
In der Praxis verwenden ElementFormDefault- = „qualifiziert“ in der Lage sein, Elemente in verschachtelten Blöcken zu erklären, sonst werden Sie alle Elemente auf der obersten Ebene erklären müssen und sie im Schema in verschachtelten Elementen verweisen das ref-Attribut, was zu einem viel weniger kompakten Schema.
Dieses Bit in der XML-Schema-Primer spricht darüber: http://www.w3.org/TR / XmlSchema-0 / # NS
ElementFormDefault- = „qualifiziert“ verwendet wird, um die Verwendung von Namensräumen in XML-Instanz-Dokumenten (XML-Datei) zu steuern, anstatt Namensräume im Schema Dokument selbst (XSD-Datei).
Durch die Angabe ElementFormDefault- = „qualifiziert“ wir erzwingen Namespace-Deklaration in Dokumenten mit diesem Schema validiert verwendet werden.
Es ist üblich, diesen Wert angeben, zu erklären, dass die Elemente nicht unqualifiziert eingestuft werden sollen. Da jedoch attribute = „unqualifiziert“, um den Standardwert ist, es muss nicht in dem Schema Dokument angegeben werden, wenn man nicht den Namespaces qualifizieren will.
Ich habe bemerkt, dass XMLSpy (mindestens Version 2011) eine Target muss definiert, wenn ElementFormDefault- = „qualifiziert“ verwendet wird. Sonst werden nicht überprüft. Und auch nicht erzeugen xmls mit Namespacepräfixe