2017-02-24 1 views
2

Ich habe die folgenden Elemente Struktur in meine XSD-Datei bekam:xsd. Erweitern einer Art mit ungeordneten Elemente gesetzt

<xs:complexType name="the_rootest" abstract="true"> 
<xs:sequence> 
    <xs:element name="info" type="complex_type_here"/> 
</xs:sequence> 
    <xs:attribute name="Name" type="cpo:string"/> 
</xs:complexType> 

<xs:complexType name="object" abstract="true"> 
<xs:complexContent> 
    <xs:extension base="the_rootest"> 
     <xs:sequence> 
      <xs:element name="is_working" type="cpo:bool"/> 
      <xs:element name="has_errors" type="cpo:bool"/> 
      <xs:element name="state" type ="cpo:string"/> 
     </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 
</xs:complexType> 

<xs:complexType name="extended_object"> 
<xs:complexContent> 
    <xs:extension base="object"> 
     <xs:sequence> 
      <xs:element name="is_zero" type="cpo:bool"/> 
      <xs:element name="complex" type="another_complex_type_here" /> 
     </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 
</xs:complexType> 

<xs:complexType name="one_more_extended"> 
<xs:complexContent> 
    <xs:extension base="object"> 
     <xs:sequence> 
     </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 
</xs:complexType> 

I-Objekt mit einem „extended_object“ Typ in einer XML-Datei haben, die folgenden Felder hat Auftrag

info 
Name 
is_working 
has_errors 
is_zero 
complex 
state 

Wie Sie sehen können, steht das Feld "state" am Ende der Objektelemente. Die Frage ist, wie soll ich mein Schema korrigieren, um dieses Objekt gültig zu machen? Danke.

Antwort

0

Die übliche Methode, um ungeordnete Elemente in einem Inhaltsmodell zuzulassen, besteht darin, xs:all zu verwenden.

xs:all kann jedoch nicht erweitert werden.

Wenn Sie also ein neues Element erstellen möchten, dessen Inhaltsmodell einem vorhandenen Element ähnelt, aber möglicherweise zusätzliche Elemente enthält, die sich in einer anderen Reihenfolge als das vorhandene Element befinden können, besteht die einzige Möglichkeit darin, ein neues Inhaltsmodell unabhängig zu erstellen vom Original. (Die Typdefinitionen der Kindelemente können sicherlich zumindest gemeinsam genutzt werden.)

XSDs Design ist nicht perfekt orthogonal und konsistent. Dies ist ein Bereich, in dem scheinbar vernünftige Erwartungen nicht erfüllt werden können. Auf der positiven Seite wird die Unordnung tendenziell in der Praxis überschätzt, und ein Kommentar in einer Deklaration, die eine Abhängigkeit mit einer anderen dokumentiert, ist nicht ideal, aber lebensfähig.

0

Wenn Sie XML Schema 1.1 verwenden, können Sie eine Erweiterung mit xs:all wie so verwenden können (I modifiziert, um das Schema, um es mit Standardtypen auf meiner Seite funktioniert):

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"> 
    <xs:complexType name="the_rootest" abstract="true"> 
     <xs:all> 
      <xs:element name="info" type="xs:string"/> 
     </xs:all> 
     <xs:attribute name="Name" type="xs:string"/> 
    </xs:complexType> 

    <xs:complexType name="object" abstract="true"> 
     <xs:complexContent> 
      <xs:extension base="the_rootest"> 
       <xs:all> 
        <xs:element name="is_working" type="xs:boolean"/> 
        <xs:element name="has_errors" type="xs:boolean"/> 
        <xs:element name="state" type ="xs:string"/> 
       </xs:all> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="extended_object"> 
     <xs:complexContent> 
      <xs:extension base="object"> 
       <xs:all> 
        <xs:element name="is_zero" type="xs:boolean"/> 
        <xs:element name="complex" type="xs:string" /> 
       </xs:all> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="one_more_extended"> 
     <xs:complexContent> 
      <xs:extension base="object"> 
       <xs:sequence> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="element" type="extended_object"/> 
</xs:schema> 

Dieses XML-Dokument erfolgreich validiert:

<?xml version="1.0" encoding="UTF-8"?> 
<element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="test.xsd" 
> 
    <info>test</info> 
    <is_working>true</is_working> 
    <has_errors>true</has_errors> 
    <is_zero>true</is_zero> 
    <complex>true</complex> 
    <state>true</state> 
</element> 
+0

Hier sehe ich einen Fehler: "Eine alle Gruppe ist nur auf der obersten Ebene des Inhaltsmodells erlaubt.". Diese Variante ist also nicht für mich geeignet. – rudolfninja

+0

Ja, das würde XML Schema 1.0 sagen, wie kjhughes erklärt. Es bedeutet also wahrscheinlich, dass die von Ihnen verwendete Software 1.1 leider nicht unterstützt. –

+0

Danke. Könnten Sie wissen, ob es einen Weg gibt, das "Statusfeld" nicht gültig zu machen? – rudolfninja

Verwandte Themen