java—如何在xml验证期间获取xsdAssert的自定义字段

ztyzrc3y  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(352)

这个问题在这里已经有了答案

如何在验证期间访问失败的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>

谨致问候和感谢
提摩

mepcadol

mepcadol1#

xerces xsd 1.1允许添加自定义的用户定义的错误消息。
“…这是通过在xml命名空间中指定属性”message“来完成的”http://xerces.apache.org'在架构中的xs:assert或xs:assertion元素上…'
请看这里:当XMLSchema1.1Assert返回“false”结果时,如何指定用户定义的错误消息?
以下是此类Assert错误消息的示例:xerces:message=“数字{$value}不能被2整除”。

相关问题