Was macht elementFormDefault in XSD?

87

Was macht elementFormDefaultund wann sollte es verwendet werden?

Also habe ich einige Definitionen für elementFormDefaultWerte 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:TypeAssignmentsdeklarieren targetNamespacewie 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>
Levi
quelle
Schauen Sie sich xfront.com/HideVersusExpose.html an . Hier werden auch Best Practices mit elementFormDefault angezeigt.
Grigory Kislin

Antworten:

70

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:

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

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 -

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

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.

Alohci
quelle
60

Betrachten Sie den folgenden ComplexType, AuthorTypeder vom authorElement verwendet wird

<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 ist die folgende XML-Instanz gültig

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

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

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

Bitte beziehen Sie sich auf diesen Link für weitere Details

Girish
quelle
55

Neue, detaillierte Antwort und Erklärung auf eine alte, häufig gestellte Frage ...

Kurze Antwort : Wenn Sie nicht hinzufügen elementFormDefault="qualified"zu xsd:schema, dann der unqualifiedStandardwert bedeutet , dass lokal deklarierten Elemente sind in keinem Namespace .

Es gibt viel Verwirrung darüber, was elementFormDefaulttut, aber dies kann schnell mit einem kurzen Beispiel geklärt werden ...

Optimierte Version Ihrer 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>

Wichtige Punkte:

  • Das assignmentElement ist lokal definiert.
  • In XSD lokal definierte Elemente befinden sich standardmäßig in keinem Namespace.
    • Dies liegt daran, dass der Standardwert für elementFormDefaultist unqualified.
    • Dies ist wohl ein Designfehler der Entwickler von XSD.
    • Standardmäßig wird immer elementFormDefault="qualified" so verwendet, dass assignmentes sich erwartungsgemäß im Ziel-Namespace befindet.

Scheinbar gültiges XML

Diese XML-Datei sollte gemäß der obigen XSD gültig sein:

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

Beachten:

  • Der Standard-Namespace für assignmentsOrte assignmentsund 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:

[Fehler] try.xml: 4: 23: cvc-complex-type.2.4.a: Es wurde ein ungültiger Inhalt gefunden, beginnend mit dem Element 'Zuweisung'. Eine von '{Zuweisung}' wird erwartet.

Anmerkungen:

  • Sie wären nicht der erste Entwickler, der diese Diagnose verflucht, die zu sagen scheint, dass der Inhalt ungültig ist, weil er erwartet, ein assignmentElement zu finden , aber tatsächlich ein assignmentElement gefunden hat. ( WTF )
  • Was dies wirklich bedeutet: Das {und }um assignmentbedeutet, dass die Validierung hier assignment in keinem Namespace erwartet wurde. Wenn es heißt, dass es ein assignmentElement gefunden hat, wird leider nicht erwähnt, dass es in einem Standard-Namespace gefunden wurde, der sich von keinem Namespace unterscheidet.

Lösung

  • Überwiegende Mehrheit der Zeit: In elementFormDefault="qualified"an das xsd:schemaElement 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.
  • Winzige Minderheit der Zeit: Ändern Sie das XML, um den XSD-Anforderungen assignmentzu entsprechen, die sich in keinem Namespace befinden. Dies kann beispielsweise durch Hinzufügen xmlns=""zum assignmentElement erreicht werden.
kjhughes
quelle
5
Obwohl dies kein OP-Problem ist, ist es das, wonach OP gefragt hat, und es ist sehr informativ und gut erklärt. Ich denke, dies verdient mehr Up- elementFormDefault
Votes
1
Sir, vielen Dank! Ich hatte das gleiche Problem mit "Attribut X darf nicht in Element Y erscheinen." zusammen mit "Attribut X muss auf Element Y erscheinen". Diese beiden Meldungen wurden in meiner IntelliJ-IDE für das Attribut eines Elements angezeigt , was die wtf- Reaktion wirklich verursachte .
Aleksandar
12

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

stephan f
quelle
5

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.

Feri
quelle
0

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

Neal
quelle