如何使用SaxonJ-HE 11基于XSD模式校验XML文档
结论
SaxonJ-HE(家庭版)确实支持基于XSD模式的XML报文校验。你看到的文档表述是准确的:11版本开始SaxonJ-HE实现了JAXP标准接口中定义的XML Schema校验能力,不需要额外购买商业授权即可使用。
注意:SaxonJ-HE仅支持W3C XML Schema 1.0标准,XSD 1.1相关特性需要使用专业版(PE)或企业版(EE)才可调用。
具体实现方法
SaxonJ-HE的XSD校验能力完全遵循JAXP标准API规范,不需要调用Saxon专属类即可完成开发,步骤如下:
- 第一步:引入SaxonJ-HE依赖,以Maven项目为例,在pom.xml中添加如下依赖(版本选择11.0及以上即可):
<dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>11.4</version> </dependency>
- 第二步:编写校验代码,核心逻辑如下:
import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import java.io.File; public class XmlXsdValidator { public static void validateXmlByXsd(String xsdPath, String xmlPath) throws Exception { // 初始化W3C XML Schema类型的Schema工厂,Saxon会自动通过SPI注册对应实现 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // 加载XSD模式文件生成Schema实例 Schema schema = schemaFactory.newSchema(new File(xsdPath)); // 生成校验器 Validator validator = schema.newValidator(); // 执行校验,若XML不符合XSD规则会直接抛出SAXException validator.validate(new StreamSource(new File(xmlPath))); } public static void main(String[] args) throws Exception { validateXmlByXsd("src/main/resources/test.xsd", "src/main/resources/test.xml"); System.out.println("XML校验通过,符合XSD规则要求"); } }
注意事项
- 该特性仅在SaxonJ-HE 11.0及以上版本提供,10.x及更早的HE版本未内置XSD校验能力,使用旧版本会报找不到实现类的错误。
- 如果项目中同时引入了其他JAXP Schema实现(比如JDK内置的Xerces、其他XML解析包),可能出现实现类加载冲突,可手动指定Saxon的实现类解决:
SchemaFactory schemaFactory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI, "net.sf.saxon.jaxp.SchemaFactoryImpl", null );
- 默认校验逻辑遇到错误会直接抛出异常终止流程,如果需要收集所有校验错误、自定义错误提示,可调用
Validator的setErrorHandler方法传入自定义的错误处理器,按需处理不同级别的校验事件。
内容的提问来源于stack exchange,提问作者msciwoj
相关产品推荐
相关产品推荐

