2013-08-30 3 views
4

Как проверить XML на схему XSD, содержащую импорт без расположения схемы?Проверка XML с XSD, содержащего 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"/> 
... 

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

This one и this too ... Неудачно.

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

В вариант 1 метод ResourceResolver resolveResource уволен с SYSTEMID = нуль

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 -resolve: Не удается разрешить имя «xml: lang» в объявлении атрибута (n) ».

и с этим new StreamSource("http://www.w3.org/XML/1998/namespace") org.xml.sax.SAXParseException: S4S-ELT символов: Non-пробельные символы не допускаются в отличных схем элементов 'хз: AppInfo' и 'хз: документация' .. Saw «The xml:« Пространство имен ».

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

+0

С процессором Saxon XSD знание этого пространства имен встроено, поэтому вам не нужно указывать местоположение. Думаю, вы используете процессор Apache Xerces? –

+0

@MichaelKay: Да, мой контейнер EE IBM WebSphere Application Server использует процессор Apache Xerces (возможно, измененный IBM). – CadaverousX

ответ

4

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-каталог, например (каталог.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 каталоги)

+0

Большое спасибо! Это делает трюк. С локальной копией проекта xml.xsd работает в обоих вариантах. – CadaverousX

-2

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

<!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"/> 

в

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

Смежные вопросы