2017-03-18 1 views
0

Ich schreibe ein Java-Programm, das XML-Dateien in Java-Objekte parst/unmarshallt.Gibt es eine praktische Möglichkeit zu überprüfen, ob eine XML-Datei ungültige Zeichen enthält

Dieses Programm nimmt XML-Dateien, die von Dritten erstellt werden und über die ich keine Kontrolle habe.

Auf die Dateien bekommen, überprüft das Programm, ob sie einem ungültigen Format mit ihren jeweiligen XSDs sind ↓

URL schemaFile = this.getClass().getClassLoader().getResource(xsd/some.xsd); 
Source xmlFile = new StreamSource(new File(/path/to/xml)); 
SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(schemaFile); 
Validator validator = schema.newValidator(); 
validator.validate(xmlFile); 

dann beginnt das Parsen/unmarshalling sie einzeln JAXP verwenden.

Das Problem, mit dem ich konfrontiert bin, ist, dass auch nach der obigen Validierung manchmal der folgende Fehler auftritt. (Der Validator oben scheint nicht zu prüfen, ob die XML ungültige Zeichen enthält, aber vergleicht nur die Eingabe mit seiner XSD)

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[xxx,xxx] 

Gibt es eine praktische Möglichkeit, zu prüfen, ob XML-Datei mit ungültigen Zeichen enthält programmatisch oder irgendein Tool ?

Ich habe den Teil (Zeile 245), wo die Ausnahme auftritt, mit "sed -n '240,250p'" extrahiert. sample.xml

+0

Können Sie sich einen Weg vorstellen, der nicht jedes einzelne Zeichen untersuchen würde? Warum können Sie die Ausnahme nicht einfach behandeln, wenn sie auftritt? –

+0

Ich bin mir nicht sicher, ob ich mit ungültigen Zeichen umgehen soll. Ich importiere die XML-Daten für einige Zwecke in eine Datenbank. (XML -> Java-Objekt -> Datenbanktabelle). Würden Sie nicht denken, dass diese ungültigen Zeichen unerwartete Nebenwirkungen haben? –

+0

Sie werden eine Parse-Ausnahme verursachen. Beginne nicht, bis die gesamte Eingabe verarbeitet wurde. Es sollte alles oder nichts sein. –

Antwort

0

Haben Sie eine Whitelist der erlaubten Zeichen? Hier ist ein Muster:

  1. Für jeden gestreamten Charakter, wenn es nicht die weiße Liste gesetzt wird, ersetzen Sie es durch nichts.
  2. Fragen Sie, ob Ihr Dateiinhalt nach der Filterung der gleichen wie zuvor (diff-Muster) ist

Wenn der Inhalt in beiden Dateien nicht gleich ist dann die Quelldatei ungültige Zeichen hatte.

Verwandte Themen