Validator
JavaのXML (Apache Xerces実装を使用していると思います)を使用しているときに、非常に奇妙な動作のように見えることに遭遇しました。
一部のXMLドキュメントをXSDに対して検証しようとしていますが、ドキュメントが無効になる原因となるものをすべてログに記録したいと思います。自分で実装ErrorHandler
すればこれができると思いました。これにより、XMLドキュメントが誤って検証されることにすぐに気付きました(つまり、無効なXMLがXSDに対して有効であると識別されていました)。
いくつかのテストを行ったところ、以下に示すように、単にValidator
'sを何かに設定すると、この動作が発生することがわかりました。ErrorHandler
validator.validate(invalidXmlSource); // XML correctly identified as INVALID
validator.setErrorHandler(new DefaultHandler());
validator.validate(invalidXmlSource); // XML incorrectly identified as VALID
指定されていない場合のValidator
用途DefaultHandler
だと思いますので、なぜ振る舞いが変わっているのかわかりません。
ここで何が起こっているのですか?
編集
public void validate(File dir, String xsdPath) {
File schemaFile = new File(xsdPath);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
//validator.setErrorHandler(new DefaultHandler()); <-- this line causes incorrect validation
for (File xmlFile: dir.listFiles()) {
try {
validator.validate(new StreamSource(xmlFile));
System.out.println("File '" + xmlFile.getName() + "' is valid.");
} catch (SAXException e) {
System.out.println("File '" + xmlFile.getName() + "' is NOT valid.");
System.out.println("Reason: " + e.getLocalizedMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
}