2011-09-29 7 views
5

मैं अपने एंड्रॉइड ऐप में SimpleXml 2.6.1 का उपयोग कर रहा हूं। प्रलेखन (http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html) कहता है कि xml में तत्वों का क्रम वैसे ही है उन्होंने कक्षा फ़ाइल में परिभाषित किया है, मुझे हमेशा एक्सएमएल में यादृच्छिक होने का आदेश मिल रहा है। यदि मैं कुछ और चर जोड़ता हूं, तो तत्वों का क्रम फिर से बदल जाता है।सरल एक्सएमएल - तत्वों का क्रम संरक्षित नहीं है?

@ ऑर्डर नोटेशन कार्य जोड़ना, लेकिन चूंकि वर्ग 100 के चर के साथ जटिल है, इसलिए मैं ऑर्डर जोड़ना नहीं चाहता हूं। क्या यह एंड्रॉइड संस्करणों के लिए एक ज्ञात बग है? यह जावा कंसोल कार्यक्रमों में ठीक काम करता है।

p.s: मैंने .class फ़ाइल को अलग किया और जावा फ़ाइल के समान क्रम में घोषित चर पाया, इसलिए मुझे नहीं लगता कि यह एक क्लास फ़ाइल समस्या है।

+1

क्या आपको कोई समाधान या कारण मिला है कि एंड्रॉइड ऐप ऑर्डर को सुरक्षित नहीं रखता है? क्या यह संभव है कि XPP एंड्रॉइड संस्करण इसका कारण बनता है? – pfh

+0

[मैंने यहां उस प्रश्न का उत्तर दिया है] (https://stackoverflow.com/a/48677998/3847464) –

उत्तर

1

चूंकि कोई जवाब नहीं है, इसलिए मैं यहां आने वाले किसी भी व्यक्ति को अनमोल समय बचाने की कोशिश करूंगा।

मुझे कोई कारण नहीं मिला, और चूंकि मेरे पास सरल पुस्तकालयों का विश्लेषण करने का समय नहीं है, इसलिए मैं "वर्कअराउड" के साथ आया हूं। यह वास्तव में एक सलाह है, वास्तव में - इसका उपयोग xml बनाने के लिए नहीं करें यदि आपके पास बड़ी एक्सएमएल परिभाषा है और ऑर्डर मायने रखता है (एक अपवाद से अधिक नियम)। आदेश का उपयोग ज्यादातर मार्शलिंग के लिए किया जाता है, इसलिए बस कुछ समय बचाएं और इसे मैन्युअल रूप से करें।

टेम्पलेट:

<document> 
    <name>$NAME$</name> 
    <isTrue>$IS_TRUE$</isTrue> 
</document> 

वर्ग:

import org.apache.commons.io.IOUtils; 

import java.io.IOException; 
import java.io.InputStream; 

/** 
* User: ksaric 
*/ 

public class SimpleXml { 

    public static final String NAME = "$NAME$"; 
    public static final String IS_TRUE = "$IS_TRUE$"; 

    private String name; 
    private Boolean isTrue; 

    public SimpleXml() { 
    } 

    public Boolean getTrue() { 
     return isTrue; 
    } 

    public void setTrue(Boolean aTrue) { 
     isTrue = aTrue; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     String template = null; 

     try { 
      template = getTemplate(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     /* GUAVA - checkNotNull() */ 
     if (null == template) return null; 

     template = template.replace(NAME, getName()); 

     /* OR CONVERT IN THE GETTER METHOD */ 
     template = template.replace(IS_TRUE, getTrue().toString()); 

     return template; 
    } 

    /* SINGLETON? Performance(IO) loss... */ 
    public String getTemplate() throws IOException { 
     InputStream templateStream = getClass().getResourceAsStream("/template.xml"); 

     /* APACHE IO COMMONS */ 

     /* 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>1.3.2</version> 
     </dependency> 
     */ 

     final String stringTemplate = IOUtils.toString(templateStream); 

     return stringTemplate; 
    } 
} 

परीक्षण:

import org.junit.Test; 

import static junit.framework.Assert.*; 

/** 
* User: ksaric 
*/ 

public class SimpleXmlTest { 

    @Test 
    public void test() throws Exception { 
     //Before 

     /* Use standard instantiation, factory method recommended for immutability */ 
     SimpleXml simpleXml = new SimpleXml(); 
     simpleXml.setName("This is a name"); 
     simpleXml.setTrue(false); 

     //When 
     String result = simpleXml.toString(); 

     //Then 
     assertNotNull(result); 
     System.out.println(result); 
    } 
} 

नहीं वास्तव में एक जवाब है, लेकिन अपने आप को कुछ समय की बचत करने का उपयोग नहीं करते एंड्रॉइड पर सरल (जो एक महान पुस्तकालय है) ...

+0

पीएफएच, वास्तव में यह सुनिश्चित नहीं है कि यह उत्तर यहां फिट बैठता है। Xml serialization/deserialization मैन्युअल रूप से करने के कई तरीके हैं। मेरी सिफारिश के लिए मेरा नया जवाब देखें। – bschandramohan

+1

यह गलत नहीं है, और शायद यह करने का कोई अच्छा तरीका नहीं है, लेकिन कम से कम यह काम करता है। आपका उत्तर अधिक उपयोगी होगा, लेकिन अगर मेरा जवाब गलती है, तो सभी को इसे देखने दें ताकि उन्हें चलने वाले रास्ते पर चलने की आवश्यकता न हो। मेरे पास कार्य पूरा करने के लिए बहुत समय नहीं था, और मैंने सबसे सरल विधि का उपयोग करने का फैसला किया - मैं किसी अन्य पुस्तकालय में फंसना नहीं चाहता था। – pfh

0

सरल एक्सएमएल एंड्रॉइड पर ऑर्डर को सुरक्षित नहीं करता है। पीएफएच के उत्तर के आधार पर, मेरी सिफारिश है: मैं उस मामले में जेएक्सबी का उपयोग करना पसंद करूंगा जहां आप मैन्युअल स्ट्रिंग/टेम्पलेट पार्सिंग से ऑर्डर संरक्षित करना चाहते हैं। जेएक्सबी सरलएक्सएमएल की तुलना में उपयोग करने के लिए थोड़ा जटिल है, लेकिन एक्सएमएल क्रमबद्धता और deserialization आधारित एनोटेशन के समान सेट के साथ आता है।

+0

ऐसा लगता है कि जेएक्सबी एंड्रॉइड के लिए उपलब्ध नहीं है – naveejr

1
import org.simpleframework.xml.Element;  
import org.simpleframework.xml.Order; 

    @Order(elements = {"name", "isTrue"}) 
    public class SimpleXml { 

     public static final String NAME = "$NAME$"; 
     public static final String IS_TRUE = "$IS_TRUE$"; 

     @Element 
     private String name; 

     @Element 
     private Boolean isTrue; 
    ...