2014-03-26 65 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