Проверка XML по XSD, содержащему xsd: импорт без местоположения

Как проверить XML по схеме XSD, содержащей импорт, без расположения схемы?

Фрагмент XSD:

<xs:schema xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types
    xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/types"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://schemas.microsoft.com/exchange/services/2006/types"
    elementFormDefault="qualified" version="Exchange2010_SP2" id="types">
    <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
...

Уже прочитал и попробовал:

Этот и этот тоже... Безуспешно.

Невозможно удалить этот импорт из схемы, поскольку он содержит ссылку на атрибут xml: lang.

В варианте 1 ResourceResolver метод resolResource запущен с systemId = null

public class ResourceResolver  implements LSResourceResolver {

    public LSInput resolveResource(String type, String namespaceURI,
            String publicId, String systemId, String baseURI) {

      //Some implementation

      return new Input(publicId, systemId, resourceAsStream);

В варианте 2 попробовал так:

SchemaFactory sFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        //sFactory.setResourceResolver(new ResourceResolver());
        Schema schema = sFactory.newSchema(new Source[] {
            new StreamSource("http://www.w3.org/XML/1998/namespace"),
            new StreamSource(MailGateMQBinding.class.getResourceAsStream("/types.xsd")),
        });
validator = messageSchema.newValidator();
            source = new DOMSource(inDocBody);
            validator.validate(source);

Но есть исключение: без new StreamSource("http://www.w3.org/XML/1998/namespace") org.xml.sax.SAXParseException: src-resol: невозможно преобразовать имя "xml: lang" в (n) "объявление атрибута".

и с этим new StreamSource("http://www.w3.org/XML/1998/namespace")org.xml.sax.SAXParseException: s4s-elt-символ: непробельные символы недопустимы в элементах схемы, кроме "xs: appinfo" и "xs: documentation". Saw "Пространство имен" xml: ".

Любая помощь будет принята с благодарностью.

2 ответа

Решение

Схема XML для http://www.w3.org/XML/1998/namespace пространство имен находится здесь: http://www.w3.org/2001/xml.xsd

Таким образом, вы можете просто указать его местоположение в <xs:import> в вашей схеме:

<xs:schema xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types
    xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/types"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://schemas.microsoft.com/exchange/services/2006/types"
    elementFormDefault="qualified" version="Exchange2010_SP2" id="types">

    <xs:import namespace="http://www.w3.org/XML/1998/namespace" 
               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
...

Это будет работать, но учтите, что W3C не нравится огромный трафик к этому файлу: http://www.w3.org/2001/xml.xsd. Таким образом, они искусственно задерживают доступ к нему.

Многие программы содержат локальные копии таких схем. (Вот почему местоположение схемы не указано. Программное обеспечение схемы обычно загружает его из своих ресурсов).

Вы также можете скопировать его на свой компьютер и указать URL-адрес этой копии.

Альтернативный способ - использовать каталог XML, например так: catalog.xml:

<?xml version="1.0"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <!-- 
    This will redirect the namespace URI to the local schema file,
    which should be found in the same directory as the catalog.xml
  -->
  <uri name="http://www.w3.org/XML/1998/namespace" uri="xml.xsd"/>
</catalog>

Но вам придется как-то передать этот файл каталога в программное обеспечение вашего процессора схемы (если оно поддерживает каталоги XML)

Просто удалите:

<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd">

из xml.xsd

И изменить

<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>

в

Если это та же ошибка, это может быть полезно.

Другие вопросы по тегам