2010-06-07 13 views
5

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.

Odpowiedz

0

W ten sposób nie zostaną zgłoszone błędy sprawdzania poprawności schematu. Jeśli naprawdę chcesz wierszu i kolumnie informacji, trzeba ustawić obsługi błędu, tj

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

Oto interfejs trzeba zaimplementować: ErrorHandler

+0

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

+0

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

+0

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

1

DOM nie zachowuje informacji o jego źródle - w większości przypadków jest to nieistotne, a DOM ma być manipulowany (tj. Każda informacja o lokalizacji byłaby niepoprawna).

Rozwiązaniem jest sprawdzenie w momencie analizowania: przed utworzeniem DocumentBuilder należy zadzwonić pod numer DocumentBuilderFactory.setSchema().

Powiązane problemy