2

我是 XML 的新手。

我使用 Apache Commons XMLConfiguration 进行配置。

我需要一个基于模式的验证。

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

xml 和 xsd 不在同一位置

遵循文档(仅报告 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>

谁能帮我?

4

1 回答 1

0

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

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

我建议你使用“setDocumentBuilder”,而不是像这样的“setEntityResolver”:

   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);
于 2018-05-02T06:55:51.233 回答