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>
Другие вопросы по тегам