2013-10-15 7 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 एक्सएमएल की जड़ है।

एक्सएमएल:

<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> 

संपादित करें: मुझे लगता है कि आप लोड XSD के साथ समस्या है। क्या आप इस उद्देश्य को परीक्षण उद्देश्यों के लिए बदल सकते हैं:

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

कृपया इसे आज़माएं!

EDIT2: मैंने आपके XSD के साथ ACCESREFUSE कक्षा का विश्लेषण करने की कोशिश की। मुझे आपकी ./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 देख सकते हैं? क्या आप type="xs:string" के लिए xs उपसर्ग का उपयोग कर रहे हैं?

+0

अच्छा, यह अजीब बात है क्योंकि सत्यापन त्रुटि से पहले काम करता था। केवल जब सब कुछ ठीक है, तो मुझे मूल तत्व के साथ त्रुटि है। मैंने इनपुटस्ट्रीम के साथ प्रयास किया है लेकिन अपवाद से पहले परिणाम – BkSouX

+0

है, एक्सएमएल सही नहीं था जब सत्यापन काम किया गया था। उदाहरण के लिए उसने मुझे फ़ील्ड बदलने के लिए कहा ... – BkSouX

+1

हाँ यह काम कर रहा है धन्यवाद। समस्या सीजेकॉमोन में थी :) आपकी मदद के लिए धन्यवाद! – BkSouX

0

नामस्थान समस्या हो सकती है। आपको उचित नामस्थान घोषणा आदि के साथ आयात करना चाहिए ./include/CJCommon.xsd link

+0

मैं xsd नहीं बदल सकता, लेकिन मैं कोशिश करूंगा। – BkSouX

+0

नोटिंग बदल गए – BkSouX