Validierung einer XML-Datei - Führende Leerzeichen und Tabs

SimProtect

Aktives Mitglied
Hallo,

Ich bin derzeit mit der Validierung von XML-Objekten betraut. Diese werden gegen eine oder mehrere Schemadateien validiert.
Zum Validieren nutzen wir Java-Boardmittel. (siehe Code unten)

Mir selbst wird der Inhalt der XML-Datei als String übertragen. Daran kann ich leider nichts ändern.

Leider habe ich das Problem, dass beim Einlesen auch die Leerzeichen und Tabs in den Content gezogen werden, die der besseren Lesbarkeit dienen.

Also aus
Code:
<Tag>
   <InnerTag>
      BlaBlubb
   </InnerTag>
</Tag>

wird statt "BlaBlubb" stattdessen "BlaBlubb " (die Einrückung vom InnerTag wird als Leerzeichen angefügt).

Dies führt im Rahmen unserer Validierung dazu, dass die Validierung fehlschlägt, obwohl das File eigentlich valide ist. (Entsprechende Felder lassen keine Leerzeichen am Ende zu).
Gibt es dann eine Möglichkeit, den Validator so einzustellen, dass er solche Whitespaces erkennt?

Unsere Validationsmethode sieht derzeit wie folgt aus:
Code:
private static ValidationResult validate(String fileContent, Source... sources) {
        Assert.notNull(fileContent, "Xml file for validation must not be null");
        Assert.noNullElements(sources, "Sources for validation must not be null or empty");
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        ValidationResult result = new ValidationResult();
        try {
            schemaFactory.setErrorHandler(result);
            Schema schema = schemaFactory.newSchema(sources);
            Validator validator = schema.newValidator();
            validator.setErrorHandler(result);
            validator.validate(new StreamSource(new StringReader(fileContent)));
            return result;
        } catch (SAXException e) {
            return result;
        } catch (IOException e) {
            throw new IllegalStateException("An IOException occured during xml validation.", e);
        }
    }

Als Sources werden die zugehörigen Schemadateien und weitere Abhängigkeiten (z.B. xml.xsd) übergeben. Der ErrorHandler (hier ValidationResult) dient dazu, die Fehlermeldungen zu speichern, entsprechend aufzubereiten und an einzelnen Stellen darauf zu reagieren (hat etwas mit Kompatibilität zu einer älteren Version zu tun)

Eine unsere Lösungen war zunächst, im übergebenen String alle führenden Leerzeichen zu entfernen. Dies führt aber auch dazu, dass z.B. Dinge, die ein Nutzer so formatiert hat, verworfen werden würden.
Es kann ja durchaus sein, dass ein Nutzer absichtlich einen Zeilenumbruch eingefügt hat und - der Lesbarkeit halber - extra Leerzeichen eingefügt hat.

Hat da einer vielleicht eine Lösung für mich?
 

SimProtect

Aktives Mitglied
Ah, entschuldige. Ich sehe, dass das unverständlich war.

Also Leerzeichen und Zeilenumbrüchen IM Text sind in solchen Feldern erlaubt. Das Feld darf jedoch nicht mehr Leerzeichen enden.

Beispiel 1 (Nutzereingefügte Leerzeichen zweckslesbarkeit).
Hier hat der Nutzer bewusst drei Leerzeichen zu Beginn der zweiten Zeile eingefügt, weil er das für lesbarer hält. Dies ist ein valider und vom Nutzer gewünschter Zustand.
Code:
<Description>
Die Reise beginnt am
    11.11.1111 um 11:11 Uhr.
</Description>

Beispiel 2 (invalide und nicht vom Nutzer eingefügte Leerzeichen)
In diesem Dokument hat der Nutzer nur "Hier steht ein Eingabetext" eingegeben. Dieses Dokument wird mir so als String übergeben (also auch so formatiert). Im Rahmen oben genannter Validierung gegen XSDs wird dieser Text jedoch falsch eingelesen. Stattdessen wird eingelesen "Hier steht ein Eingabetext " <- es werden am Ende die drei Leerzeichen eingefügt, die der Formatierung des XML-Dokuments dienen (die drei vor dem schließenden Tag von Description). Nicht nur, dass diese nicht vom Nutzer eingegeben worden sind, sondern lassen sie auch das eigentlich valide XML-Objekt plötzlich invalide werden
Code:
<SomeElement>
   <Description>
      Hier steht ein Eingabetext
   </Description>
