【问题标题】:Getting specific Node Value from XML and add to ArrayLIst从 XML 获取特定节点值并添加到 ArrayLIst
【发布时间】:2014-05-04 13:13:02
【问题描述】:

我有一个这样的 XML

<reg>
  <user>
       <Name> abc</Name>
       <Email> abc@xyz.com</Email>
       <picture> sdCard/imges.145.jpg </Picture>
       <Date> 12/12/2012</Date>
  </user>
  <user>
       <Name> abc dfg</Name>
       <Email> ertdg@xyz.com</Email>
       <picture> sdCard/imges.145.jpg </Picture>
       <Date> 23/12/2013</Date>
  </user>
</reg>

我想获取特定节点的值并将它们添加到 ArrayList 以在 ListView 中显示 我已经尝试过这段代码,但它只给出了 Last Record 的值

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);

我怎样才能让它显示所有记录?

【问题讨论】:

  • 如何识别具体节点?
  • 在我的代码中,我通过 XPATH 表达式识别节点。 . .
  • 您的 setUser 对象在 for 循环迭代时被替换。您在 forloop 结束时将 setUser 添加到 uData。所以只有最后一个对象会被添加到数组列表中。这就是为什么你只得到最后一条记录
  • 我知道这个原因,问题是我怎样才能在 1 (外循环)中实现这一点,所以我可以在所有 4 个节点中获取值并将其添加到 ArrayList,我这样做的方式是Xpath 我必须为每个点头运行一个单独的循环以获取其值并将其放入 NodeList...
  • 哦。您可以保留名称、图像、日期、电子邮件的临时列表,而不是添加到对象中。现在您将所有元素放在单独的数组中。由于所有列表都没有相同的元素,您可以开始另一个循环。 For(int i=0;i;i++){ uData= new UData(); uData.setImage=name.get(i).getname(); uData.setDate=date(i).getDate;等等等等。现在对象已准备好并添加到 uData.add(uData); }。但这不是最好的解决方案,这会导致严重的性能问题。如果可以的话,试试 simplexml,它很容易处理

标签: android xpath arraylist xml-parsing


【解决方案1】:

您的代码仅提供 Last Record 值的原因已由 @playmaker420 在评论中解释。要修复它,您可以尝试循环遍历 &lt;user&gt; 元素,而不是分别循环遍历每个 &lt;name&gt;&lt;email&gt;&lt;picture&gt;&lt;date&gt;

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);
}

【讨论】:

  • 它给出了 2 次的最后记录。 .
  • hmm.. 我怀疑您在for 循环之外还有另一个uData.add(setUser);?这将导致最后一条记录第二次添加到列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多