Java 如何将NodeValue设置为Bean并添加到Bean的ArrayList

Java 如何将NodeValue设置为Bean并添加到Bean的ArrayList,java,xml,parsing,arraylist,javabeans,Java,Xml,Parsing,Arraylist,Javabeans,我正在基于node的元素解析rss提要,并将其设置为bean对象。稍后,我需要将其存储在bean的数组列表中。看起来我在设置bean值并将其添加到bean的ArrayList时做错了。 这是我的密码: public static void main(String arg[]) { ArrayList<RssBean> list = new ArrayList<RssBean>(); RssBean bean = new RssBean(null, null, n

我正在基于node的元素解析rss提要,并将其设置为bean对象。稍后,我需要将其存储在bean的数组列表中。看起来我在设置bean值并将其添加到bean的ArrayList时做错了。 这是我的密码:

public static void main(String arg[]) {
  ArrayList<RssBean> list = new ArrayList<RssBean>(); 
  RssBean bean = new RssBean(null, null, null); 

 String xmlRecords =
  "<rss>" +"<channel>"+
  " <item>" +
  "   <title>John</title>" + 
  "   <description> Desc1 </description>"+
  " </item>" +
  " <item>" +
  "   <title>Sara</title>" + 
  "   <description> Desc2 </description>"+
  " </item>" + "</channel>"+
  "</rss>";

try {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xmlRecords));

    Document doc = db.parse(is);
    NodeList nodes = doc.getElementsByTagName("item");

    // iterate the  items
    for (int i = 0; i < nodes.getLength(); i++) {
       Element element = (Element) nodes.item(i);

       NodeList title = element.getElementsByTagName("title");
       Element line = (Element) title.item(0);  
       bean.setTitle(getCharacterDataFromElement(line));

       NodeList description = element.getElementsByTagName("description");
       line = (Element) description.item(0); 
       bean.setDescription(getCharacterDataFromElement(line));

       list.add(bean);           
    } 

    //print list values
    ListIterator<RssBean> iter = list.listIterator() ;
    while(iter.hasNext()) 
    {
        RssBean result = (RssBean)iter.next();
        System.out.println(result);
    }

}
catch (Exception e) {
    e.printStackTrace();
} 
}

public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
   CharacterData cd = (CharacterData) child;
   return cd.getData();
}
return "?";
}
publicstaticvoidmain(字符串arg[]){
ArrayList=新建ArrayList();
rssbeanbean=新的RssBean(null,null,null);
字符串XML记录=
"" +""+
" " +
“约翰”+
“描述1”+
" " +
" " +
“莎拉”+
“描述2”+
" " + ""+
"";
试一试{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
InputSource is=新的InputSource();
is.setCharacterStream(新的StringReader(xmlRecords));
文档doc=db.parse(is);
NodeList节点=doc.getElementsByTagName(“项”);
//迭代项目
对于(int i=0;i

当我打印列表值时,我得到-列表值====>[RssBean@450cceb3, RssBean@450cceb3]我需要将实际值存储在bean的数组列表中。ArrayList显示对象,而不是存储的实际值。请更正我的代码好吗?

ArrayList不复制存储值,它只存储对添加对象的引用。因此,在代码中,您将一个bean实例放了三次

如果问题仅限于复制打印项中的值,那么应该在每次循环迭代中更改代码以创建新的bean实例

for (int i = 0; i < nodes.getLength(); i++) {
  RssBean bean = new RssBean(null, null, null);
  Element element = (Element) nodes.item(i);
  // ...
  list.add(bean)
}

您正在列表中添加对象,这就是它打印对象的原因“RssBean@450cceb3“

这些值存储在对象中,您可以通过在RssBean类中重写toString()方法来打印它

更新您的RssBean,如:

public class RssBean {

    String title;
    String description;
    String value;

    public RssBean(String title, String description, String value) {
        this.title = title;
        this.description = description;
        this.value = value;
    }

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();

        result.append("Title: " + title);
        result.append("Description: " + description);
        result.append("Value: " + value);


        return result.toString();
    }
}

如何打印列表?我以System.out.println(“list=“+list”)的形式打印;我得到了上面的值。我想这是打印出来的。如何确保arrayList中存储了哪些值?我尝试添加System.out.println(Arrays.deepToString(list.get(I));在list.add之后添加(Bean)。但是get compiler error在我看来,
RssBean
toString
方法正在返回它的默认值,这可能不是您想要的。由于您只创建了一个bean,
列表
将包含相同的bean实例…我可以使用-System.out.println(“bean值=====>”+bean.getTitle()+“&&&“+bean.getDesc()”)打印bean值;和值正确打印Bean值===>John&&Desc1和Bean值==>Sara&&Desc2在Bean类中应该重写toString()方法,然后System.out.println(“List:+List”)将返回“[Sara&&Desc2,Sara&&Desc2]”。所以,bean值复制,这就是为什么每次循环迭代都应该创建新的bean实例。我修正了它,得到了正确的值。非常感谢。
public class RssBean {

    String title;
    String description;
    String value;

    public RssBean(String title, String description, String value) {
        this.title = title;
        this.description = description;
        this.value = value;
    }

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();

        result.append("Title: " + title);
        result.append("Description: " + description);
        result.append("Value: " + value);


        return result.toString();
    }
}