处理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-----------------------