Einfache Anforderungen, aber XML-Schema fast unmöglich!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Einfache Anforderungen, aber XML-Schema fast unmöglich!

    Hallo,

    ich habe ein sehr spezielles Problem beim Erstellen eines XSD's (Xml Schema Datei). Ich verzweifle daran noch.

    Ein Beispiel für ein valides Dokument.

    Quellcode

    1. <VALUE>
    2. <FOO col="test"/>
    3. <OOF col="test"/>
    4. <AAA col="test"/>
    5. <FOO col="test"/>
    6. </VALUE>


    Anhand von diesem XML möchte Ich eine Schema Datei erstellen, die:
    • erkennt, wenn ein oder mehrere Elemente im VALUE-Tag fehlen
    • erkennt, wenn ein oder mehrere Elemente im VALUE-Tag zuviel sind
    • Elemente können doppelt vorkommen, müssen Sie aber nicht
    • Die Reihenfolge kann auch anderst sein

    Ich möchte außerdem alle Fehlermeldungen beim Validieren sammeln, parsen und ausgeben, damit man sieht wo der Schuh drückt.

    Mein erster Ansatz war, das dass Element VALUE aus einem <xsd:all> besteht, das Problem war jedoch, dass:
    • Nach dem ersten Auftreten eines Elements, dass nicht im Schema definiert ist, wird die Fehlermeldung ausgegeben, und der Validierungsprozess für den gesamten Elternknoten (Hier VALUE) abgebrochen,
      ich kann also nichtmehr sehen ob noch andere Fehler im VALUE-Tag sind
    • Ein Element kann bei <xsd:all> nur maximal einmal auftreten (maxOccurs="1")


    Mein nächster Ansatz war, das dass Element VALUE aus einer <xsd:sequence> besteht, jedes Kind Element ist ein <xsd:choice> mit jeweils nur sich selbst und minOccurs="1"
    Beispiel:

    Quellcode

    1. <xsd:element name="VALUE">
    2. <xsd:complexType>
    3. <xsd:sequence>
    4. <xsd:choice minOccurs="1" maxOccurs="unbounded">
    5. <xsd:element name="FOO">
    6. <xsd:complexType>
    7. <xsd:attribute ref="col"/>
    8. </xsd:complexType>
    9. </xsd:element>
    10. </xsd:choice>
    11. ....
    12. </xsd:sequence>
    13. </xsd:complexType>
    Alles anzeigen

    da war aber das Problem, dass:
    • Die Reihenfolge zwingend vorgegeben ist, ist ein Element also am falschen Platz wird sofort der Validierungsprozess des Eltern-Elements (VALUE) abgebrochen und andere eventuelle Fehler gehen unter.


    Eine Idee von mir war noch evtl. eine Abstraktionsebene mehr einzuführen, damit wenigstens weiter validiert wird, also z.B.

    Quellcode

    1. <VALUE>
    2. <Row1>
    3. <FOO col="test">
    4. </Row1>
    5. <Row2>
    6. <OOF col="test">
    7. </Row2>
    8. </VALUE>


    Also ist z.B. bei FOO was falsch, wird lediglich Row1 invalid, aber VALUE wird weiter versucht zu validieren.
    Das Problem ist dann wieder die Reihenfolge, ist OOF am Anfang gibt es einen Fehler weil OOF ja nicht zu Row1 sondern zu Row2 gehört.

    Kann mir da vielleicht irgendjemand helfen ein, den Anforderungen entsprechend, korrektes Schema zu erzeugen?
    Lösungen, Ideen?

    Ich validiere mit dem Tool xmllint. Beispielaufruf:
    xmllint --noout --schema schemaFile.xsd document.xml

    Viele Grüße
  • Ich kann dir nur folgendes sagen:
    Der Sinn der Validierung ist, dass 0 Fehler vorkommen. Demzufolge ist es nur logisch, dass sofort abgebrochen wird. Sollte ein Fehler kommen, dann muss dieser korrigiert werden und danach eben erneut validiert werden. Allerdings kann man sich das Leben auch einfacher machen, denn anhand einer xsd-Datei lässt sich sehr leicht erkennen, wie das fertige XML-Dokument aussehen muss. Wer also noch Fehler baut, der sollte vermutlich ohnehin keine XML-Dateien schreiben, bei denen es auf die Korrektheit ankommt.

    Ich würde die Datei so aufbauen:

    Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.domain.com" targetNamespace="http://www.domain.com" elementFormDefault="qualified">
    3. <xs:element name="value">
    4. <xs:complexType>
    5. <xs:sequence>
    6. <xs:element name="FOO" minOccurs="1" maxOccurs="unbounded">
    7. <xs:complexType><xs:attribute name="col" type="xs:string" use="required" /></xs:complexType>
    8. </xs:element>
    9. <xs:element name="OOF" minOccurs="1" maxOccurs="unbounded">
    10. <xs:complexType><xs:attribute name="col" type="xs:string" use="required" /></xs:complexType>
    11. </xs:element>
    12. <xs:element name="AAA" minOccurs="1" maxOccurs="unbounded">
    13. <xs:complexType><xs:attribute name="col" type="xs:string" use="required" /></xs:complexType>
    14. </xs:element>
    15. </xs:sequence>
    16. </xs:complexType>
    17. </xs:element>
    18. </xs:schema>
    Alles anzeigen

    Diese Schemadatei passt zu drei der vier Anforderungen und ich finde es ist akzeptabel, dass man dann eben FOO an erster Stelle nutzen muss.

    SvenSvenson schrieb:

    erkennt, wenn ein oder mehrere Elemente im VALUE-Tag zuviel sind

    Elemente können doppelt vorkommen, müssen Sie aber nicht
    Widerspricht sich das nicht?
  • Danke mal für die Antwort.

    Zu der Sache mit dem "sich widersprechen" ich meinte mit "ein oder mehrere Elemente im VALUE zuviel" Kindelemente die nicht vorkommen dürfen. Ein definiertes Tag darf 1 oder mehrmals vorkommen, aber ich möchte einen Fehler wenn ein Kindelement vorkommt, dass nicht definiert ist. Also wenn sich z.B. ein Tag namens <ichGehöreHierNichtHin> im VALUE Tag befindet möchte Ich einen Fehler. Befinden sich aber 1,2 oder 15 FOO Tags im VALUE Tag sollte es keinen Fehler geben.

    Das Problem mit den Fehlern ist, dass die XML Dateien aus einer Datenbank stammen. Ich transformiere den XML Output in ein Zwischenformat und möchte dieses Zwischenformat dann gegen die Schema Datei validieren und mir alle Abweichungen anzeigen lassen. Auf diese Weise möchte Ich das Ergebnis eines SQL Statements mit dem Ergebnis des gleichen Statements bei einer anderen Datenbankinstanz vergleichen können. Eine negative Validierung kann und sollte durchaus auftreten.