XML проверка по XSD с использованием javax. xml .validation.Validator: невозможно разрешить типы, поступающие из 2-го XSD - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь написать метод, который проверяет XML против XSD. В моем случае у меня есть несколько файлов XSD.

Когда я использую инструменты, такие как IntelliJ IDEA, для генерации образца XML из моего основного XSD, все выглядит нормально: образец XML генерируется и выглядит так, как я ожидаю , Поэтому я думаю, что с моими XSD-файлами все в порядке.

Это мой упрощенный основной XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

    <xsd:import schemaLocation="xmldsig-core-schema.xsd" namespace="http://www.w3.org/2000/09/xmldsig#" />

    <xsd:element name="Message">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="messageId" type="xsd:string" />
                <xsd:element ref="ds:Signature" minOccurs="0" />
            </xsd:sequence>
            <xsd:attribute name="Id" type="xsd:string" use="optional"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Я скачал и положил xmldsig-core-schema.xsd в тот же каталог с моими файлами XSD.

Я получаю ошибку:

org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'ds:Signature' to a(n) 'element declaration' component.

Java код:

InputStream xsdStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("schema/my.xsd");
// 1. InputStream xsdSignatureStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("schema/xmldsig-core-schema.xsd");

Source[] sources = new StreamSource[1];
sources[0] = new StreamSource(xsdStream);
// 2. sources[1] = new StreamSource(xsdSignatureStream);

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// 3. schemaFactory.setResourceResolver(new ClasspathResourceResolver());
Schema schema = schemaFactory.newSchema(sources);

Validator validator = schema.newValidator();

String xmlString = "...";
StringReader xmlStringReader = new StringReader(xmlString)
Source source = new StreamSource(xmlStringReader);
validator.validate(source);

Так что кажется, что javax.xml.validation.Validator не видит мой второй XSD-файл. Поэтому я попытался добавить его при инициализации javax.xml.validation.Schema, но это не помогло (см. Закомментированные строки 1. и 2.).

Я также попытался создать и добавить внешний ResourceResolver (см. Закомментированный строка 3.), но это не помогает.

Комментарий: Используемые мной потоки правильно инициализированы, пути к файлам хорошие, я могу читать содержимое из потоков и регистрировать его как струны.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 19 февраля 2020

Я подозреваю, что когда документ схемы загружается с использованием getResourceAsStream("schema/my.xsd");, у него нет известного базового URI, и поэтому относительный URI xmldsig-core-schema.xsd не разрешается должным образом. Попробуйте установить базовый URI (systemId свойство) для вашего StreamSource объекта.

...