Simple XML analiza XML a la lista
Utilizo XML simple (simple-xml-2.6.2.jar) para analizar el archivo del xml como:
<?xml version="1.0" encoding="UTF-8" ?> <orderList> <order id="1"> <name>NAME1</name> </order> <order id="2"> <name>NAME2</name> </order> </orderList>
El elemento raíz contiene subElementos. Quiero que sea ArrayList, ¿Cómo hacerlo?
- Android, simple-xml, cómo declarar una lista de elementos?
- Eliminar el atributo class =
- Android Retrofit 2 Simple XML Converter
- ¿Cómo analizar XML y almacenarlo en un mapa con SimpleXML?
- Retrofit y SimpleXML para el elemento raíz desconocido?
- Error de deserialización de SimpleXML en Android
- SimpleXML con Retrofit 1.9, 'Atributo' versión 'no tiene una coincidencia en la clase'
- Excepción ValueRequired mientras utiliza Simple-XML-Framework
- Saco de jabón de marco simple y cuerpo
- Analizar elementos de la lista de archivos XML con XML simple en Android
- Problemas al integrar el convertidor Simple XML en retrofit para Android
- ¿Cómo usar Retrofit y SimpleXML juntos para descargar y analizar un archivo XML de un sitio?
- Usando SimpleXML, cómo ignorar elementos xml que no tengo en mi clase de objeto al deserializar
He aquí una posible solución, espero que te ayude:
Anotaciones de Clase de Order
:
@Root(name="order") public class Order { @Attribute(name="id", required=true) private int id; @Element(name="name", required=true) private String name; public Order(int id, String name) { this.id = id; this.name = name; } public Order() { } // Getter / Setter }
Clase de Example
, que contiene la lista:
@Root(name="elementList") public class Example { @ElementList(required=true, inline=true) private List<Order> list = new ArrayList<>(); // ... }
Y aquí hay un código para leer su código:
Serializer ser = new Persister(); Example example = ser.read(Example.class, file); // file = your xml file // 'list' now contains all your Orders
List es una interfaz, ArrayList es una de sus implementaciones, como:
List<Order> l = new ArrayList<Order>()
Así que si tienes una lista, básicamente tienes lo que quieres.
Si he interpretado correctamente su pregunta, desea una lista de órdenes. No he probado esto para su configuración, pero esto funciona para mí para una estructura xml similar (asume que tiene una clase personalizada llamada Orden):
List<Order> orders = new ArrayList<Order>(); XMLDOMParser parser = new XMLDOMParser(); AssetManager manager = context.getAssets(); InputStream stream; try { stream = manager.open("test.xml"); //need full path to your file here - mine is stored in assets folder Document doc = parser.getDocument(stream); }catch(IOException ex){ System.out.printf("Error reading xml file %s\n", ex.getMessage()); } NodeList nodeList = doc.getElementsByTagName("order"); for (int i = 0; i < nodeList.getLength(); i++) { Element e = (Element) nodeList.item(i); //each order item Node order=nodeList.item(i); subList = order.getFirstChild(); //get the name child node orders.add(order); } //XMLDOMParser Class public class XMLDOMParser { //Returns the entire XML document public Document getDocument(InputStream inputStream) { Document document = null; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = factory.newDocumentBuilder(); InputSource inputSource = new InputSource(inputStream); document = db.parse(inputSource); } catch (ParserConfigurationException e) { Log.e("Error: ", e.getMessage()); return null; } catch (SAXException e) { Log.e("Error: ", e.getMessage()); return null; } catch (IOException e) { Log.e("Error: ", e.getMessage()); return null; } return document; } /* * I take a XML element and the tag name, look for the tag and get * the text content ie for <employee><name>Kumar</name></employee> * XML snippet if the Element points to employee node and tagName * is name I will return Kumar. Calls the private method * getTextNodeValue(node) which returns the text value, say in our * example Kumar. */ public String getValue(Element item, String name) { NodeList nodes = item.getElementsByTagName(name); return this.getTextNodeValue(nodes.item(0)); } private final String getTextNodeValue(Node node) { Node child; if (node != null) { if (node.hasChildNodes()) { child = node.getFirstChild(); while(child != null) { if (child.getNodeType() == Node.TEXT_NODE) { return child.getNodeValue(); } child = child.getNextSibling(); } } } return ""; } }