2011-09-19 18 views
14

के साथ अपवाद मुझे एक XML फ़ाइल deserialize करने के लिए एक समस्या का सामना कर रहा है जिसे सफलतापूर्वक Simple XML Serialization ढांचे (simpleframework.org) के साथ क्रमबद्ध किया गया है।सरल एक्सएमएल फ्रेमवर्क deserialization

वहाँ an exception फेंक दिया जाता है:

Serializer serializer = new Persister(); 
File xmlFile = new File(path); 
ContactList contactList = serializer.read(ContactList.class, xmlFile); <== Error 

मेरे ContactList.java

@Root(strict=false, name="ContacList") 
public class ContactList {  
    @ElementArray (name = "Contacts") 
    Contact [] contact;  
} 

मेरे Note.java

public class Note { 
    @Element(required=false) 
    private String note; 

    public Note(String note) { 
     super(); 
     this.note = note; 
    } 

    public String getNote() { 
     return note; 
    } 
} 
:

org.simpleframework.xml.core.PersistenceException: Constructor not matched for class projet.sarelo.Note 

इस कॉल है

मेरे Contact.java

@Root 
public class Contact { 
@Attribute(name = "id") 
public String id;  

@Element(name="Nom", required=false)     
String name; 

@ElementArray(name="Phones", required=false) 
Phone [] phone; 

@ElementArray(name = "Emails", required=false) 
Email [] email; 

@ElementArray(name = "Adresses", required=false) 
Adresses [] adresses; 

@ElementArray(name = "Notes", required=false) 
Note [] note; 

public Contact(String id, String name) { 
    super(); 
    this.id = id; 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public String getId(){ 
    return id; 
} 
} 

और यह मैं deserialize करने के लिए कोशिश कर रहा हूँ एक्सएमएल फ़ाइल है।

<ContactList> 
<Contacts length="5"> 
    <contact id="1"> 
    <Adresses length="0"/> 
    <Emails length="0"/> 
    <Notes length="1"> 
     <note> 
      <note>dgfdg</note> 
     </note> 
    </Notes> 
    </contact> 
    <contact id="2"> 
    <Adresses length="1"> 
     <adresses> 
      <city>Paris </city> 
      <postcode>751234 </postcode> 
      <state>France</state> 
      <street>Pignon</street> 
     </adresses> 
    </Adresses> 
    <Emails length="1"> 
     <email type="home"> 
      <home>[email protected]</home> 
     </email> 
    </Emails> 
    <Nom>Nicolas Sarkozy </Nom> 
    <Notes length="1"> 
     <note> 
      <note>Je suis le president de toute la france. Le grand president</note> 
     </note> 
    </Notes> 
    <Phones length="2"> 
     <phone> 
      <home>+33 1234</home> 
     </phone> 
     <phone> 
      <mobile>+33 0612</mobile> 
     </phone> 
    </Phones> 
    </contact> 
    ... 
</Contacts> 
</ContactList> 
+0

FYI करें, बहुत इसी तरह के सवाल [यहां] (http://stackoverflow.com/q/5894320/642706) और [ यहां] (http://stackoverflow.com/q/16135304/642706) –

उत्तर

40

नहीं-Arg निर्माता

मैं इस विशेष एक्सएमएल ढांचे पता नहीं है, लेकिन, आम तौर पर आप एक निर्माता है कि प्रत्येक वर्ग आप deserialized प्राप्त करना चाहते के लिए कोई पैरामीटर/तर्क लेता है की जरूरत है। ऐसे रचनाकारों को "नो-एर्ग", "0-तर्क", या (औपचारिक रूप से) nullary constructor के रूप में जाना जाता है।

अन्यथा, ढांचा कक्षा को तुरंत चालू नहीं कर सकता है।

+1

धन्यवाद @ टिमोरस। मैंने प्रत्येक वर्ग के लिए खाली रचनाकार उत्पन्न किए और अब यह काम कर रहा है। –

+0

धन्यवाद @ टिमोरस! मुझे अपने डेटा ऑब्जेक्ट क्लास में से एक के साथ कोई समस्या थी (मूल वर्ग सटीक होना)। इसे जिस कन्स्ट्रक्टर को निजी पर सेट किया गया था, क्योंकि मैं एक ऑब्जेक्ट को तुरंत चालू करने के लिए उसी वर्ग में एक स्थिर विधि "loadFromXml" का उपयोग कर रहा था। लंबी कहानी छोटी: प्रोग्राम ** को एक्सएमएल स्रोत को उचित तरीके से deserialize करने के लिए ** ** या तो एक सार्वजनिक नो-Arg कन्स्ट्रक्टर या एक सार्वजनिक एनोटेटेड कन्स्ट्रक्टर की आवश्यकता है (प्रश्न पर बोर्के की सीधी टिप्पणी देखें)। – Igor

+0

@ बेसिलबोरक मुझे अपने ऐप पर प्रोग्रार्ड चलाने पर यह त्रुटि मिल रही है। क्या आप [मेरे प्रश्न] (https://stackoverflow.com/q/47407587/1889768) पर एक नज़र डाल सकते हैं। – Abbas

-2

मुझे लगता है कि यह पार्स का एक उदाहरण है यह एक XML पार्स करने के लिए SAX उपयोग करने के लिए बेहतर है:

आप इस प्रकार का वर्ग पार्सर बनाने की जरूरत:

{ public class DataXMLReader extends DefaultHandler { 



    public DataXMLReader() { 


    } 

    public void startElement(String uri, String name, String qName,Attributes atts) 
    { 
       if (name.trim().equalsIgnoreCase("window")) 
       { 
        atts.getValue("type_id") // to get proprietis 
       } 
       else if (name.trim().equalsIgnoreCase("component")) 
       { 

       } 


    } 



    public void endElement(String uri, String name, String qName) 

      throws SAXException { 

     if (name.trim().equalsIgnoreCase("component")) 
     { 
      if(Integer.parseInt(typeid)<=6) 
       idParent.remove(idParent.size()-1); 

     }  
      } 

     @Override 
     public void startDocument() throws SAXException { 
      // TODO Auto-generated method stub 
      super.startDocument(); 

      Log.e("StartDoc","Reading XML"); 
     } 
      public void endDocument() throws SAXException { 
       // TODO Auto-generated method stub 
       myBdd.close(); 
       Log.e("EndtDoc","End XML"); 

        } 

} 
} 

और इस के लिए एक उदाहरण है URL से एक्सएमएल फोन:

String url="http://vxbfdhbf.xml"; 
     try { 

      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 
      URL sourceUrl = new URL(url); 

      HttpURLConnection connection = null; 
      connection = (HttpURLConnection)sourceUrl.openConnection(); 
      connection.setConnectTimeout(60000); 
      connection.setInstanceFollowRedirects(false); 
      connection.connect(); 



      DataXMLReader myXMLHandler = new DataXMLReader(this,"1"); 
      xr.setContentHandler(myXMLHandler); 

      xr.parse(new InputSource(connection.getInputStream())); 
      connection.disconnect(); 






     } catch (Exception e) { 

      Log.e("saxERR",""+e.toString()); 
     } 
+0

मदद @Yaz के लिए धन्यवाद लेकिन समस्या अब हल हो गई है :) मैंने अभी तक SAX की कोशिश नहीं की है लेकिन [सरल XML ढांचे] (http://simple.sourceforge.net) पर एक संक्षिप्त नज़र डालें और मुझे यकीन है कि आप नहीं करेंगे खेद। यह शांत है। –

+0

@ मोहम्मदयाज सैन फ्रांसेस्को ने कहा, [SimpleFramework.org] (http: //simple.sourceforge।नेट /) वास्तव में इस तरह के काम के लिए सरल है, एक्सएमएल को वस्तुओं को क्रमबद्ध करना। कोड की एक या दो पंक्तियां आपके द्वारा दिखाए गए SAX कार्य को कर सकती हैं। –

+0

क्या आप कोड के प्रमुख भाग को इंगित कर सकते हैं और इस मुद्दे को हल करने के लिए आवश्यक समझा सकते हैं? – Phani

12

आप निर्माता से बातें नष्ट करने के लिए नहीं है। तुम बस कुछ इस तरह जोड़ सकते हैं:

public Contact(@Element (name = "id") String id, @Element (name = "name") String name) { 
... 

यह मेरे लिए काम कर रहा था :)

+1

एनोटेशन के बाद, यहां बस एक नोट आपको 'वैरिएबल' नाम के वैरिएबल के नाम से मिलान करने वाला '(name = "")' जोड़ना होगा। – Falkenfighter

+0

यह बेहतर उत्तर IMHO है। मैंने इसे सरल-फ्रेमवर्क दस्तावेज में अनदेखा किया, लेकिन यह ट्यूटोरियल आपको करने के लिए बताता है। http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#immutable कन्स्ट्रक्टर इंजेक्शन देखें। –

+0

इससे मुझे मेरी समस्या को समझने में मदद मिली। लेकिन मुझे इस अपवाद को डिफ़ॉल्ट/डिफॉल्ट कन्स्ट्रक्टर के लिए नहीं मिल रहा है। हालांकि कन्स्ट्रक्टर को सभी तत्व जोड़ना इस मुद्दे को हल करने लगता है। हालांकि अगर मैं इसे पूरा करना चाहता हूं तो मेरे पास एक कोड राशि बहुत बड़ी है। क्या इसके लिए कोई आसान समाधान है? – Abbas

संबंधित मुद्दे