XML Validierung - wozu? / XML Schema / Datentypen, Designs / 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.

xs:any, xs:anyType

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, daß für das flexibel einzufügende Element auch ein XML Schema existiert und für den Prozessor erreichbar sein muß, so daß 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 wir 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 Hilfe von Prefixes 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 wir 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 wir 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 / 29. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XSD_xs_any_anyType.html