2012-09-19 8 views
5

Das Element musste eine Art "eine Liste von Zeichenfolgen" haben und es kann 0 oder mehr Vorkommen dieser Art von Informationen sein. Also, was ich tat, war:XML-Schema - eine Liste von Zeichenfolgen

<xs:element name="xxx" type="ooo" /> 

<xs:simpleType name="ooo"> 
    <xs:list itemType="xs:string" /> 
</xs:simpleType> 

Ich glaube, das ist richtig, aber

wo platziere ich minOccur und maxOccur hier?

+1

was meinst du mit "Liste der Zeichenfolgen"? Willst du 0 bis x Vorkommen des Elements "xxx"? Oder möchten Sie ein einzelnes "xxx" -Element mit einer einzelnen Zeichenfolge mit Trennzeichen, die Sie analysieren können? Oder wollen Sie ein einzelnes "xxx" -Element mit 0 bis x Kindelementen (effektiv Ihre Liste) – psubsee2003

+0

psubsee2003 Wenn es Ihnen nichts ausmacht Könnten Sie mir die Beispiele für jede mögliche Interpretation geben? –

Antwort

23

Ihre Frage unklar ist leider, weil es mehrere Dinge bedeuten könnte.

Eine mögliche Interpretation ist, dass Sie möchten, dass ein Element "xxx" zwischen 0 und x mal auftritt. Dies geschieht durch Definieren einer Sequenz innerhalb eines Wurzelelements.

<xs:simpleType name="ooo"> 
    <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:element name="root"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="xxx" type="ooo" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Sie können nicht minOccurs und maxOccurs auf dem Root-Elemente angeben, obwohl, da es nur ein Root-Element in einem XML sein kann. Aber Sie können eine Sequenz als Kind für das Wurzelelement definieren, das was im obigen Beispiel getan wird.

Jetzt, wenn Sie wollten "xxx", um Ihr Wurzelelement zu sein, können Sie effektiv die gleiche genaue Sache tun. das ist genau das gleiche, außer statt einem Element namens „root“ Sie haben jetzt ein Element, das „xxx“ und die untergeordneten Elemente etwas anderes mit einer Art „ooo“

<xs:simpleType name="ooo"> 
    <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:element name="xxx"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="xxx-child" type="ooo" maxOccurs="unbounded" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

In Ihrem Beispiel genannt genannt werden die Verwendung des Typs "Liste" bedeutet, was ich denke, dass Sie denken, dass es bedeutet. Ein Listentyp in einer XSD definiert keine Sequenz von Elementen, sondern ein einzelnes Element, das eine Liste von Werten enthalten kann, die durch ein Leerzeichen begrenzt sind.

<xxx>item1 item2 item3 item4 item5</xxx> 

Die XML ist effektiv eine unbeschränkte Liste von Strings beliebiger Länge durch ein Leerzeichen getrennt:

<xs:simpleType name="ooo"> 
    <xs:list itemType="xs:string" /> 
</xs:simpleType> 

<xs:element name="xxx" type="ooo" /> 

Das resultierende XML aus diesem Schema defination würde wie folgt aussehen. Sie könnten einen Typ für die Liste definieren, die von xs:string erbt, um die Arten von Werten einzuschränken, mir ist jedoch keine Methode bekannt, die Länge einzuschränken.

Und schließlich, was ich denke, Sie zu erreichen versuchen, ist in der Nähe eines meiner Vorschläge oben mit "xxx" und "xxx-Kind", aber nur Neuformatierung, wo die Sequenz definiert ist.

<xs:complexType name="ooo"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="child" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:element name="xxx" type="ooo" /> 

und die daraus resultierenden XML möchte dies:

<?xml version="1.0" encoding="utf-8"?> 
<xxx> 
    <child></child> 
    <child></child> 
    <child></child> 
</xxx> 

Und es gibt andere Variationen auf die letzte Option, wie die minOccurs="0" maxOccurs="unbounded" vom <xs:sequence> auf das „Kind“ Element bewegt. In Ihrem Beispiel spielt das überhaupt keine Rolle, da beide Definitionen zu exakt demselben XML führen würden.Aber wenn man zwei untergeordnete Elemente hätte, wäre es verschiedene Dinge bedeuten:

<xs:complexType name="ooo"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="child1" type="xs:string" /> 
    <xs:element name="child2" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

wie diese in einem XML führen würde (die Sequenz von child1 Folge von child2 würde x-mal wiederholt werden):

<?xml version="1.0" encoding="utf-8"?> 
<xxx> 
    <child1></child1> 
    <child2></child2> 
    <child1></child1> 
    <child2></child2> 
    <child1></child1> 
    <child2></child2> 
</xxx> 

wo als

<xs:complexType name="ooo"> 
    <xs:sequence> 
    <xs:element name="child1" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
    <xs:element name="child2" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 

in einem XML-ähnliche führen würde (child1 würde x-mal wiederholen, gefolgt von child2 y Zeit Wiederholung):

<?xml version="1.0" encoding="utf-8"?> 
<xxx> 
    <child1></child1> 
    <child1></child1> 
    <child2></child2> 
    <child2></child2> 
    <child2></child2> 
    <child2></child2> 
    <child2></child2> 
</xxx> 
+0

Diese Antwort ist äußerst präzise und beantwortet meine Frage genau. Vielen Dank für Ihre ausführliche Antwort. –

-1

Hier ist ein Codebeispiel fand ich, dass Sie helfen können:

<xs:element name="person"> 
<xs:complexType> 
     <xs:sequence> 
      <xs:element name="full_name" type="xs:string"/> 
      <xs:element name="child_name" type="xs:string" 
      maxOccurs="10" minOccurs="0"/> 
     </xs:sequence> 
</xs:complexType> 
</xs:element> 
Verwandte Themen