如何使Java的javax XML解析器严格校验所有XML语法违规?
如何让javax XML解析器严格检查XML语法违规
要让javax自带的XML解析器严格检测所有语法违规,需要从启用验证模式和自定义错误处理两方面入手——默认配置下解析器仅做宽松的语法检查,会忽略部分不规范写法。
修改后的代码示例
import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.ByteArrayInputStream; import java.io.IOException; public class StrictXmlParser { public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(false); // 启用验证模式,开启严格语法检查 factory.setValidating(true); // 配置解析器特性,确保严格遵循XML规范,同时避免加载外部DTD try { factory.setFeature("http://xml.org/sax/features/validation", true); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); } catch (ParserConfigurationException e) { throw new RuntimeException("Failed to configure XML parser features", e); } DocumentBuilder builder = factory.newDocumentBuilder(); // 自定义错误处理器:将所有警告、错误转为异常抛出,中断解析并报错 builder.setErrorHandler(new ErrorHandler() { @Override public void warning(SAXParseException e) throws SAXException { throw e; } @Override public void error(SAXParseException e) throws SAXException { throw e; } @Override public void fatalError(SAXParseException e) throws SAXException { throw e; } }); String oops = "<xml><oops></oops>></xml>"; ByteArrayInputStream stream = new ByteArrayInputStream(oops.getBytes()); builder.parse(stream); } }
关键配置说明
setValidating(true):开启解析器的验证功能,默认关闭状态下解析器仅做基础语法校验,会忽略如多余符号这类不规范写法。- SAX特性配置:通过设置
http://xml.org/sax/features/validation确保解析器严格执行XML规范,另外两个特性用于禁用外部DTD加载,避免依赖外部资源且加快解析速度。 - 自定义ErrorHandler:默认的错误处理器仅打印错误信息但不中断解析,自定义后任何警告、错误都会直接抛出
SAXParseException,测试时能立即捕获语法违规问题。
修改后,原代码中</oops>></xml>里的多余>会触发异常,实现严格的语法校验。
内容的提问来源于stack exchange,提问作者Phlip
相关产品推荐
相关产品推荐

