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