Проверка 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"/>
в
Если это та же ошибка, это может быть полезно.