7

I use Simple XML (simple-xml-2.6.2.jar) to parse xml file like:

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

The root Element contains subElements. I wanna it be ArrayList, How to do it?

3 Answers 3

15

Here's a possible solution, hope it helps you:

Annotations of Order class:

@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 class, containing the list:

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

    // ...
}

And here's some code for reading your code:

Serializer ser = new Persister();
Example example = ser.read(Example.class, file); // file = your xml file
// 'list' now contains all your Orders
Sign up to request clarification or add additional context in comments.

2 Comments

in short: @ElementList(inline=true)
Should "elementList" in the @Root anotation on the Example class instead by "orderList?"
0

List is an interface, ArrayList is one of its implementation, like:

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

So if you have a List , you basically have what you want.

2 Comments

Sorry, it's not match the meaning. I want result is List<Order> or ArrayList<Order>, not a Orderlist.class.
You can't since your root object is OrderList.
0

If I've interpreted your question correctly, you want a list of orders. I've not tested this for your setup but this works for me for a similar xml structure (assumes you have a custom class called 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 "";
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.