要处理错误,您必须实现接口ErrorHandler
或扩展DefaultHandler
帮助程序类并重新定义error
方法。这就是验证错误所调用的方法。如果您想更精确,我认为您将不得不分析错误消息。我认为 SaX 不会为您提供使错误易于修复的东西。
顺便说一句,请注意,要针对 XSD 进行验证,您不应使用方法setValidating
. 请参阅下面的代码。
该setValidating
方法的Java doc(1.7)说:
请注意,此处的“验证”是指 XML 建议中定义的验证解析器。换句话说,它本质上只是控制 DTD 验证。(除了 JAXP 1.2 中定义的两个遗留属性。)
要使用 W3C XML Schema 或 RELAX NG 等现代模式语言而不是 DTD,您可以通过将 setValidating(boolean) 方法设置为 false 来将解析器配置为非验证解析器,然后使用 setSchema(Schema) 方法关联一个解析器的架构。
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
// ...
public static void main(String args[]) throws Exception {
if (args.length == 0 || args.length > 2) {
System.err.println("Usage: java Validator <doc.xml> [<schema.xsd>]");
System.exit(1);
}
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants. W3C_XML_SCHEMA_NS_URI);
String xsdpath = "book.xsd";
if (args.length == 2) {
xsdpath = args[1];
}
Schema s = sf.newSchema(new File(xsdpath));
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
factory.setSchema(s);
XMLReader parser = factory.newSAXParser().getXMLReader();
parser.setFeature("http://xml.org/sax/features/namespaces", true);
parser.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
PrintStream out = new PrintStream(System.out, true, "UTF-8");
parser.setContentHandler(new MyHandler(out));
parser.setErrorHandler(new DefaultHandler());
parser.parse(args[0]);
}
}