2017-07-09 1 views
0

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 

Antwort

0

In XSD 1.0, wenn Sie zulassen möchten Elemente, die in beliebiger Reihenfolge angezeigt werden sollen. Die einzige Möglichkeit zu steuern, wie oft jedes Element angezeigt wird, ist die Verwendung von xs: all. Dadurch wird die Anzahl der Darstellungen auf null oder eins beschränkt. Sie können also nicht erreichen, was Sie versuchen.

Diese Einschränkung wird in XSD 1.1 aufgehoben.

+0

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

+1

Ich sympathisiere. Sie bekommen, wofür Sie bezahlen. –

Verwandte Themen