2011-09-29 41 views
5

我在我的android應用程序中使用SimpleXml 2.6.1。儘管文檔(http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html)表示XML中元素的順序與方式相同他們已經在類文件中定義了,我總是在xml中獲得隨機順序。如果我添加更多的變量,元素的順序會再次改變。簡單的Xml - 元素的順序不保留?

添加@Order表示法可行,但由於該類複雜且具有100個變量,因此我不想添加訂單。這是Android版本的已知錯誤嗎?它在java控制檯程序中工作正常。我打開.class文件反彙編,發現變量聲明的順序與java文件相同,所以我不認爲這是一個類文件問題。

+1

你有沒有發現任何解決方案或爲什麼Android應用程序不保存順序的原因?這可能是XPP android版本導致的嗎? – pfh

+0

[我已經在這裏回答了這個問題](https://stackoverflow.com/a/48677998/3847464) –

回答

1

由於沒有答案,我會盡力爲寶貴的時間來到這裏的任何人。

我找不到任何理由,因爲我沒有時間分析簡單的庫,所以我想出了一個「workaroud」。它實際上更多的是一種建議 - 如果你有一個很大的xml定義並且順序很重要(一個規則不止是一個例外),不要用它來創建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; 
    } 
} 

測試:

​​

不是一個真正的答案,但自己節省一些時間,不要使用簡單(這是一個偉大的圖書館)在Android上...

+0

pfh,不太確定這個答案適合在這裏。手動進行xml序列化/反序列化有很多方法。請參閱我的新建議。 – bschandramohan

+1

這沒有錯,也許這不是一個好辦法,但至少它是有效的。你的答案會更有幫助,但即使我的答案是一個錯誤,讓每個人都看到它,這樣他們就不必走過我走過的路。我沒有太多時間來完成任務,我決定使用最簡單的方法 - 我不想陷入另一個圖書館。 – pfh

0

簡單的Xml不會保留Android上的Order。根據pfh的回答,這裏是我的建議: 如果您希望保存訂單的手冊比手動字符串/模板解析更好,我寧願使用JAXB。 JAXB使用起來比SimpleXml稍微複雜一些,但帶有類似的基於xml序列化和反序列化的批註。

+0

看來JAXB不適用於android – 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; 
    ... 
相關問題