我正在寻找一种根据内部架构验证XML文件的方法。目前这是我的代码。
final SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
SAXParser parser;
parser = factory.newSAXParser();
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
final XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new SAXErrorHandler());
reader.parse(new InputSource(doc));
它的作用是将验证错误报告为警告,如果它是非致命错误并且解析可以继续。这很好,因为如果它只是中断并抛出异常,我可以看到更多的错误。
然而它没有做的是在代码中提供信息给我,所以我可以有一个方法boolean validate()
来返回是否存在错误(警告)
所以我想到了一个自己的ErrorHandler实例,它有一个属性,我可以在解析完成后抓取但对我来说听起来不太酷:))
接下来就是解析像这样的解析需要一些时间并且只需使用验证器就可以明显更快(是的,这是时间关键;))但是因为我需要内部模式进行验证我不知道如何没有完全解析。
答案 0 :(得分:1)
是的,您想使用自定义的ErrorHandler来跟踪是否遇到错误(不确定您认为听起来“不酷”)。
至于“验证”与“解析”,您如何在不解析文档的情况下验证文档?
答案 1 :(得分:0)
public static boolean validate(String xml)
throws ParserConfigurationException, IOException {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
// custom error handler
// ignore warning, throw on error and fatal
// (we will catch later to return false!)
reader.setErrorHandler(
new ErrorHandler() {
public void warning(SAXParseException e) throws SAXException {
System.out.println("WARNING : " + e.getMessage()); // do nothing
}
public void error(SAXParseException e) throws SAXException {
System.out.println("ERROR : " + e.getMessage());
throw e;
}
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("FATAL : " + e.getMessage());
throw e;
}
}
);
reader.parse(new InputSource( xml ));
return true;
}
catch (ParserConfigurationException pce) {
throw pce;
}
catch (IOException io) {
throw io;
}
catch (SAXException se){
return false;
}
}