2011-09-29 16 views
5

Estoy usando SimpleXml 2.6.1 en mi aplicación de Android. Aunque la documentación (http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html) dice que el orden de los elementos en el xml es el mismo que el del camino han definido en el archivo de clase, siempre obtengo el orden de ser aleatorio en el xml. Si agrego algunas variables más, el orden de los elementos cambia nuevamente.Xml simple - orden de los elementos no conservados?

Agregar la notación @Order funciona, pero como la clase es compleja con cientos de variables, no quiero agregar orden. ¿Es este un error conocido para las versiones de Android? Funciona bien en los programas de consola de Java.

p.s: Abrí el archivo .class desensamblado y encontré las variables declaradas en el mismo orden que el archivo java, así que no creo que sea un problema de archivo de clase.

+1

¿Has encontrado alguna solución o un motivo por el cual la aplicación de Android no conserva el pedido? ¿Es posible que la versión de Android XPP cause esto? – pfh

+0

[He respondido esa pregunta aquí] (https://stackoverflow.com/a/48677998/3847464) –

Respuesta

1

Como no hay respuesta, intentaré ahorrar un tiempo precioso a cualquiera que llegue aquí.

No encontré ninguna causa, y como no tengo tiempo para analizar las bibliotecas simples, se me ocurrió una "columna de trabajo". En realidad, es más un consejo: no lo use para (calcular referencias) crear xml si tiene una definición xml grande y el orden es importante (una regla más que una excepción). El orden se usa principalmente para calcular referencias de todos modos así que solo ahórrese un poco de tiempo y hágalo manualmente.

La plantilla:

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

La clase:

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; 
    } 
} 

La prueba:

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); 
    } 
} 

No realmente una respuesta, pero ahorrar un poco de tiempo y no utilice Simple (que es una gran biblioteca) en Android ...

+0

pfh, no estoy muy seguro de que esta respuesta encaje aquí. Hay muchas formas de hacer la serialización/deserialización xml manualmente. Vea mi nueva respuesta para mi recomendación. – bschandramohan

+1

No está mal, y tal vez no sea una buena manera de hacerlo, pero al menos funciona. Tu respuesta será más útil, pero incluso si mi respuesta es un error, que todos lo vean para que no tengan que caminar por el camino que recorrí. No tuve mucho tiempo para completar la tarea, y decidí usar el método más simple: no quería quedar atrapado en otra biblioteca. – pfh

0

Simple Xml no conserva el orden en Android. En función de la respuesta de pfh, esta es mi recomendación: Preferiría usar JAXB en el caso en el que desee que se preserve el pedido que el análisis manual de cadenas/plantillas. JAXB es un poco complejo de usar que SimpleXml, pero viene con un conjunto similar de anotaciones basadas en serialización xml y deserialización.

+0

Parece que JAXB no está disponible para 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; 
    ... 
Cuestiones relacionadas