2013-10-15 4 views
5

У меня проблема с проверкой объекта с заданным xsd. Классы были созданы из xsd.JAXB - SAXParseException Не удается найти объявление элемента

SchemaFactory factory = SchemaFactory 
       .newInstance("http://www.w3.org/2001/XMLSchema"); 
Schema schema = factory.newSchema(getClass().getResource("/xsd/test.xsd")); 
JAXBContext context = JAXBContext.newInstance(aClass); 
Unmarshaller u = context.createUnmarshaller(); 
u.setSchema(schema); 
Object anObject = u.unmarshal(new StreamSource(new StringReader(
       MESSAGE)), aClass); 

Вот сообщение об исключении

[org.xml.sax.SAXParseException: CVC-elt.1: Не удается найти объявление элемента 'ACCESREFUSE.]

Вот XSD :

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="./include/CJCommon.xsd"/> 
<xs:element name="ACCESREFUSE"> 
<xs:complexType> 
    <xs:sequence maxOccurs="1" minOccurs="1"> 
    <!-- Entete --> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDOper"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="DateEvt"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDEvt"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDJoueur"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="HashJoueur"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDSession"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IPJoueur"/> 
    <xs:element maxOccurs="1" minOccurs="0" ref="IDCoffre"/> 
    <!-- Corps --> 
    <xs:element maxOccurs="1" minOccurs="1" ref="TypAg"/> 
    <xs:element maxOccurs="1" minOccurs="0" name="CauseRefus" type="string-1024"/> 
    <xs:element maxOccurs="1" minOccurs="0" name="TypeRefus"> 
     <xs:simpleType> 
     <xs:restriction base="string-1024"> 
      <xs:enumeration value="DelaiIdentite"/> 
      <xs:enumeration value="RejetIdentite"/> 
      <xs:enumeration value="Interdit"/> 
      <xs:enumeration value="AutoInterdit"/> 
      <xs:enumeration value="OpVerrouille"/> 
      <xs:enumeration value="Verrouille"/> 
      <xs:enumeration value="Cloture"/> 
      <xs:enumeration value="Autre"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

Элемент ACCESREFUSE является корнем xml.

XML:

<ACCESREFUSE> 
     <dateEvt>Tue Oct 15 11:45:48 CEST 2013</dateEvt> 
     <hashJoueur>0000000000000000000000000000000000000000</hashJoueur> 
     <typAg>JC</typAg> 
     <causeRefus>Interdit</causeRefus> 
     <typeRefus>Interdiction Temporaire</typeRefus> 
     <idjoueur>81.252.190.129</idjoueur> 
     <idoper>002</idoper> 
     <idsession>301090</idsession> 
     <idevt>0</idevt> 
     <ipjoueur/> 
     <idcoffre/> 
</ACCESREFUSE> 

Любая идея? Спасибо

ответ

4

Вы можете попытаться изменить вашу схему, чтобы:

<xs:element name="ACCESREFUSE"> 
<xs:complexType name="ACCESREFUSE"> 
... 
</xs:schema> 

EDIT: Я думаю, что у вас есть проблемы с нагрузкой XSD. Не могли бы вы изменить этот код для целей тестирования:

InputStream xmlStream = ... 
Schema schema = factory.newSchema(xmlStream); 

Попробуйте!

EDIT2: Я пробовал разбор ACCESREFUSE класс с вашим XSD. Я не знаю вашу схему ./include/CJCommon.xsd, поэтому я пропустил ее. Вот мой код:

 SchemaFactory factory = SchemaFactory 
       .newInstance("http://www.w3.org/2001/XMLSchema"); 
     File file = new File("test.xml"); 
     Schema schema = factory.newSchema(file); 

    JAXBContext context = JAXBContext.newInstance(ACCESREFUSE.class); 
    Unmarshaller u = context.createUnmarshaller(); 
    u.setSchema(schema); 
    Object anObject = u.unmarshal(new StreamSource(new StringReader(
      getMessage())), ACCESREFUSE.class); 

-Мои ACCESREFUSE.class:

@XmlRootElement(name="ACCESREFUSE") 
public class ACCESREFUSE { 

    protected String v1; 
    protected String v2; 
    protected String v3; 
    protected String v4; 
    protected String v5; 
    protected String v6; 
    protected String v7; 
     protected String v8; 
    protected String v9; 
    protected String CauseRefus; 
    protected TypeRefus typeRefus; 

    public enum TypeRefus{ 
     DelaiIdentite, RejetIdentite, Interdit, AutoInterdit, OpVerrouille, Verrouille, Cloture, Autre; 
    } 

Сообщение:

private static String getMessage() { 

     return "<ACCESREFUSE>" 
       + "<v1>Tue Oct 15 11:45:48 CEST 2013</v1>" 
       + "<v2>0000000000000000000000000000000000000000</v2>" 
       + "<v3>JC</v3>" + "<v4>Interdit</v4>" 
       + "<v5>81.252.190.129</v5>" 
       + "<v6>002</v6>" + "<v7>301090</v7>" 
       + "<v8>0</v8>" + "<v9> test </v9>" 
       + "<TypeRefus>RejetIdentite</TypeRefus>" 

       + "</ACCESREFUSE>"; 
    } 

и редактировали XSD для простых строковых элементов:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="ACCESREFUSE"> 
<xs:complexType> 
    <xs:sequence maxOccurs="1" minOccurs="1"> 
    <!-- Entete --> 
    <xs:element maxOccurs="1" minOccurs="1" type="xs:string" name="v1"/> 
    ... 

Программа правильно работает! :)

Так вы можете проверить свой ./include/CJCommon.xsd? Используете ли вы префикс xs для type="xs:string"?

+0

Ну, это странно, потому что валидация работала до ошибки. Только когда все в порядке, у меня есть ошибка с корневым элементом. Я попытался с InputStream, но результат был таким же – BkSouX

+0

перед исключением, валидация работала, когда XML был неправильным. например, он сказал мне изменить поля ... – BkSouX

+1

да, это работает спасибо. проблема была в CJCommon :) Спасибо за вашу помощь! – BkSouX

0

Может быть проблемой пространства имен. вы должны попробовать импортировать ./include/CJCommon.xsd с надлежащим объявлением пространства имен и т. д. link

+0

Я не могу изменить xsd, но я попробую. – BkSouX

+0

ничего не изменилось – BkSouX

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