</SomeElement>

Vielleicht zur weiteren Erläuterung: Der Nutzer erstellt nicht händisch irgendwelche XMLs und wirft die uns dann ins System.
Diese XML-Files werden i.d.r. über verschiedene, nutzerfreundliche Eingabetools erzeugt. Auf einige könnte ich Einfluss nehmen, da wir die auch entwickeln, aber es gibt auch Fremdquellen. Da kann ich weder auf die Art und Weise Einfluss nehmen, wie das Tool das XML erstellt noch was die Nutzer genau machen.
Alles was ich weiß ist, dass ich XML-Dokumente bekommen, die gegen mehrere XSD-Files validiert werden müssen und dass mir diese als String übergeben werden.
 

SimProtect

Aktives Mitglied
Das ist tatsächlich unsere aktuelle Lösung.
Ich würde allerdings ungerne das bestehende Dokument verändert. Daher wäre es mir lieber, eine Lösung zu finden, die das Problem nicht hat.
 

SimProtect

Aktives Mitglied
Das ist mir klar - deshalb hatte ich hier ja gefragt. Ich habe leider keine Idee, was ich noch anpassen könnte.
Hast Du vielleicht eine Idee oder einen Tipp für mich?
Vielleicht suche ich ja auch nur nach den falschen Stichworten.

Ich habe ansonsten noch versucht, stattdessen den DocumentBuilder zu verwenden und diesem das entsprechende Schema mitzugeben - allerdings führte das zum gleichen Effekt. Auch hier werden ein Zeilenumbruch und die nachfolgenden Whitespaces eingetragen.
Ohne jetzt groß reingeschaut zu haben, vermute ich mal, dass der sich auf den gleichen Validierungsmechanismus abstützt, den ich oben verwendet hatte.
 

fhoffmann

Top Contributor
Ich nehme auch an, dass DOM die Methoden von SAX benutzt. Hier etwas umzustellen, bringt nichts.

Ich gehe davon aus, dass du die Einträge der xml-Datei in eine Datenbank eintragen willst. In der Datenbank ist es sicher sinnvoll, keine Einträge wie "Müller_" (der "_" soll hier für ein Leerzeichen stehen) zuzulassen. Wenn Dateien, die von fremden Firmen erstellt werden, dennoch solche Einträge enthalten, müssen sie an irgendeiner Stelle zwischen Einlesen der Datei und Speicherung in der Datenbank korrigiert werden. Es sollte deshalb nicht die Validierung korrigiert werden, sondern die Daten.
Ich würde allerdings ungerne das bestehende Dokument verändert. Daher wäre es mir lieber, eine Lösung zu finden, die das Problem nicht hat.
Das "bestehende Dokument" musst du ja nicht ändern - du kannst es unverändert im Netzwerk speichern - aber der Datenbankeintrag sollte den Konventionen entsprechen.
 

SimProtect

Aktives Mitglied
Danke für Deine Antworten.
Ich habe jetzt den übergebenen String selbst entsprechend bearbeitet. Schien mir zunächst vergleichsweise einfach zu sein, allerdings war auch zu beachten, dass auch dem Content zusätzliche Whitespaces hinzugefügt wurden.

Also aus
Code:
<SomeElement>
   <Description>
      Hier steht ein Eingabetext
   </Description>
</SomeElement>
wurde
Code:
<SomeElement>
___<Description>
______Hier steht ein Eingabetext
___</Description>
</SomeElement>

Einfach alle führenden Leerzeichen wegzuwerfen war leider nicht die Lösung, da es durchaus möglich ist, dass eine mittlere Zeile (vgl siehe unten) mit - vom Nutzer eingegebenen Leerzeichen beginnt, weil der Nutzer z.B. damit etwas formatieren wollte. Die kann ich ja nicht einfach wegwerfen.

Code:
<SomeElement>
   <Description>
      Reisedaten
      ___Abreise: 11.11.1111
      ___Rückreise: 11.11.1111
   </Description>
</SomeElement>

