7

私は単純な XML (simple-xml-2.6.2.jar) を使用して、次のような 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 にしたいのですが、どうすればいいですか?

4

3 に答える 3

15

考えられる解決策は次のとおりです。

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
于 2012-08-29T18:07:49.467 に答える
0

私があなたの質問を正しく解釈したなら、あなたは注文のリストが欲しい. 私はあなたのセットアップでこれをテストしていませんが、これは同様の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 "";
    }
}
于 2015-03-19T13:37:21.903 に答える
0

List はインターフェイスであり、ArrayList はその実装の 1 つです。

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

したがって、 List がある場合、基本的に必要なものがあります。

于 2012-07-03T10:22:51.103 に答える