【问题标题】:How to get custom fields of XSD assert during XML validation [duplicate]如何在 XML 验证期间获取 XSD 断言的自定义字段 [重复]
【发布时间】:2020-11-19 19:38:50
【问题描述】:

我有一个带有很多断言的 XSD。 XSD 的作者在断言中添加了自定义字段,因此它们看起来像这样:

<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 时,我的验证消息是测试 (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();
    }
}

我正在使用 xerxec 进行 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>

提前致以诚挚的问候和感谢

提莫

【问题讨论】:

  • 请编辑您的帖子并添加您的 XSD 处理器及其确切版本。
  • @YitzhakKhabinsky,我在我的验证代码中添加了导入,并从我的 pom.xml 中添加了我的 xerxes 依赖项。如果您需要更多信息,尽管问!

标签: java xml xsd assert xsd-validation


【解决方案1】:

Xerces XSD 1.1 允许添加自定义的用户定义错误消息。

"...这是通过在 XML 中指定属性“消息”来完成的 xs:assert 或 xs:assertion 上的命名空间“http://xerces.apache.org” 架构中的元素..."

在这里查看:How to specify a user defined error message, when an XML Schema 1.1 assertion returns a 'false' result?

以下是此类断言错误消息的示例: xerces:message="数字 {$value} 不能被 2 整除"。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多