Ich arbeite an einem XML-Schema (message.xsd
), das die Struktur einer Nachricht beschreibt.XML-Schema: Elemente in beliebiger Reihenfolge und vorkommen 0-1 mal oder 0- * mal
Hier sind die erwarteten Kinder der <message>
Element (die Wurzel):
<from>
: Enthält die Adresse des Absenders. Tritt 0 oder 1 Mal auf.<to>
: Enthält die Adresse des Empfängers. Tritt 0 oder öfter auf.<cc>
: Enthält die Adresse des Empfängers in Kopie. Tritt 0 oder öfter auf.<subject>
: Enthält den Betreff der Nachricht. Tritt 0 oder 1 Mal auf.<body>
: Enthält den Nachrichtentext. Tritt 0 oder 1 Mal auf.
Die Reihenfolge der Elemente ist egal, es bedeutet, dass sie in beliebiger Reihenfolge sein können.
Hier ist ein erstes einfaches XML-Beispiel (message-1.xml
), die gültig sein muss:
$ xmllint --schema message.xsd message-1.xml
<?xml version="1.0"?>
<message xmlns="http://yugiohjcj.1s.fr/message">
<from>[email protected]</from>
<to>[email protected]</to>
<subject>How are you?</subject>
<body>Hello. How are you? Thank you. Best regards.</body>
</message>
message-1.xml validates
Und es ist gültig!
ist hier ein zweites komplexes XML-Beispiel (message-2.xml
), die gültig sein muss:
$ xmllint --schema message.xsd message-2.xml
<?xml version="1.0"?>
<message xmlns="http://yugiohjcj.1s.fr/message">
<subject>How are you?</subject>
<body>Hello. How are you? Thank you. Best regards.</body>
<from>[email protected]</from>
<to>[email protected]</to>
<to>[email protected]</to>
<cc>[email protected]</cc>
<cc>[email protected]</cc>
</message>
message-2.xml validates
Und es ist gültig!
Hier ist ein drittes XML-Beispiel (message-3.xml
), die nicht gültig sein muss:
$ xmllint --schema message.xsd message-3.xml
<?xml version="1.0"?>
<message xmlns="http://yugiohjcj.1s.fr/message">
<from>[email protected]</from>
<from>[email protected]</from>
<to>[email protected]</to>
<subject>How are you?</subject>
<subject>How are you again?</subject>
<body>Hello. How are you? Thank you. Best regards.</body>
<body>Hello. How are you again? Thank you. Best regards.</body>
</message>
message-3.xml validates
Aber es ist gültig! Das ist das Problem.
Hier ist meine XML-Schema (message.xsd
):
$ cat message.xsd
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://yugiohjcj.1s.fr/message" targetNamespace="http://yugiohjcj.1s.fr/message" elementFormDefault="qualified">
<xs:element name="message">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="from"/>
<xs:element name="to"/>
<xs:element name="cc"/>
<xs:element name="subject"/>
<xs:element name="body"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Ich denke, dass ich das maxOccurs
Attribut auf den Wert 1
irgendwo oder vielleicht muss ich kombinieren anders die <xs:sequence>
und <xs:choice>
Elemente festlegen müssen, aber ich habe nicht gefunden, wie ich mein Ziel erreichen kann.
Haben Sie eine Idee, wie Sie dieses XML-Schema reparieren können?
Vielen Dank.
Mit freundlichen Grüßen.
Edit: OK, fand ich eine Abhilfe für mein Problem durch Relax NG statt XSD 1.0 verwenden. Es funktioniert gut und es ist kompatibel mit libxml2.
Hier ist meine message.rng
Datei:
$ cat message.rng
<element name="message" xmlns="http://relaxng.org/ns/structure/1.0">
<interleave>
<zeroOrMore>
<element name="from">
<text/>
</element>
</zeroOrMore>
<zeroOrMore>
<element name="to">
<text/>
</element>
</zeroOrMore>
<zeroOrMore>
<element name="cc">
<text/>
</element>
</zeroOrMore>
<optional>
<element name="subject">
<text/>
</element>
</optional>
<optional>
<element name="body">
<text/>
</element>
</optional>
</interleave>
</element>
Und hier ist das Ergebnis auf meine 3 XML-Beispiele (message-1.xml
, message-2.xml
und message-3.xml
):
$ xmllint --relaxng message.rng message-1.xml
<?xml version="1.0"?>
<message>
<from>[email protected]</from>
<to>[email protected]</to>
<subject>How are you?</subject>
<body>Hello. How are you? Thank you. Best regards.</body>
</message>
message-1.xml validates
$ xmllint --relaxng message.rng message-2.xml
<?xml version="1.0"?>
<message>
<subject>How are you?</subject>
<body>Hello. How are you? Thank you. Best regards.</body>
<from>[email protected]</from>
<to>[email protected]</to>
<to>[email protected]</to>
<cc>[email protected]</cc>
<cc>[email protected]</cc>
</message>
message-2.xml validates
$ xmllint --relaxng message.rng message-3.xml
<?xml version="1.0"?>
<message>
<from>[email protected]</from>
<from>[email protected]</from>
<to>[email protected]</to>
<subject>How are you?</subject>
<subject>How are you again?</subject>
<body>Hello. How are you? Thank you. Best regards.</body>
<body>Hello. How are you again? Thank you. Best regards.</body>
</message>
Relax-NG validity error : Extra element subject in interleave
message-3.xml:7: element subject: Relax-NG validity error : Element message failed to validate content
message-3.xml fails to validate
Leider habe ich keinen XSD 1.1-Validator. Ich verwende [libxml2] (http://xmlsoft.org/) in C, das nur XSD 1.0 unterstützt. Ich sehe, dass [Xerces] (http://xerces.apache.org/mirrors.cgi) XSD 1.1 unterstützt, aber in einer Beta-Version und [Saxon] (http://saxon.sourceforge.net/) nur XSD1.1 unterstützt in einer kommerziellen Version. – YuGiOhJCJ
Ich sympathisiere. Sie bekommen, wofür Sie bezahlen. –