我是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>
任何人都可以帮助我吗?
答案 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);