2009-06-03 4 views
11

Ich erhalte eine XML-Nachricht mit unbekannten Variablennamen ... das heißt, sie sind nicht vordefiniert ...Wie kann ich eine Xsd-Datei definieren, die unbekannte (Wildcard-) Elemente erlaubt?

Ich weiß nur, dass es 0 oder mehr dieser Elemente geben kann, allong mit einigen anderen, die sind obligatorisch ...

zum Beispiel

<root> 
    <service>my service</service> 
    <resource>my resource</resource> 
    <action>update</action> 
    <parameters> 
     <field1>value1</field1> 
     <field2>value2</field2> 
     <field3>value3</field3> 
    </parameters> 
</root> 

das heißt, ich weiß nicht, was als „Parameter“ übergeben wird, ich weiß nur, es 0 oder mehr Elemente mit einem Wert sein, nicht tiefer Tag-Verschachtelung erlaubt ....

ich über so etwas wie

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="root"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="service" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> 
     <xs:element name="resource" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> 
     <xs:element name="action" type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/> 
     <xs:element name="parameters"> 
     <xs:complexType> 
      <xs:element name="*" maxOccurs="unbounded"> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

natürlich zu denken, ist der schwierige Teil

<xs:element name="*" maxOccurs="unbounded"> 

ist es möglich, sucha etwas zu tun?

Wie kann ich eine Xsd-Datei definieren, die eine solche Nachricht validiert?

-

überprüfte ich die w3c Bezug auf

http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#NCName

und es sagt:

„Der lexikalische Bereich von NCName ist die Menge aller Strings, die · Spiel · Die NCName-Produktion von [Namespaces in XML]. "

Was bedeutet es?

außerdem ... könnten Sie mir einen einfachen Weg empfehlen, die Einhaltung einer xsd-Definition zu testen?

Antwort

19

Was Sie wollen, ist ein Platzhalter Teilchen, für Details siehe http://www.w3.org/TR/xmlschema-1/#Wildcards

es tun Sie xs verwenden können: beliebig. Beachten Sie, dass xs: element und xs: any nicht direkt in einem xs: complexType platziert werden können. Sie benötigen einen Container wie eine Sequenz oder eine Auswahl.

Ein gültiges Schema, das Platzhalter behandelt unter:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="service" type="xs:string"/> 
     <xs:element name="resource" type="xs:string"/> 
     <xs:element name="action" type="xs:string"/> 
     <xs:element name="parameters"> 
      <xs:complexType> 
      <xs:sequence maxOccurs="unbounded"> 
       <xs:any processContents="lax"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
1

Try this:

<xs:element name="parameters"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:any processContents="lax"></xs:any> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
Verwandte Themen