使用Apache commos配置针对xsd验证xml

时间:2015-04-28 17:30:56

标签: java xml xsd xsd-validation apache-commons-config

我是XML的新手。

我使用Apache Commons XMLConfiguration进行配置。

我需要基于模式的验证。

xsd位于我的java项目的resources文件夹中。

xml和xsd不在同一位置

关注documentation(仅报告DTD的示例)。我生成以下代码:

    URL urlXsd = getClass().getResource("config.xsd");
    DefaultEntityResolver resolver = new DefaultEntityResolver();
    resolver.registerEntityId("configuration", urlXsd);

    XMLConfiguration xmlConfig = new XMLConfiguration();
    xmlConfig.setEntityResolver(resolver);
    xmlConfig.setSchemaValidation(true);

     xmlConfig.load(new File("config.xml"));

我得到以下例外:

Caused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 16; cvc-elt.1: Cannot find the declaration of element 'configuration'.

我的config.xsd:

<?xml version="1.0" encoding="UTF-8"?>
   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
         <xs:element name="configuration">
               <xs:complexType>
                     <xs:sequence>
                           <xs:element name="reader">
                           </xs:element>
                           <xs:element name="writer">
                           </xs:element>
                     </xs:sequence>
               </xs:complexType>
         </xs:element>
   </xs:schema>

我的config.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<configuration>
   <reader>
   </reader>
   <writer>
   </writer>
</configuration>

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我也遵循了文档(也在当前的Apache Commons Configuration2中),并且在这种情况下加载模式并不起作用。在文档的底部说明:

  

有望使用Commons Configuration提供的机制   在大多数情况下足够,但肯定会有   他们不是的情况。 XMLConfiguration提供了两个   应该为应用程序提供所有的扩展机制   他们可能需要灵活性。第一,注册自定义实体   解析器已在前一节中讨论过。该   第二是XMLConfiguration提供了一种通用的设置方式   要使用的XML解析器:可以使用预配置的DocumentBuilder对象   传递给setDocumentBuilder()方法。

我建议您使用&#34; setDocumentBuilder&#34;,而不是&#34; setEntityResolver&#34;像这样:

   Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(new File("C:\\config.xsd"));
   DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
   docBuilderFactory.setSchema(schema);
   DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

   //if you want an exception to be thrown when there is invalid xml document,
   //you need to set your own ErrorHandler because the default
   //behavior is to just print an error message.
   docBuilder.setErrorHandler(new ErrorHandler() {
       @Override
       public void warning(SAXParseException exception) throws SAXException {
           throw exception;
       }

       @Override
       public void error(SAXParseException exception) throws SAXException {
           throw exception;
       }

       @Override
       public void fatalError(SAXParseException exception)  throws SAXException {
           throw exception;
       }  
   });

   conf = new BasicConfigurationBuilder<>(XMLConfiguration.class).configure(new Parameters().xml()
           .setFileName("config.xml")
           .setDocumentBuilder(docBuilder)
           .setSchemaValidation(true)              
           .setExpressionEngine(new XPathExpressionEngine())               
           ).getConfiguration();
   FileHandler fh = new FileHandler(conf);
   fh.load(xmlStream);