我在我的Android应用程序中使用SimpleXml 2.6.1。尽管文档(http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html)表示xml中元素的顺序与方式相同他们已经在类文件中定义了,我总是让命令在xml中是随机的。如果我添加更多变量,则元素的顺序会再次发生变化。
添加@Order表示法有效,但由于该类很复杂,有100个变量,我不想添加顺序。这是Android版本的已知错误吗?它在java控制台程序中运行良好。
p.s:我打开了反汇编的.class文件,发现变量以与java文件相同的顺序声明,所以我认为这不是类文件问题。
答案 0 :(得分:3)
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;
...
答案 1 :(得分: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;
}
}
测试:
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);
}
}
不是一个真正的答案,但是节省一些时间,不要在Android上使用Simple(这是一个很棒的库)......
答案 2 :(得分:1)
Simple Xml不会在Android上保留Order。根据pfh的回答,这是我的建议: 在您希望保留订单而不是手动字符串/模板解析的情况下,我更愿意使用JAXB。 JAXB使用起来比SimpleXml稍微复杂,但是附带了类似的基于xml序列化和反序列化的注释集。