Простой Xml - порядок элементов не сохранился?
Я использую SimpleXml 2.6.1 в моем приложении для Android. Даже если в документации (http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html) говорится, что порядок элементов в xml такой же, как и в они определены в файле класса, я всегда получаю порядок быть случайным в XML. Если я добавлю еще несколько переменных, порядок элементов снова изменится.
Добавление нотации @Order работает, но поскольку класс сложен с сотнями переменных, я не хочу добавлять порядок. Это известная ошибка для версий Android? Это прекрасно работает в консольных программах Java.
PS: я открыл файл.class в разобранном виде и нашел переменные, объявленные в том же порядке, что и файл Java, поэтому я не думаю, что это проблема файла класса.
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;
...
Поскольку ответа нет, я постараюсь сэкономить драгоценное время для всех, кто попадет сюда.
Я не нашел причин, и так как у меня нет времени для анализа библиотек Simple, я придумал "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);
}
}
Не совсем ответ, но сэкономьте немного времени и не используйте Simple (отличная библиотека) на Android...
Простой Xml не сохраняет порядок на Android. Исходя из ответа pfh, вот моя рекомендация: я бы предпочел использовать JAXB в том случае, если вы хотите сохранить порядок, чем ручной анализ строки / шаблона. JAXB немного сложнее в использовании, чем Simple Xml, но поставляется с аналогичным набором аннотаций на основе сериализации и десериализации xml.