【发布时间】: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