CDATA-Sections und XML Schema-Validierung

CDATA-Sections und XML Schema-Validierung

Wie überall in der Programmierung, können auch in XML-Dokumenten sowie in den darauf aufbauenden Programmierungen ergänzende Kommentare sehr hilfreich sein, um die Wartung komplexer Anwendungen effizient zu gestalten.

Häufig validieren Datenempfänger ihre XML-Dokumente "sehr scharf" gegen ein XML Schema. Mitunter sind in den XML Dokumenten jedoch CDATA-Sections enthalten, die Inhalte "maskieren", einer XSD-Validierung entziehen und so eine geforderte, eindeutige Strukturdefinition aushebeln.

Es bleibt dem Developer überlassen, bei eventuellen strukturellen Änderungen in den CDATA-Sections die Verarbeitungslogik (XSL, XQuery) anzupassen. Es kann aber vorkommen, daß diese Anpassung unterbleibt oder verzögert vorgenommen wird. Dann droht hier ein Informationsverlust, der sehr teuer werden kann.

Hierzu möchte ich ein einfaches Beispiel geben. Das folgende XML Schema definiert ein Root-Element Person mit drei xs:string-Childnodes "Vorname", "Nachname" und "info".


<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  attributeFormDefault="unqualified"
  elementFormDefault="unqualified" version="1.0" >
  <xs:element name="Person" type="PersonTYP"/>
  <xs:complexType name="PersonTYP">
    <xs:sequence>
      <xs:element ref="Vorname" />        
      <xs:element ref="Nachname" />
      <xs:element ref="info" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Vorname" type="xs:string" />
  <xs:element name="Nachname" type="xs:string" />
  <xs:element name="info" type="xs:string" />
</xs:schema>

Das folgende XML Dokument übernimmt "Vorname" und "Nachname", weist der "info" aber einen zusätzlichen Childnode "Hobby" zu, das im XML Schema nicht vorgesehen ist; ihre Existenz im XML Dokument sollte daher zu einem Validierungs-Fehler führen.


<Person 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="Person.xsd">
  <Vorname>Vorname</Vorname>  
  <Nachname>Nachname</Nachname>
  <info><Hobby>XML</Hobby></info>
</Person>

Der Validierungsfehler läßt auch nicht auf sich warten:


Element 'info' ist Simple Type und 
darf daher keine Elementinformationselemente 
[untergeordnete Elemente] haben. 
Person.xml is not a valid XML document

Dagegen geht die CDATA-"Maskierung" glatt durch:


<Person 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="Person.xsd">
  <Vorname>Vorname</Vorname>  
  <Nachname>Nachname</Nachname>
  <info><![CDATA[ <Hobby>XML</Hobby>]]> </info>
</Person>

Alternativ denkbar wäre, die Daten ohne CDATA-Section als Text mit Entitäten einzubinden; auch hier würde eine Validierung gegen das vorher beschriebene XML Schema problemlos durchlaufen:


<Person 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="Person.xsd">
  <Vorname>Vorname</Vorname>  
  <Nachname>Nachname</Nachname>
  <info>&lt;Hobby&gt;XML&lt;/Hobby&gt;</info>
</Person>

In beiden Fällen stellen sich aus meiner Sicht einige Fragen:

wg / 6. November 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

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/Kommentare2.html