2010-03-26 13 views
9

Ich möchte angeben, dass entweder fieldname oder freetext immer in XML-Dateien vorhanden sein müssen, die für diese XSD gelten. Gibt es eine Möglichkeit, das zu tun?Wie in einem XML-Schema angeben, dass eines der beiden Felder vorhanden sein muss?

<xs:complexType name="tSome"> 
<xs:sequence> 
    <!-- either one of the two below has to be present. --> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    <!-- this one below must always be present --> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

Es tut mir wirklich leid, aber die vorherigen minOccurs-Tags, wo nur weil meine Implementierung der Wahl war, dass Feldname und Freetext nur optional waren. –

Antwort

17

Es gibt eine Choice Indicator in XML-Schema, mit dem Sie eine der enthaltenen Elemente nehmen können, aber nicht zwei oder mehr. Wenn Sie irgendeine 2 von 3 wollen, empfehlen ich etwas wie folgt aus:

<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 
<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 

(. Vielleicht maxOccurs wird verhindern, dass Sie eine Auswahl und das gleiche Element zweimal) Wenn das nicht funktioniert, wird nichts, denke ich.

Bearbeitet: Ich habe die Frage beim ersten Mal nicht richtig verstanden. Wenn Sie dbtablename wollen immer anwesend sein mit einem der fieldname oder freetext, dann ist dies die Antwort:

<xs:complexType name="tSome"> 
<xs:sequence> 
    <xs:choice> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    </xs:choice> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

vielen Dank! muss versuchen l8r, wie minoccurs und maxoccurs mit choice funktionieren. Ich akzeptiere die Antwort später, wenn es funktioniert, obwohl Ihr Beispiel nicht das war, was ich brauchte. Prost! –

+0

Sorry: Wochenende passiert: entweder Feldname oder Freitext und nicht beide. dbtablename immer. Siehe meine bearbeitete Originalfrage (warum minOccurs Tags da waren). Meine Frage ist jetzt: Ist es jetzt wirklich 'entweder Feldname oder Freitext und nicht beide', da es minOccurs Tags hat. Das ist wieder mein Fehler in orig. Frage, aber denkst du nicht, dass sie entfernt werden sollten? –

+0

@matti Sie können entfernt werden, da minOccures = "0" nichts tut. –

4

So, möchten Sie entweder fieldname oder freetext und nicht beides? oder vielleicht beides? und dann dbtablename optional?

ist hier 1 oder 2 der Elemente:

<xs:choice minOccurs="1" maxOccurs="2"> 
    <xs:element name="fieldname" type="xs:string"/> 
    <xs:element name="freetext" type="xs:string"/> 
    <xs:element name="dbtablename" type="xs:string"/> 
</xs:choice> 

Ist das, was Sie wollen? oder wollten Sie dbtablename getrennt sein?

+0

Entschuldigung: Wochenende passiert: entweder Feldname oder Freetext. dbtablename immer. Das Problem mit der Wahl ist, dass xsd.exe seltsamen Code dafür generiert. –

+0

ja: entweder Feldname oder Freitext und nicht beides. –

+0

was minOccurs = "1" maxOccurs = "2" hier bedeuten? –

Verwandte Themen