2012-07-03 11 views
5

Io uso di XML semplice (semplice-xml-2.6.2.jar) per analizzare il file xml come:semplice parse XML XML nella Lista

<?xml version="1.0" encoding="UTF-8" ?> 
<orderList> 
    <order id="1"> 
     <name>NAME1</name> 
    </order> 
    <order id="2"> 
     <name>NAME2</name> 
    </order> 
</orderList> 

L'elemento radice contiene sottoelementi. Voglio essere ArrayList, come si fa?

risposta

0

List è un'interfaccia, ArrayList è uno della sua attuazione, come:

List<Order> l = new ArrayList<Order>() 

Quindi, se si dispone di un elenco, avete fondamentalmente ciò che si desidera.

+0

Ci dispiace ma è non corrisponde al significato. Voglio risultato è Elenco o ArrayList , non un Orderlist.class. – YETI

+0

Non è possibile poiché l'oggetto radice è OrderList. – Tomer

12

Ecco una possibile soluzione, spero che aiuta a:

Annotazioni di Order classe:

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

Example di classe, che contiene l'elenco:

@Root(name="elementList") 
public class Example 
{ 
    @ElementList(required=true, inline=true) 
    private List<Order> list = new ArrayList<>(); 

    // ... 
} 

E ecco un codice per leggere ing codice:

Serializer ser = new Persister(); 
Example example = ser.read(Example.class, file); // file = your xml file 
// 'list' now contains all your Orders 
+1

dovrebbe essere contrassegnato come risposta @YETI – FarOoOosa

+0

in breve: @ElementList (inline = true) – Kaito

+0

Dovrebbe "elementoLista" nell'outotazione @Root nella classe Example invece di "orderList?" – lustig

-1

Se ho interpretato correttamente la domanda, si desidera un elenco degli ordini. Non ho provato questo per la configurazione, ma questo funziona per una struttura XML simile (presuppone una classe personalizzata denominata Order):

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 i.e 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 ""; 
    } 
}