我正在寻找这个问题的答案很长一段时间但是我还没有找到任何解决这个问题的方法。
所以我想使用Java XML Validation Validator针对XSD架构文件验证XML文件。它已经有效了。但是,在特定情况下,验证器似乎忽略了XML文件中的错误。
例如,如果在xml文件的以下位中“strasse”标记拼错为“strass”,则Validator会抛出错误
但如果我将标签“hausnummer”更改为“hausnumme”,则验证显示没有错误。
<adresse>
<strasse>Finsterwalderstraße</strasse>
<hausnummer>7</hausnummer>
<hausnummerzusatz></hausnummerzusatz>
<plz>83026999</plz>
<ort>Rosenheim</ort>
</adresse>
我认为第二种情况被忽略的原因是第三个标签“hausnummerzusatz”在xsd中被标记为可选。我确认在使用可选标签之前的不同标签时尝试相同。
对于验证,我使用此方法。 验证器对象的初始化
private Validator initializeSchemaValidator() throws SAXException {
Validator schemaValidator = this.schema.newValidator();
schemaValidator.setErrorHandler(this);
return schemaValidator;
}
ErrorHandler的实现
@Override
public void error(SAXParseException e) throws SAXException {
Message message = addMessage(e, MessageSeverity.ERROR);
LOGGER.error(message.toString());
}
同样的警告和fatal_error。
验证方法本身
public List<Message> validate() throws IOException {
try {
validator.validate(jaxbSource);
}
catch (SAXException ex) {
...
}
return Collections.unmodifiableList(validationMessages);
}
如果我在解组时验证XML,使用unmarshaller的setSchema()方法,我确实收到错误。但我不想使用unmarshaller进行验证。
有没有人遇到过这个问题,还是有办法告诉验证人在验证时更严格?
编辑:整个XSD有点太大了,不能在这里发布,所以我只是发布与上面例子相关的部分。
标题:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ka="http://www.g-fit.de/ngs/kundenauftrag" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:voi="http://www.g-fit.de/ngs/kundenauftrag/voice" xmlns:ip="http://www.g-fit.de/ngs/kundenauftrag/ip_nga" targetNamespace="http://www.g-fit.de/ngs/kundenauftrag" elementFormDefault="qualified" attributeFormDefault="unqualified" jxb:version="2.0">
地址类型的定义:
<xs:complexType name="adresse">
<xs:sequence>
<xs:element name="strasse" type="xs:string"/>
<xs:element name="hausnummer" type="ka:hausnummer"/>
<xs:element name="hausnummerzusatz" type="xs:string" minOccurs="0"/>
<xs:element name="plz" type="ka:plz"/>
<xs:element name="ort" type="xs:string"/>
</xs:sequence>
</xs:complexType>