我使用 Xerces2 Java Parser 来验证基于 XML Schema 1.1 的 XML 文件。我已经在 maven 存储库中导入了 Apache Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) 二进制包附带的所有 jar。在玩了一些配置之后,它工作正常。
我的目标是针对 XML Schema 1.1 验证不包含命名空间的 XML 文件。
架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xerces="http://xerces.apache.org">
<xs:element name="root" type="CT_ROOT" />
<xs:complexType name="CT_ROOT">
<xs:sequence>
<xs:element name="myid" type="xs:string" minOccurs="1" />
<xs:element name="mytest" type="ST_Integer" minOccurs="1" />
</xs:sequence>
<xs:assert test="myid gt 100" xerces:message="myid has to be greater than 100" />
</xs:complexType>
<xs:simpleType name="ST_Integer">
<xs:restriction base="xs:integer" xmlns:xerces="http://xerces.apache.org">
<xs:minInclusive value="10" />
<xs:assertion test="$value mod 2 eq 0" xerces:message="Value of element 'test' must be divisible by 2"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<myid>123</myid>
<mytest>60</mytest>
</root>
Java 代码:
@Test
public void validateWithXerces() {
System.setProperty("jaxp.debug", "true");
StreamSource schemaDocument = new StreamSource(schemaDocumentString);
Source instanceDocument = new StreamSource(new File(instanceDocumentString));
SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
Schema schema;
try {
schema = schemaFactory.newSchema(schemaDocument);
Validator validator = schema.newValidator();
validator.validate(instanceDocument);
} catch (Exception e) {
e.printStackTrace();
}
}
问题是当 JUnit 测试运行时,QName 类断言命名空间并且它失败了。具体测试的目标不是命名空间的有效性,因为它是有意识的缺席的,而是 XML 验证。因此我们可以忽略命名空间断言。
抛出的异常是(省略了一些行):
java.lang.AssertionError
at org.eclipse.wst.xml.xpath2.processor.internal.types.QName.namespace(QName.java:235)
at org.eclipse.wst.xml.xpath2.processor.DefaultEvaluator.evaluate(DefaultEvaluator.java:239)
at org.apache.xerces.impl.xs.AbstractPsychoPathImpl.evaluatePsychoPathExpr(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Validator.java:124)