2014-03-26 64 views
0

我有这样从XML获取特定的节点值并添加到ArrayList中

<reg> 
    <user> 
     <Name> abc</Name> 
     <Email> [email protected]</Email> 
     <picture> sdCard/imges.145.jpg </Picture> 
     <Date> 12/12/2012</Date> 
    </user> 
    <user> 
     <Name> abc dfg</Name> 
     <Email> [email protected]</Email> 
     <picture> sdCard/imges.145.jpg </Picture> 
     <Date> 23/12/2013</Date> 
    </user> 
</reg> 

我想获得特定节点的值,并将它们添加到ArrayList中显示的XML中的ListView 我已经试过这个代码但它只给出最后一个记录的值

Users setUser = new Users(); 
final ArrayList<Users> uData = new ArrayList<Users>(); 
Document xmlDocument = builder.parse(file); 

       XPath xPath = XPathFactory.newInstance().newXPath(); 


       String expression = "/reg/user/Name"; 
       System.out.println(expression); 

       NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET); 
       for (int i = 0; i < nodeList.getLength(); i++) { 
        System.out.println(nodeList.item(i).getTextContent()); 
        setUser.setName(nodeList.item(i).getTextContent()); 

       } 
       String expression1 = "/reg/user/Email"; 
       System.out.println(expression1); 

       NodeList nodeList1 = (NodeList) xPath.compile(expression1).evaluate(xmlDocument, XPathConstants.NODESET); 
       for (int i = 0; i < nodeList1.getLength(); i++) { 
        System.out.println(nodeList1.item(i).getTextContent()); 
        setUser.setEmail(nodeList1.item(i).getTextContent()); 
       } 
       String expression2 = "/reg/user/Picture"; 
       System.out.println(expression2); 

       NodeList nodeList2 = (NodeList) xPath.compile(expression2).evaluate(xmlDocument, XPathConstants.NODESET); 
       for (int i = 0; i < nodeList2.getLength(); i++) { 
        System.out.println(nodeList2.item(i).getTextContent()); 
        setUser.setimage(nodeList2.item(i).getTextContent()); 
       } 
       String expression3 = "/reg/user/LastEdited"; 
       System.out.println(expression3); 

       NodeList nodeList3 = (NodeList) xPath.compile(expression3).evaluate(xmlDocument, XPathConstants.NODESET); 
       for (int i = 0; i < nodeList3.getLength(); i++) { 
        System.out.println(nodeList3.item(i).getTextContent()); 
        setUser.setDate(nodeList3.item(i).getTextContent()); 


       } uData.add(setUser); 

我该如何显示所有记录?

+0

您是如何识别特定的节点? – playmaker420

+0

在我的代码中,我正在通过XPATH表达式来识别节点。 。 。 –

+0

您的setUser对象将替换for循环迭代的时间。并在forloop结束时将setUser添加到uData。所以只有最后一个对象将被添加到数组列表。这就是为什么你只得到最后一个记录 – playmaker420

回答

1

你的代码只给最后一个记录赋值的原因已在@ playmaker420中进行了解释。为了解决这个问题,你可以通过每个<name><email><picture><date>分别通过<user>元素,而不是循环尝试循环:

XPath xPath = XPathFactory.newInstance().newXPath(); 
String expression = "/reg/user"; 

NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET); 
for (int i = 0; i < nodeList.getLength(); i++) { 
    Users setUser = new Users(); 
    Element el = (Element) nodeList.item(i); 

    String name = el.getElementsByTagName("Name").item(0).getTextContent(); 
    setUser.setName(name); 

    String email = el.getElementsByTagName("Email").item(0).getTextContent(); 
    setUser.setEmail(email); 

    String picture = el.getElementsByTagName("picture").item(0).getTextContent(); 
    setUser.setimage(picture); 

    String date = el.getElementsByTagName("Date").item(0).getTextContent(); 
    setUser.setDate(date); 

    uData.add(setUser); 
} 
+0

它给了2次最后的记录。 。 –

+0

hmm ..我怀疑你还有另一个'uData.add(setUser);''''''''''循环?这将导致第二次添加到列表中的最后一条记录。 – har07