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

解析含重复国家节点的新冠疫情XML文件,统计各国累计病例

按国家分组统计新冠累计病例的DOM解析实现

看起来你已经搭建好了Java DOM解析XML的基础框架,接下来咱们把按countriesAndTerritories分组累加cases的功能补上就行。我帮你一步步完善代码:

1. 先确保Corona实体类正确封装字段

首先你需要一个Corona类来存储每条record的关键信息,至少包含国家名称和病例数:

public class Corona {
    private String countriesAndTerritories;
    private int cases;

    // 构造方法
    public Corona(String countriesAndTerritories, int cases) {
        this.countriesAndTerritories = countriesAndTerritories;
        this.cases = cases;
    }

    // Getter方法
    public String getCountriesAndTerritories() {
        return countriesAndTerritories;
    }

    public int getCases() {
        return cases;
    }
}

2. 完善getCorona方法,提取所需字段

你的现有代码里调用了getCorona方法但没实现,这个方法负责从单个<record>节点中提取countriesAndTerritories和cases的值:

private static Corona getCorona(Node node) {
    Corona corona = null;
    if (node.getNodeType() == Node.ELEMENT_NODE) {
        Element element = (Element) node;
        // 提取countriesAndTerritories字段
        String country = element.getElementsByTagName("countriesAndTerritories").item(0).getTextContent();
        // 提取cases字段并转为整数(注意处理可能的空值或非数字情况)
        int cases = Integer.parseInt(element.getElementsByTagName("cases").item(0).getTextContent());
        corona = new Corona(country, cases);
    }
    return corona;
}

3. 核心:按国家分组累加病例数

在遍历所有<record>节点后,我们用一个Map来存储每个国家的累计病例——key是国家名称,value是累计病例数。修改你的主逻辑代码:

public static void main(String[] args) {
    String filePath = "data.xml";
    File xmlFile = new File(filePath);
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder;
    try {
        dBuilder = dbFactory.newDocumentBuilder();
        org.w3c.dom.Document doc = dBuilder.parse(xmlFile);
        doc.getDocumentElement().normalize();
        System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
        
        NodeList nodeList = doc.getElementsByTagName("record");
        List<Corona> coronaList = new ArrayList<>();
        
        // 遍历所有record节点,转为Corona对象存入列表
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node currentNode = nodeList.item(i);
            Corona corona = getCorona(currentNode);
            if (corona != null) { // 过滤无效节点
                coronaList.add(corona);
            }
        }
        
        // 按国家分组统计累计病例
        Map<String, Integer> countryTotalCases = new HashMap<>();
        for (Corona corona : coronaList) {
            String country = corona.getCountriesAndTerritories();
            int cases = corona.getCases();
            // 累加:如果Map里已有该国家,就加上当前病例;没有则初始化为当前病例
            countryTotalCases.put(country, countryTotalCases.getOrDefault(country, 0) + cases);
        }
        
        // 输出统计结果
        System.out.println("\n国家累计病例统计:");
        for (Map.Entry<String, Integer> entry : countryTotalCases.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue() + " 例");
        }
        
    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
}

几点注意事项

  • 异常处理:上面的代码里把可能的解析异常(比如cases字段不是数字)统一捕获了,你可以根据需求细化,比如在getCorona方法里加入try-catch处理Integer.parseInt的异常,避免单个无效节点导致整个程序崩溃。
  • 空值处理:如果某些<record>节点缺少countriesAndTerritories或cases字段,getCorona方法会返回null,我们在遍历的时候过滤掉这些无效节点,避免影响统计结果。
  • 性能优化:如果XML文件非常大,DOM解析会把整个文件加载到内存,这时候可以考虑用SAX或StAX解析,不过对于常规大小的疫情数据,DOM解析已经足够简单易用。

内容的提问来源于stack exchange,提问作者Muhammad ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:42:30