---
Ich frage mich: Gibt es eine Methoden zum Einlesen von XML-Dateien, die diese "NichtNutzerWhitespaces" nicht zusätzlich generiert bzw. wegwirft?
Ich möchte mich da einmal mit den zuständigen Entwicklern zusammensetzen, ob wir das Problem nicht bereits beim einlesen umgehen können.

Die oben genannten Fälle habe ich hiermit erschlagen können. Was immer noch so eine Sache ist: Was ist, wenn das ganze Dokument total wild formatiert ist. Deswegen bin ich dran, dass ich mit dem Entwicklerteam mal spreche, ob wir da keine andere Lösung generieren können.
Code:
______<SomeElement><Description>
      Hier steht ein Eingabetext
_</Description>
___</SomeElement>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Parsen einer XML ohne Validierung XML & JSON 2
B XML Schema Validierung des Zahlenbereichs XML & JSON 3
C xml validierung gegen xsd mit jdom: Fehlermeldung Cannot find the declaration of element ... XML & JSON 8
J JSon <-> XML zwecks Validierung XML & JSON 4
B Validierung nur beim einlesen oder auch beim schreiben? XML & JSON 4
S Validierung mit JAXB2 ohne root-element XML & JSON 10
H XML via XSD Validierung nicht möglich? XML & JSON 2
R XML-Validierung mittels XSD unter Eclipse XML & JSON 2
D jaxb validierung/verification vor marshalling XML & JSON 3
H Schema-Validierung mit JDOM XML & JSON 2
C Validierung klappt nicht mit Schema XML & JSON 2
S XML Validierung mit XSD über DOM - Cannot find. XML & JSON 4
G Validierung von XML-Dokumenten XML & JSON 7
G Problem mit XML-Schema Validierung mit Java XML & JSON 12
leifg XSD Validierung mit JDK 1.3 XML & JSON 3
Zed XML dom4j xsd- Eigenschaften/Validierung XML & JSON 3
N XML Datei auslesen / Validierung XML & JSON 4
J schema-Validierung mit xerces und jdom: bug in java 1.4? XML & JSON 9
W Erzeugen einer openapi spec via swagger XML & JSON 1
W Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests XML & JSON 13
D Innerhalb einer Property auf eine andere verlinken? XML & JSON 3
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
M Layout + Inhalt einer JTable speichern XML & JSON 30
J Welche Gründe führen zu einer endlos tiefen XML? XML & JSON 4
T Pfad in einer Variablen speichern XML & JSON 1
E Wie kann ich ein XSD-Schema in einer JSP-Seite verwenden? XML & JSON 7
T Visualisierung von XML Dateien in einer Java SwingGui XML & JSON 11
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
F Parsen von Daten aus einer Homepage XML & JSON 6
B XML aus einer URL im Internet lesen (JDOM) XML & JSON 4
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
B 2 Attribute in einer xsl XML & JSON 2
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
T Schreiben einer XML XML & JSON 8
B XML auf Basis einer DTD erstellen XML & JSON 2
hdi Probleme beim Erstellen einer XML XML & JSON 7
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
sylo Mehrere XSDs und mehrere Namensräume in einer XML unterbringen? XML & JSON 2
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
S Probleme beim erstellen einer Jar XML & JSON 12
J Problem mit compile einer XSD XML & JSON 3
S Einlesen einer xml Datei XML & JSON 4
F hilfe bei einer aufgabe XML & JSON 3
D Anzahl der Knoten in einer XML XML & JSON 6
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M Xerces -Parsen mit einer externen Schemadatei geht nicht XML & JSON 2
cybermat Ergebnis einer XSLT-Tansformation als Rückgabewert erhalten XML & JSON 4
J Fehler beim laden einer .xml XML & JSON 3
ven000m Übungsaufgabe: Valide und gültige XML Datei zu einer DTD XML & JSON 7
A Auslesen einer XML Datei XML & JSON 58
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
T Einfach nur die Elemente einer XML Datei auslesen :( XML & JSON 10
Z Erzeugung einer Referenz von Knoten in JTree auf DOMTree XML & JSON 3
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
E JTreedaten in eine XML Datei speichern XML & JSON 3
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
E ResultSet als XML Datei speichern XML & JSON 7
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4

Ähnliche Java Themen

Neue Themen


Oben