Was macht elementFormDefault
und wann sollte es verwendet werden?
Also habe ich einige Definitionen für elementFormDefault
Werte gefunden:
qualifiziert - Elemente und Attribute befinden sich im targetNamespace des Schemas
unqualifiziert - Elemente und Attribute haben keinen Namespace
Aus dieser Definition würde ich denken, wenn ein Schema auf qualifiziert gesetzt ist, warum müssen Sie dem Typ dann den Namespace voranstellen? Und was sind die Szenarien, in denen Sie überhaupt eine Einstellung für unqualifiziert hätten? Ich habe versucht zu googeln, aber alles, was ich bekam, waren ein paar W3C-Seiten, die extrem schwer zu verstehen waren.
Dies ist die Datei, mit der ich gerade arbeite. Warum muss ich den Typ als den gleichen target:TypeAssignments
deklarieren targetNamespace
wie 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>
Antworten:
ElementFormDefault hat nichts mit dem Namespace der Typen im Schema zu tun. Es geht um die Namespaces der Elemente in XML-Dokumenten, die dem Schema entsprechen.
Hier ist der relevante Abschnitt der Spezifikation:
Dies bedeutet, dass der oben im Schema deklarierte targetNamespace nur für Elemente im schemakompatiblen XML-Dokument gilt, wenn elementFormDefault entweder "qualifiziert" oder das Element im Schema explizit als form = "qualifiziert" deklariert ist. .
Zum Beispiel: Wenn elementFormDefault nicht qualifiziert ist -
erwartet, dass sich "name" -Elemente im targetNamespace und "page" -Elemente im null-Namespace befinden.
Um zu vermeiden, dass Sie bei jeder Elementdeklaration form = "qualifiziert" eingeben müssen, bedeutet die Angabe von elementFormDefault = "qualifiziert", dass der targetNamespace für jedes Element gilt, sofern er nicht überschrieben wird, indem form = "unqualifiziert" in die Elementdeklaration eingefügt wird.
quelle
Betrachten Sie den folgenden ComplexType,
AuthorType
der vomauthor
Element verwendet wirdWenn
elementFormDefault="unqualified"
dann ist die folgende XML-Instanz gültig
Das Namensattribut des Autors ist zulässig, ohne den Namespace anzugeben (nicht qualifiziert). Alle Elemente, die Teil von
<xsd:complexType>
sind, werden als lokal für complexType betrachtet.wenn
elementFormDefault="qualified"
dann sollte die Instanz die lokalen Elemente qualifiziert haben
Bitte beziehen Sie sich auf diesen Link für weitere Details
quelle
Neue, detaillierte Antwort und Erklärung auf eine alte, häufig gestellte Frage ...
Kurze Antwort : Wenn Sie nicht hinzufügen
elementFormDefault="qualified"
zuxsd:schema
, dann derunqualified
Standardwert bedeutet , dass lokal deklarierten Elemente sind in keinem Namespace .Es gibt viel Verwirrung darüber, was
elementFormDefault
tut, aber dies kann schnell mit einem kurzen Beispiel geklärt werden ...Optimierte Version Ihrer XSD:
Wichtige Punkte:
assignment
Element ist lokal definiert.elementFormDefault
istunqualified
.elementFormDefault="qualified"
so verwendet, dassassignment
es sich erwartungsgemäß im Ziel-Namespace befindet.Scheinbar gültiges XML
Diese XML-Datei sollte gemäß der obigen XSD gültig sein:
Beachten:
assignments
Orteassignments
und alle seine Nachkommen im Standard-Namespace (http://www.levijackson.net/web340/ns
).Verblüffender Validierungsfehler
Obwohl das obige XML gültig aussieht, ergibt es den folgenden verwirrenden Validierungsfehler:
Anmerkungen:
assignment
Element zu finden , aber tatsächlich einassignment
Element gefunden hat. ( WTF ){
und}
umassignment
bedeutet, dass die Validierung hierassignment
in keinem Namespace erwartet wurde. Wenn es heißt, dass es einassignment
Element gefunden hat, wird leider nicht erwähnt, dass es in einem Standard-Namespace gefunden wurde, der sich von keinem Namespace unterscheidet.Lösung
elementFormDefault="qualified"
an dasxsd:schema
Element der XSD. Dies bedeutet, dass gültiges XML Elemente im Ziel-Namespace platzieren muss, wenn es lokal in der XSD deklariert wird. Andernfalls muss gültiges XML lokal deklarierte Elemente in keinem Namespace platzieren.assignment
zu entsprechen, die sich in keinem Namespace befinden. Dies kann beispielsweise durch Hinzufügenxmlns=""
zumassignment
Element erreicht werden.quelle
elementFormDefault
Bei elementFormDefault ist zu beachten, dass es für lokal definierte Elemente gilt, die normalerweise als Elemente innerhalb eines complexType-Blocks bezeichnet werden, im Gegensatz zu globalen Elementen, die auf der obersten Ebene des Schemas definiert sind. Mit elementFormDefault = "qualifiziert" können Sie lokale Elemente im Schema aus dem XML-Dokument heraus adressieren, indem Sie den Ziel-Namespace des Schemas als Standard-Namespace des Dokuments verwenden.
Verwenden Sie in der Praxis elementFormDefault = "qualifiziert", um Elemente in verschachtelten Blöcken deklarieren zu können. Andernfalls müssen Sie alle Elemente auf der obersten Ebene deklarieren und im Schema in verschachtelten Elementen mit dem Attribut ref auf sie verweisen viel weniger kompaktes Schema.
Dieses Bit im XML Schema Primer spricht darüber: http://www.w3.org/TR/xmlschema-0/#NS
quelle
elementFormDefault = "qualifiziert" wird verwendet, um die Verwendung von Namespaces in XML-Instanzdokumenten (XML-Datei) anstelle von Namespaces im Schemadokument selbst (XML-Datei) zu steuern.
Durch Angabe von elementFormDefault = "qualifiziert" erzwingen wir die Verwendung der Namespace-Deklaration in Dokumenten, die mit diesem Schema validiert wurden.
Es ist üblich, diesen Wert anzugeben, um zu erklären, dass die Elemente eher qualifiziert als nicht qualifiziert sein sollten. Da jedoch attributeFormDefault = "unqualified" der Standardwert ist, muss er nicht im Schemadokument angegeben werden, wenn die Namespaces nicht qualifiziert werden sollen.
quelle
Ich habe festgestellt, dass XMLSpy (mindestens Version 2011) einen targetNameSpace benötigt, der definiert ist, wenn elementFormDefault = "qualifiziert" verwendet wird. Andernfalls wird nicht validiert. Und generiert auch keine xmls mit Namespace-Präfixen
quelle