2010-06-07 7 views
5

My Eingang ein wohlgeformtes XML-Dokument ist und ein entsprechendes XML-Schema-Dokument. Was ich tun möchte, ist die Position innerhalb des XML-Dokuments zu bestimmen, die dazu führt, dass die Validierung des XML-Schemadokuments fehlschlägt. Ich kann nicht herausfinden, wie dies den Standardvalidierungsansatz in Java verwenden zu tun:Programatically Bestimmen, welche Knoten in einem XML-Dokument Validierung gegen ihr XML Schema verursacht auszufallen

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(... /* the .xsd source */); 
Validator validator = schema.newValidator(); 
DocumentBuilderFactory ... 
DocumentBuilder ... 
Document document = DocumentBuilder.parse(... /* the .xml source */); 
try { 
    validator.validate(new DOMSource(document)); 
    ... 
} catch (SAXParseException e) { 
    ... 
} 

Ich habe mit der Idee des Erhaltens zumindest die Zeilen- und Spaltennummer von SAXParseException gespielt, aber sie sind immer auf - 1, -1 bei Validierungsfehler.

Antwort

0

Sie werden keine Schemavalidierungsfehler erhalten berichtet auf diese Weise. Wenn Sie wirklich Zeilen- und Spalteninformationen möchten, müssen Sie einen Fehlerhandler setzen, das heißt

try { 
    validator.setErrorHandler(handler); 
    validator.validate(...); 
} catch (SAXParseException e) { 
    // Use handler info, or log it in handler 
} 

Hier ist die Schnittstelle, die Sie implementieren müssen: ErrorHandler

+0

Ich habe das auch schon ausprobiert. Es kehrt zu -1 für Zeile und Spalte: Fehlerausnahme: CVC-Komplex-type.3.2.2: Attribut 'xsi: noNamespaceSchemaLocation'. Nicht in Elemente erscheinen darf 'ShipOrder' Zeile: -1, Säule: -1 Fehler Ausnahme: CVC-Datentyp-valid.1.2.1: 'asdf9.90' ist kein gültiger Wert für 'dezimal' Zeile:. -1, Säule: -1 Fehler Ausnahme: CVC-type.3.1 .3: Der Wert 'asdf9.90' des Elements 'price' ist nicht gültig., Line: -1, column: -1 – user360603

+0

Sie meinen, die Methoden error() und warning() im ErrorHandler werden in der Klasse -1 übergeben Ausnahmeinfo? Das ist seltsam, sollte nicht passieren .. vielleicht versuchen Sie eine andere SAX-Parser-Implementierung? – xcut

+0

Sie haben Recht, mit DOM sind sie nicht, mit SAX sind sie. Mit den Zeilen- und Spaltennummern habe ich jedoch das Problem, rückwärts durch einen Zeichenstrom zu gehen, um den Knoten oder das Attribut zu finden, das fehlgeschlagen ist. Außerdem scheint die Spaltennummer das Ende des Close-Tags zu sein und ich weiß nicht, dass das bei jeder Parser-Implementierung immer der Fall sein könnte. – user360603

1

A DOM keine Informationen über seine Quelle behalten - in den meisten Fällen ist es irrelevant, und DOM soll manipuliert werden (dh jeder Standortinformationen wäre falsch).

Die Lösung besteht darin, zu der Zeit zu validieren, die Sie analysieren: Rufen Sie DocumentBuilderFactory.setSchema() vor der Erstellung der DocumentBuilder.