Moje dane wejściowe to dobrze sformatowany dokument XML i odpowiedni dokument schematu XML. Chciałbym określić położenie w dokumencie XML, które powoduje, że nie sprawdza poprawności w stosunku do dokumentu XML Schema. Nie mogłem dowiedzieć się, jak to zrobić przy użyciu standardowego podejścia walidacji w Javie:Programowe określanie, który węzeł w dokumencie XML spowodował sprawdzanie poprawności w odniesieniu do jego schematu XML, aby się nie powieść
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) {
...
}
mam bawił się z ideą coraz przynajmniej numer wiersza i kolumny z SAXParseException, ale oni zawsze ustawiony na - 1, -1 przy błędzie sprawdzania poprawności.
Próbowałem również. Również zwraca -1 dla wiersza i kolumny: wyjątek błędu: cvc-complex-type.3.2.2: Atrybut "xsi: noNamespaceSchemaLocation" nie może pojawić się w elemencie 'shiporder'., Wiersz: -1, kolumna: -1 wyjątek błędu: cvc-datatype-valid.1.2.1: "asdf9.90" nie jest prawidłową wartością "dziesiętnej"., Wiersz: -1, kolumna: -1 wyjątek błędu: cvc-type.3.1 .3: Wartość "asdf9.90" elementu "price" jest niepoprawna., Line: -1, column: -1 – user360603
Masz na myśli, że metody error() i warning() w ErrorHandler są przekazywane -1 w informacje o wyjątku? To dziwne, nie powinno się dziać ... może wypróbować inną implementację parsera SAX? – xcut
Masz rację, z DOM nie są, z SAX są. Mając jednak numery linii i kolumn, mam problem z odtwarzaniem wstecz przez strumień znaków, aby znaleźć węzeł lub atrybut, który się nie powiódł. Również numer kolumny wydaje się być końcem zamykającego tagu i nie wiem, czy zawsze tak było w przypadku każdej implementacji parsera. – user360603