Aktuelle Remote-Seminare mit Durchführungsgarantie: Etwas Werbung in eigener Sache Termine: 03.08.-05.08.2020, 21.09.-23.09.2020, 23.11.-25.11.2020, 07.12.-09.12.2020, 22.03.-24.03.2021, 07.06.-09.06.2021, 06.09.-08.09.2021XML Einführung und Grundlagen Termine: 06.08.2020, 20.10.2020, 13.11.2020, 10.12.2020, 25.03.2021, 10.06.2021, 09.09.2021XML - der professionelle Überblick Termine: 23.11.-26.11.2020, 29.03.-01.04.2021Einstieg in die Programmierung Termine: 17.08.-19.08.2020, 14.12.-16.12.2020, 07.04.-09.04.2021XML, XSLT, XPath, XSL-FO Einführung Termine: Termin nach WunschEinstieg in C#.NET Termine: 21.09.-23.09.2020, 11.01.-13.01.2021, 26.05.-28.05.2021, 27.09.-29.09.2021VB.NET für Visual Basic-Programmierer Termine: 21.10.-23.10.2020, 14.12.-16.12.2020, 08.03.-10.03.2021, 19.07.-21.07.2021, 23.08.-25.08.2021XML Grundlagen, XSL-FO, SVG, DocBook, DITA Termine: Termin nach WunschJava Grundlagen Termine: 03.08.-06.08.2020, 30.11.-03.12.2020, 29.03.-01.04.2021C++ für Programmiereinsteiger Termine: 10.09.2020, 11.12.2020, 16.03.2021Neues Seminar: XProc Grundlagen Termine: 21.09.-25.09.2020, 01.03.-05.03.2021Java/JSP/HTML/JDBC/XML Komplett Termine: 07.09.-09.09.2020, 21.10.-23.10.2020, 23.11.-25.11.2020, 25.01.-27.01.2021, 12.04.-14.04.2021, 26.07.-28.07.2021Python für Programmiereinsteiger Last-Minute-Seminare, noch freie Plätze XML Einführung und Grundlagen03.08.-05.08.2020 XML, XSLT, XPath, XSL-FO Einführung17.08.-19.08.2020 Python für Programmiereinsteiger07.09.-09.09.2020

XPROC * XSL-FO * SVG * XML * XML-SCHEMA * XPATH * XSL * XSLT 1.0 * XSLT 2.0 * XSLT 3.0 * XQUERY * ANT



XML-Schema / xs:any, xs:anyType

xs:any, xs:anyType

xs:any, xs:anyType

➪ Mitunter ist es erforderlich, die Validierung zu unterbinden oder sie davon abhängig zu machen, dass überhaupt ein XML-Schema existiert. 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="https://www.wilfried-grupe.de"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://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="https://www.wilfried-grupe.de"
 targetNamespace="https://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="https://www.wilfried-grupe.de"
  xsi:schemaLocation="https://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="https://www.wilfried-grupe.de"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://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 
'{"https://www.wilfried-grupe.de":nachnameXX}'. 
One of '{"https://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 / 10. April 2019



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