这个问题在这里已经有了答案:
如何在验证期间访问失败的xsd1.1Assert规则(1个答案)
上个月关门了。
我有一个有很多Assert的xsd。xsd的作者向Assert中添加了自定义字段,因此它们如下所示:
<xs:assert test="if(field1/@value != 1 and exists(field2/@value)) then false() else true()">
<xs:annotation>
<xs:appinfo>
<das:rule_id value="60043"/>
<das:rule_text value="Field 1 is set to 1 and Field 2 has a value, which is not allowed"/>
<das:rule_type value="WARNING"/>
<das:rule_fields>
<das:field value="field1"/>
<das:field value="field2"/>
</das:rule_fields>
</xs:appinfo>
</xs:annotation>
</xs:assert>
当我根据这个xsd验证xml时,我的验证消息是test(xs:assert.test):
if(field1/@value != 1 and exists(field2/@value)) then false() else true()
但是我想输出 das
命名空间:
das:rule_id.value
das:rule_text.value
das:rule_type.value
你能告诉我怎么做吗?
我的验证代码(删除了所有不必要的内容,检查它是否正在运行):
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
[...]
public void validateXMLSchema(String xmlPath) {
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
Schema schema = factory.newSchema(new Source[] {
new StreamSource(new File(MY_XSD_PATH))
});
Validator validator = schema.newValidator();
validator.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException ex) throws SAXException {
System.out.println(ex.getLineNumber() +": " +ex.getMessage());
}
@Override
public void fatalError(SAXParseException ex) throws SAXException {
System.out.println(ex.getLineNumber() +": " +ex.getMessage());
}
@Override
public void error(SAXParseException ex) throws SAXException {
System.out.println(ex.getLineNumber() +": " +ex.getMessage());
}
});
validator.validate(new StreamSource(new File(xmlPath)));
} catch (IOException | SAXException e) {
e.printStackTrace();
}
}
我正在使用Xerc进行xsd 1.1验证:
<dependency>
<groupId>org.exist-db.thirdparty.xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.0</version>
<classifier>xml-schema-1.1</classifier>
</dependency>
谨致问候和感谢
提摩
1条答案
按热度按时间mepcadol1#
xerces xsd 1.1允许添加自定义的用户定义的错误消息。
“…这是通过在xml命名空间中指定属性”message“来完成的”http://xerces.apache.org'在架构中的xs:assert或xs:assertion元素上…'
请看这里:当XMLSchema1.1Assert返回“false”结果时,如何指定用户定义的错误消息?
以下是此类Assert错误消息的示例:xerces:message=“数字{$value}不能被2整除”。