2015-08-20 2 views
1

Я хочу размонтировать входящий XML-объект со схемой. Я создал схему с командой schemagen из объекта java и добавил некоторые атрибуты minOccur и maxOccur.Не удалось прочитать файл схемы из документа

Я поместил схему в src/main/resources. Это ошибка: Failed to read schema document 'file:/C:/Users/cen/Desktop/wildfly-8.1.0.Final-sy/standalone/deployments/vloga-ear.ear/vloga-service.jar/VlogaData.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

Код:

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
      ClassLoader classLoader = getClass().getClassLoader(); 
      File schemaFile = new File(classLoader.getResource("VlogaData.xsd").getFile()); 
      if (schemaFile.canRead()) LOG.info("can read"); 
      Schema schema = sf.newSchema(schemaFile); 
      Unmarshaller unmarshaller = context.createUnmarshaller(); 
      unmarshaller.setSchema(schema); 

схемы XSD (пробовал и без тегов XML с XSD имен, такой же результат):

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="VlogaData" type="VlogaData"/> 

    <xs:complexType name="VlogaData"> 
    <xs:sequence> 
     <xs:element minOccurs="1" maxOccurs="1" name="idVloge" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="idPriloge" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="imeVloge" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="verzija" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="vrstaPriloge" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="datumOblikovanja" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="datumZadnjeSpremembe" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="lastnik" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="kljucneBesede" type="xs:string"/> 
     <xs:element minOccurs="1" maxOccurs="1" name="priloga" type="xs:base64Binary"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Как определить, какие причина трех это? Путь к файлу кажется полным (я распаковал банку и схему там). «читать» не выводится из регистратора, поэтому файл не может быть прочитан .. но почему? И третье рассуждение должно быть полным, потому что я пробовал три разные схемы и ничего не работает.

+0

Каков полный путь к файлу схемы относительно содержимого jar? classloader.getresource ищет в том же каталоге, что и класс. если он находится в основе каталога, вам лучше выполнить его /VlogaData.xsd. В то же время я бы тоже пошел на Classloader.getResourceAsStream. – maress

+0

Схема находится прямо в банке. Я попытался с/VlogaData, но ошибка точно такая же. Я видел примеры кода, используя поток, но конструктор схемы ожидает файл, поэтому я стараюсь не переводить из потоков в файл, если это возможно. – cen

ответ

1

Я думаю, что файл не может быть прочитан, потому что он находится внутри банки, тогда file:/C:/Users/cen/Desktop/wildfly-8.1.0.Final-sy/standalone/deployments/vloga-ear.ear/vloga-service.jar/VlogaData.xsd на самом деле не файл.

Как SchemaFactory.newSchema может получить URL я предлагаю вам сделать проще:

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    ClassLoader classLoader = getClass().getClassLoader(); 
    Schema schema = sf.newSchema(classLoader.getResource("VlogaData.xsd")); 

Он работал в небольшой тест в моей среде.

+0

Снова спаси мою жизнь .. – cen

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