Anzeige

Invalides XML-Schema

Tikonteroga

Erfahrenes Mitglied
#1
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:
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:
<xsd:simpleType name="A_ASCIISTRING_4294967295">
    <xsd:restriction base="A_ASCIISTRING">
      <xsd:maxLength value="4294967295"/>
    </xsd:restriction>
  </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?
 

deepthroat

Erfahrenes Mitglied
#2
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?).
 

Tikonteroga

Erfahrenes Mitglied
#3
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.
 

Tikonteroga

Erfahrenes Mitglied
#4
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:
<xsd:simpleType name="A_ASCIISTRING_4294967295">
    <xsd:restriction base="A_ASCIISTRING">
      <xsd:maxLength value="4294967295"/>
    </xsd:restriction>
  </xsd:simpleType>
HTML:
<xsd:simpleType name="S_UINT8_4294967295">
    <xsd:restriction base="S_UINT8">
      <xsd:maxLength value="4294967295"/>
    </xsd:restriction>
  </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 ?
 

deepthroat

Erfahrenes Mitglied
#5
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.
Ja.
http://www.w3.org/TR/xmlschema11-2/#rf-maxLength hat gesagt.:
The value of maxLength must be a nonNegativeInteger.
http://www.w3.org/TR/xmlschema11-2/#nonNegativeInteger hat gesagt.:
3.4.20 nonNegativeInteger

[Definition:] nonNegativeInteger is ·derived· from integer by setting the value of ·minInclusive· to be 0. This results in the standard mathematical concept of the non-negative integers. The value space of nonNegativeInteger is the infinite set {0,1,2,...}. The ·base type· of nonNegativeInteger is integer.
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.

Ich habe mal die beiden betroffenen Stellen im Schema angehängt.

HTML:
<xsd:simpleType name="A_ASCIISTRING_4294967295">
    <xsd:restriction base="A_ASCIISTRING">
      <xsd:maxLength value="4294967295"/>
    </xsd:restriction>
  </xsd:simpleType>
HTML:
<xsd:simpleType name="S_UINT8_4294967295">
    <xsd:restriction base="S_UINT8">
      <xsd:maxLength value="4294967295"/>
    </xsd:restriction>
  </xsd:simpleType>
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...).
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 ?
What is Saxon?
An XML Schema 1.0 processor. This can be used on its own to validate a schema for correctness, or to validate a source document against the definitions in a schema. It is also used to support the schema-aware functionality of the XSLT and XQuery processors. Like the other tools, it can be run from the command line, or invoked from an application.
\edit:
Kommentar aus einem Xerces Java Bugreport hat gesagt.:
We still don't support all
legal nonNegativeInteger/positiveIntegers for certain attributes (e.g. length,
minLength, maxLength, minOccurs, maxOccurs, etc.). The reason is that for these
properties, we store the values as "int" internally.
But considering how unlikely it is for these values to be greater than 2G, and
how difficult/inefficient it would be if we use something like BigDecimal, we
decided to leave it as a limitation.
Ich habe gerade Saxon getestet, da gibt es dasselbe Problem.
 
Zuletzt bearbeitet:

Tikonteroga

Erfahrenes Mitglied
#6
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.

Ja.

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.
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.
 

deepthroat

Erfahrenes Mitglied
#7
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.
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).
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.
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?
 
Anzeige

Neue Beiträge

Anzeige