解析含重复国家节点的新冠疫情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
相关产品推荐
相关产品推荐

