2012-07-03 56 views
5

我用简单的XML(简单的XML-2.6.2.jar)来分析,如XML文件:简单的XML解析XML列出

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

根元素包含的子元素。 我想它是ArrayList,怎么做?

回答

0

列表是一个接口,ArrayList的是其实现的一个,如:

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

所以,如果你有一个清单,你基本上你想要什么。

+0

对不起,这不是匹配的意思。我想要的结果是列表或ArrayList ,而不是Orderlist.class。 – YETI

+0

因为你的根对象是OrderList,所以你不能。 – Tomer

12

这里有一个可能的解决方案,希望它可以帮助你:

注释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 
} 

Example类,包含列表:

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

    // ... 
} 

而这里有一些用于阅读的代码荷兰国际集团代码:

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

它应该被标记为答案@YETI – FarOoOosa

+0

简而言之:@ElementList(inline = true) – Kaito

+0

应该在Example类的@Root变换中使用“elementList”而不是“orderList?”。 – lustig

-1

如果我正确地解释你的问题,你想命令的列表。我没有测试此为您的设置,但是这对我的作品进行了类似的XML结构(假设你有一个自定义类名为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 ""; 
    } 
}