Я пытаюсь написать метод, который проверяет 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.), но это не помогает.
Комментарий: Используемые мной потоки правильно инициализированы, пути к файлам хорошие, я могу читать содержимое из потоков и регистрировать его как струны.
Что мне здесь не хватает?