2011-09-29 59 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; 
    ... 
相关问题