XML-Validierung: Wozu? / xs:any, xs:anyType

xs:any, xs:anyType

xs:any, xs:anyType

➪ Häufig ist es erforderlich, nur Teilvalidierungen durchzuführen, also einzelne Elemente von der Validierung auszunehmen. xs:any sowie xs:anyType bieten die erforderliche Flexibilität.

Auf dieser Seite:

Das Element xs:any hat ein Attribut processContents, dessen Werte entweder "strict", "lax" oder "skip" sein dürfen.

processContents="strict"

Um bestimmte Elemente von der Validierung auszunehmen, reicht es nicht aus, mit xs:any zu arbeiten, da dessen Default-Einstellung processContents="strict" ist. Damit wird erzwungen, dass für das flexibel einzufügende Element auch ein XML-Schema existiert und für den Prozessor erreichbar sein muss, sodass die Validierung durchgeführt werden kann.

Das folgende XML-Schema deklariert lediglich ein Element ROOT, dessen Childnode auf xs:any gesetzt ist.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
  <xs:element name="ROOT">
    <xs:complexType>
      <xs:sequence>        
        <xs:any processContents="strict"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Ein XML-Dokument, das gegen dieses XML-Schema valide ist, könnte so aussehen:


<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="file:/C:/xsd/xs_any_anytype.xsd">
  <MENSCH xmlns="http://www.wilfried-grupe.de"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.wilfried-grupe.de 
                        file:/C:/xsd/Person.xsd">
    <nachname>Achtlos</nachname>
    <vorname>Anja</vorname>
  </MENSCH></ROOT>

Wie Sie sehen, hat das ROOT-Element tatsächlich ein Childnode MENSCH, das auf ein separates XML-Schema-Dokument mit diesem Aufbau verweist:


<xs:schema 
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:tns="http://www.wilfried-grupe.de"
 targetNamespace="http://www.wilfried-grupe.de"
 version="1.0"
 elementFormDefault="qualified">
 <xs:element name="MENSCH">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="tns:nachname"/>
    <xs:element ref="tns:vorname"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="vorname" type="xs:string"/>
 <xs:element name="nachname" type="xs:string"/>
</xs:schema>

Der Prozessor bindet auch dieses zweite XML-Schema mit ein und validiert das darin liegende Element MENSCH.

Bei mehrfachem Auftreten der Childnodes (wie im XML-Schema erlaubt) ist natürlich eine einmalige Namespace-Deklaration mit Präfixen sinnvoll.


<ROOT 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:g="http://www.wilfried-grupe.de"
  xsi:schemaLocation="http://www.wilfried-grupe.de 
                      file:/C:/xsd/Person.xsd"
  xsi:noNamespaceSchemaLocation="file:/C:/xsd/xs_any_anytype.xsd">
  <g:MENSCH>
    <g:nachname>Achtlos</g:nachname>
    <g:vorname>Anja</g:vorname>
  </g:MENSCH>
  <g:MENSCH>
    <g:nachname>Wolkenlos</g:nachname>
    <g:vorname>Wilma</g:vorname>
  </g:MENSCH>
</ROOT>

processContents="lax"

Die xs:any-Deklaration processContents="lax" prüft, ob das XML-Schema erreichbar ist. Falls ja, wird die Validierung durchgeführt.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
  <xs:element name="ROOT">
    <xs:complexType>
      <xs:sequence>        
        <xs:any 
            processContents="lax" 
            maxOccurs="unbounded" 
            minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Dieses XML-Dokument ist trotz "laxer" Validierung nicht valide, da der nachnameXX im XML-Schema anders deklariert wurde.


<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="file:/C:/xsd/xs_any_anytype.xsd">
  <MENSCH xmlns="http://www.wilfried-grupe.de"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.wilfried-grupe.de 
                        file:/C:/xsd/Person.xsd">
    <nachnameXX>Achtlos</nachnameXX>
    <vorname>Anja</vorname>
  </MENSCH>
</ROOT>

Die Fehlermeldung sieht dann (prozessorbedingt) so aus:


Programmname: Xerces
Fehlerlevel: error
Invalid content was found starting with element 
'{"http://www.wilfried-grupe.de":nachnameXX}'. 
One of '{"http://www.wilfried-grupe.de":nachname}' is expected.

processContents="skip"

Das soeben dargestellte Beispiel würde mit der "skip"-Einstellung nicht validiert (also auch dann nicht, wenn ein XML-Schema erreichbar ist): Die Validierung würde nicht auf einen Fehler laufen.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
  <xs:element name="ROOT">
    <xs:complexType>
      <xs:sequence>        
        <xs:any 
            processContents="skip" 
            maxOccurs="unbounded" 
            minOccurs="0" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Auch das folgende XML-Dokument würde weder bei "lax" noch bei "skip" auf einen Fehler laufen (lax: Es ist kein XML-Schema für "irgendeinElement" benannt):


<ROOT 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="file:/C:/xsd/xs_any_anytype.xsd">
  <irgendeinElement irgendeinAttribut="">
    <irgendeinChildnode/>
  </irgendeinElement>
</ROOT>

... wohl aber bei "strict":


Fehlerlevel: error
The matching wildcard is strict, but no 
declaration can be found for element 'irgendeinElement'.

xs:anyType, xs:anySimpleType

Ebenfalls keinen Validierungsfehler würden Sie bei diesem XML-Dokument erhalten,


<ROOT 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="file:/C:/xsd/xs_any_anytype.xsd">
  <einanderesElement einanderesAttribut="">
    <einandererChildnode/>
  </einanderesElement>
</ROOT>

... wenn das ROOT-Element in XML-Schema den Typ xs:anyType zugewiesen bekäme:


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
  <xs:element name="ROOT" type="xs:anyType"/>
</xs:schema>

Einen Fehler würden Sie jedoch erhalten bei der Definition von ROOT als xs:anySimpleType.


<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">
  <xs:element name="ROOT" type="xs:anySimpleType"/>
</xs:schema>

Die nachvollziehbare Fehlermeldung hätte dann den Inhalt:


Fehlerlevel: error
Beschreibung: Element 'ROOT' is a simple type, 
so it must have no element information item [children].

wg / 12. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XSD_xs_any_anyType.html