使用Stax解析XML时parseXML方法返回重复记录是什么原因?
问题核心原因
User对象的创建时机错误:当前代码仅在解析到<country>起始标签时才新建User实例,同一个<country>下的多个<user>节点会复用这同一个对象,后续用户的属性会直接覆盖前一个用户的所有字段值。- List集合存储的是对象引用,你多次把同一个
User对象添加到结果列表中,最终列表内所有元素指向的都是最后一次被赋值的实例,所以返回结果全是最后一个用户的记录。
修复方案
调整对象创建逻辑,将User实例化的时机改到解析到<user>起始标签时,同时暂存当前所在国家的名称,每次创建新User时自动赋值国家属性,修改后的代码如下:
public static List<User> parseXML() { List<User> empList = new ArrayList<>(); User emp = null; // 新增变量暂存当前国家名称 String currentCountry = null; XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); try { XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream("C:\\Users\\HP\\Desktop\\untitled1\\src\\main\\xml\\users.xml")); while(xmlEventReader.hasNext()){ XMLEvent xmlEvent = xmlEventReader.nextEvent(); if (xmlEvent.isStartElement()){ StartElement startElement = xmlEvent.asStartElement(); if(startElement.getName().getLocalPart().equals("country")){ // 这里不再创建User,只存当前国家名 Attribute idAttr = startElement.getAttributeByName(new QName("name")); if(idAttr != null){ currentCountry = idAttr.getValue(); } } // 新增user起始标签判断,在这里创建User对象 else if(startElement.getName().getLocalPart().equals("user")){ emp = new User(); emp.setCountry(currentCountry); } // 其余字段赋值逻辑保持不变 else if(startElement.getName().getLocalPart().equals("first_name")){ xmlEvent = xmlEventReader.nextEvent(); emp.setFirst_name(xmlEvent.asCharacters().getData()); }else if(startElement.getName().getLocalPart().equals("last_name")){ xmlEvent = xmlEventReader.nextEvent(); emp.setLast_name(xmlEvent.asCharacters().getData()); }else if(startElement.getName().getLocalPart().equals("address")){ xmlEvent = xmlEventReader.nextEvent(); emp.setAddress(xmlEvent.asCharacters().getData()); }else if(startElement.getName().getLocalPart().equals("city")){ xmlEvent = xmlEventReader.nextEvent(); emp.setCity(xmlEvent.asCharacters().getData()); }else if(startElement.getName().getLocalPart().equals("email")){ xmlEvent = xmlEventReader.nextEvent(); emp.setEmail(xmlEvent.asCharacters().getData()); } } // user结束标签的添加逻辑保持不变 if(xmlEvent.isEndElement()){ EndElement endElement = xmlEvent.asEndElement(); if(endElement.getName().getLocalPart().equals("user")){ empList.add(emp); } } } } catch (FileNotFoundException | XMLStreamException e) { e.printStackTrace(); } return empList; }
内容的提问来源于stack exchange,提问作者Vuk Markanovic
相关产品推荐
相关产品推荐

