java.lang.AssertionError с использованием xercesImpl XML Schema 1.1 без пространства имен
Я использую Xerces2 Java Parser для проверки XML-файлов на основе XML-схемы 1.1. Я импортировал все jar-файлы, которые поставляются с двоичным пакетом Apache Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) в репозиторий maven. После некоторой игры с конфигурацией все работает нормально.
Моя цель - проверить XML-файл, который не содержит пространства имен, по XML-схеме 1.1.
Схема:
<?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)
1 ответ
Решение состоит в том, чтобы просто отключить утверждения. Вы можете отключить утверждение определенного класса или каждого класса.
Первое решение кажется более подходящим. В этом случае добавьте следующий код в свой тестовый класс. Просто убедитесь, что кусок кода перед вызовом валидатора.
ClassLoader loader = this.getClass().getClassLoader();
loader.setClassAssertionStatus("org.eclipse.wst.xml.xpath2.processor.internal.types.QName", false);
Если вы хотите отключить утверждения для каждого класса, вы можете сделать это с Maven:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<enableAssertions>false</enableAssertions>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>