1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Invalides XML-Schema

Dieses Thema im Forum "XML Technologien" wurde erstellt von Tikonteroga, 15. Oktober 2012.

  1. Tikonteroga

    Tikonteroga Erfahrenes Mitglied

    Hallo,

    ich habe den Auftrag erhalten, eine Software in JAVA zu schreiben, mit der man XML-Dateien nach einem bestimmten Vorgegebenen XML-Schema validieren kann.

    Beim Einlesen des XML-Schema mit der SchemaFactory-Klasse hat sich herausgestellt, dass dieses XML-Schema selbst einen Fehler enthält.

    Code (Text):
    1. s4s-att-invalid-value: Ungültiger Attributwert für "value" in Element "maxLength". Aufgezeichneter Grund: cvc-datatype-valid.1.2.1: "4294967295" ist kein gültiger Wert für "nonNegativeInteger".
    Code (Text):
    1. <xsd:simpleType name="A_ASCIISTRING_4294967295">
    2.     <xsd:restriction base="A_ASCIISTRING">
    3.       <xsd:maxLength value="4294967295"/>
    4.     </xsd:restriction>
    5.   </xsd:simpleType>
    So wie ich es verstanden habe ist der Wert 4294967295 ausserhalb des erlaubten Wertebereichs. Ein nonNegativInteger ist wohl ein 32-bit signed integer der jedoch >= 0 sein muss.

    Jetzt habe ich irgendwie ein Problem, denn das XML-Schema ist eine Vorgabe, die ich nicht ändern kann. Kann ich hier irgendwas machen, dass der Fehler irgendwie übersprungen wird und ich die XML-Datei validieren kann?
     
  2. deepthroat

    deepthroat Erfahrenes Mitglied

    Hi.

    Du verwendest anscheinend Xerces.

    Jedenfalls ist das ein Fehler deines XML / XSD Frameworks da ein nonNegativeInteger laut XSD Spezifikation nicht begrenzt ist, also 4294967295 ein gültiger Wert ist.

    Hier ist ein Bug-Report für Java von 2004 => http://bugs.sun.com/view_bug.do;jsessionid=85335466c2c1fc52f0245d20b2e?bug_id=4990915

    Das Problem ist also bekannt, es kümmert nur kaum jemanden.

    Als Würg-Around könntest du z.B. das Schema als Dokument einlesen und alle Vorkommen von "zu großen" Beschränkungen ersetzen. Oder du probierst mal einen anderen Parser (Saxon?).
     
  3. Tikonteroga

    Tikonteroga Erfahrenes Mitglied

    Hallo,

    vielen Dank für die Antwort, dass hilft mir jetzt schon mal weiter.

    Also ob ich jetzt Saxon oder Xerxes verwende, kann ich nicht sagen. Ich habe die SchemaFactory im Java JDK 6 verwendet.

    Ich werden aber mal prüfen, wie ich das Framework austauschen kann.

    Vielen Dank aber schon mal.
     
  4. Tikonteroga

    Tikonteroga Erfahrenes Mitglied

    Hallo,

    also jetzt stehe ich vor einem größeren Problem.

    Ich habe jetzt mal versucht das XML-Schema mit .NET zu parsen. Auch hier erhalte ich eine vergleichbare Fehlermeldung, dass der Wert 4294967295 für einen Int32 zu groß ist.

    Bitte entschuldige, dass ich Frage, aber bist du dir sicher, dass es sich um einen Fehler der Parser und nicht um einen Fehler im XML Schema handelt. Ich habe mal die beiden betroffenen Stellen im Schema angehängt.

    HTML:
    1. <xsd:simpleType name="A_ASCIISTRING_4294967295">
    2.     <xsd:restriction base="A_ASCIISTRING">
    3.       <xsd:maxLength value="4294967295"/>
    4.     </xsd:restriction>
    5.   </xsd:simpleType>
    HTML:
    1. <xsd:simpleType name="S_UINT8_4294967295">
    2.     <xsd:restriction base="S_UINT8">
    3.       <xsd:maxLength value="4294967295"/>
    4.     </xsd:restriction>
    5.   </xsd:simpleType>
    Ich habe auch mal Saxon angeschaut. Für mich sah es so aus, als ist dass ein Bibliotheke für unter anderem XSLT-Processing. Kann ich damit denn Validieren ?
     
  5. deepthroat

    deepthroat Erfahrenes Mitglied

    Ja.
    Es gibt einen von nonNegativeInteger abgeleiteten Typ "unsignedLong" welcher einen max. Wert von 18446744073709551615 erlaubt (siehe http://www.w3.org/TR/xmlschema11-2/#unsignedLong). Dieser Typ ist also restriktiver als nonNegativeInteger; dennoch ist der max. Wert immer noch weitaus größer als 4294967295.

    Wobei es wirklich fragwürdig ist, ob es Sinn macht einen 4 GiB langen String in einem XML Dokument zuzulassen. Wenn man die Länge schon begrenzt, dann doch etwas geringer.

    Vielleicht hat man aus diesem Grund die Entscheidung getroffen die maxLength Facette als int32 abzubilden anstatt sich an den Standard zu halten (ein "unendlicher Typ" ist aber auch schwierig abzubilden...).
    What is Saxon?
    \edit:
    Ich habe gerade Saxon getestet, da gibt es dasselbe Problem.
     
    Zuletzt bearbeitet: 17. Oktober 2012
  6. Tikonteroga

    Tikonteroga Erfahrenes Mitglied

    Hallo,

    vielen Dank für deine Unterstützung.

    Also ich werde jetzt wohl mal prüfen müssen, ob es Fälle gibt, in denen die XML Dokumente, die ich prüfen muss einen Wert für maxLength von 2147483647 überschreiten. Falls dies nicht so ist, werde ich das Schema an den zwei Stellen modifizieren müssen und ändere 4294967295 in 2147483647.

    Also hier ist es wohl nicht so, dass man einen String in Form von einem lesbaren Text speichern möchte. Dieser String bildet glaube ich einen BLOB ab und man wollte hier wohl möglichst flexibel bleiben.

    Wobei du schon recht hast. Ich habe mal eine XML-Datei mit einem (großen) BLOB (aber deutlich kleiner als 4 GiB) in einem Editor geöffnet, das war sehr langsamm.
     
  7. deepthroat

    deepthroat Erfahrenes Mitglied

    Ob der String lesbar ist oder nicht, ist ja egal. Binäre Daten lassen sich sehr schlecht in XML einfügen. Man könnte die Daten höchstens base64 kodieren (xsd:base64Binary).
    Zumal die maxLength Facette die Anzahl der Zeichen (nicht Oktets) begrenzt, was bei einem UTF-16 kodiertem Dokument dann max. 8 GiB an Speicher erfordert. (für EIN Element) -- bei UTF-32...

    Außerdem handelt es sich doch um ATFX, oder? Da gibt es eine Standardmethode mit "Massendaten" umzugehen, diese sollten in separate Binärdateien gespeichert werden. Evtl. sollte das Schema eurer Anwendung erstmal überarbeitet werden?
     
Die Seite wird geladen...