基于jdom实现xml的schema验证

处理xml数据之前,我们希望提供给我们处理的xml文档是可用的,符合我们要求的数据要求的格式,而这个如何做到呢,使用schema来验证xml文档是一个比较简单可行的方法。

下面是jdom验证通过schema验证xml的几行代码。

 

//通过设置参数为true来指明读进的xml文档需要验证

SAXBuilder builder = new SAXBuilder(true);

//指定约束方式为XML schema 
builder.setFeature("http://apache.org/xml/features/validation/schema", true);

//设置初始化参数
String xsdFile = getClass().getClassLoader().getResource("test-config.xsd").toString();

builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
    xsdFile);

 

以上代码验证xml没有带命名空间的没有问题。

当如果xml带有命名空间则在验证的时候会抛出异常

org.jdom.input.JDOMParseException: Error on line 4: cvc-elt.1: Cannot find the declaration of element 'ivdr:configuration'.
 at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
 at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489)
 at org.jdom.input.SAXBuilder.build(SAXBuilder.java:807)
 at com.suntek.ivdr.loader.ContextLoader.loadContext(ContextLoader.java:36)
 at com.suntek.ivdr.loader.ContextLoader.main(ContextLoader.java:76)

 

需要修改如下:
//-----------xml带有命名空间的验证 begin--------------------------
//通过设置参数为true来指明读进的xml文档需要验证
SAXBuilder builder = new SAXBuilder(true);
//指定约束方式为XML schema 
builder.setFeature("http://apache.org/xml/features/validation/schema", true);
//设置初始化参数
String xsdNamespace = "http://ivdr.suntektech.com";
String xsdFile = getClass().getClassLoader().getResource("test-config.xsd").toString();
builder.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
    xsdNamespace + " " + xsdFile);
//------------xml带有命名空间的验证 end-----------------------

 

你可能感兴趣的:(java,apache,xml,sun)