我有一个<assert>
验证多个字段的 XSD 规则,例如:
<xs:assert test="if(FIELD1/@value = (2,3,4) and not(exists(FIELD2/@value))) then false() else true()" xerces:message="Field 1 is 2, 3 or 4 but field 2 still has no value. Check that, please">
<xs:annotation>
<xs:appinfo>
<das:rule_fields>
<das:field value="FIELD1"/>
<das:field value="FIELD2"/>
</das:rule_fields>
</xs:appinfo>
</xs:annotation>
</xs:assert>
我经过验证的 XML 如下所示:
<body>
<residents>
<resident>
<data>
<ID value="123">
<FIELD1 value="3"/>
<FIELD2/>
</data>
</resident>
<resident>
<data>
<ID value="456">
<FIELD1 value="0"/>
<FIELD2/>
</data>
</resident>
<resident>
<data>
<ID value="789">
<FIELD1 value="3"/>
<FIELD2 value="1"/>
</data>
</resident>
</residents>
</body>
我的验证代码看起来像这样(变得更短更容易):
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(XML);
Schema schema = factory.newSchema(new Source[] {
new StreamSource(new File(MY_XSD))
});
Validator validator = schema.newValidator();
validator.setErrorHandler(new ErrorHandler(){
@Override
public void warning(SAXParseException exception) throws SAXException {
exceptionBase.add(exception);
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
exceptionBase.add(exception);
}
@Override
public void error(SAXParseException exception) throws SAXException {
exceptionBase.add(exception);
}
});
validator.validate(new StAXSource(reader));
} catch (IOException | SAXException | XMLStreamException | FactoryConfigurationError e) {
e.printStackTrace();
}
当我验证 XML 时,resident/data
带有ID
123 的块违反了断言,因为 FIELD1 为 3(在 2、3、4 中)并且 FIELD2 没有值。我的 SAXParseException 与我的断言消息一起抛出(“字段 1 是 2、3 或 4,但字段 2 仍然没有值。请检查一下”)。XMLStreamReader reader
站在我的结束</data>
标记的位置,即 END_ELEMENT 。对于 END_ELEMENT,我不能调用reader.getElementText()
,所以有机会回到起始元素并打印<ID>
(123) 的内容吗?
或者有没有其他方法可以获得<data>---</data>
导致错误的整个块?
亲切的问候蒂莫