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>
War es hilfreich?

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 tun

Hier 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 dass assignment im Ziel-Namensraum, wie man es erwarten.

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 Orte assignments 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 ein assignment Element. ( WTF )
  • Was das wirklich bedeutet: Die { und } um assignment bedeutet, dass die Validierung assignment erwartete in keinem Namespace hier. Leider, wenn es sagt, dass es ein assignment 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" zum xsd: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 durch xmlns="" zum assignment 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top