You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:57:04