2009-08-04 10 views
1

Ich suche nach der besten Lösung meines XML Schemas (XSD).Wie kann abgeleitete Antwort (XSD) realisiert werden?

Ich habe ein response:

<xs:element name="exampleCatalogResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="meta" type="tns:metaType" /> 
      <xs:element name="data" type="tns:defaultDataType" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

... die defaultDatatype:

<xs:complexType name="defaultDataType"> 
    <xs:sequence> 
     <xs:element name="catalog"> 
      <xs:complexType> 
       <xs:sequence maxOccurs="unbounded"> 
        <xs:element name="catalogItem" type="tns:catalogItem" /> 
       </xs:sequence> 
      </xs:complexType> 
      <xs:unique name="itemIdConstraint"> 
       <xs:selector xpath="tns:catalogItem" /> 
       <xs:field xpath="tns:id" /> 
      </xs:unique> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

... und die catalogItem:

<xs:complexType name="catalogItem"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:nonNegativeInteger" /> 
    </xs:sequence> 
</xs:complexType> 

... aber jetzt gibt es ein spezieller Artikel, der spezialisiert catalogItem:

Jetzt
<xs:complexType name="specialItem"> 
    <xs:complexContent> 
     <xs:extension base="tns:catalogItem"> 
      <xs:sequence> 
       <xs:element name="code" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

Ich brauche ein Fach Response für meine specialItem für die Beantwortung der Anfrage, die diese specialItem erwartet.

Wie kann ich dies realisieren, ohne einen weiteren defaultDataType zu schreiben, wo nur der Typ catalogItem zu tns:specialItem wechselt?

+0

Ein Einrücken um acht ist nicht unbedingt erforderlich. –

+0

Sie haben definitiv Recht, ich habe das behoben – codevour

Antwort

0

Vielen Dank für Ihre tipps 13ren,

ich die Subsumtion Eigenschaft verwendet. Daher wird das Standard-catalogItem überall auch für den eindeutigen Ausdruck verwendet. Und jetzt, wenn ich das in XML verwende, kann ich dies über den Typ angeben.

<tns:catalogItem xsi:type="tns:specialItem"> 
    <tns:id>0</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 
    <tns:catalogItem xsi:type="tns:specialItem"> 
    <tns:id>1</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 
    <tns:catalogItem> 
    <tns:id>2</tns:id> 
    <tns:code>tns:code</tns:code> 
    </tns:catalogItem> 

So ist das letzte Element der Standard, und die beiden oben sind spezialisierte Elemente.das funktioniert sehr gut für mich.

1

Ich glaube nicht, dass Sie Co-Vorkommen Einschränkungen wie XSD erzwingen können. Im Sinne einer Puzzles Lösung, hier ist eine unangenehme Art und Weise Kopien mit der Änderung, die Sie machen wollen, ohne manuell „eine andere defaultDataType schreiben“:

  1. die oben complex in einem Schema Dokument ohne Namensraum definieren.

  2. <include> es in einem zweiten Schemadokument, das einen Namespace hat - das gibt ihm den Namespace. Wir können dies in vielen Schemadokumenten tun, wobei wir jedes Mal eine Kopie in diesem eindeutigen Namespace erhalten.

  3. In jedem dieser Schemadokumente catalogItem erweitern, sodass jede Erweiterung in einem eigenen Namespace ist.

  4. in einem endgültigen Schemadokument, schließen Sie alle oben genannten ein, und machen Sie sie substituierbar - so können sie alle als Antwort verwendet werden. (Alternativ könnten Sie alle anderen Response-Elemente in noch einem anderen Schema erweitern).

  5. HINWEIS: Sie müssen eine andere Möglichkeit zum Erzwingen der itemIdConstraint-Einschränkung erzwingen, die Namespaces durchläuft. Ich weiß nicht, ob das möglich ist.

Dies funktioniert, indem für jedes eine eigene Kopie von defaultDataType machen, und wird so nicht funktionieren, wenn Sie tatsächlich sie alle wollen verwenden die gleiche defaultDataType. Wie ich schon sagte, es ist peinlich, aber es ist die einzige Art, wie ich sehen kann, was du willst. Ich biete es als eine Puzzle-Lösung, anstatt eine praktische Lösung!

Verwandte Themen