Java DOM解析XML:如何封装Row节点数据为Sam对象并填充集合
Sam Table节点定位后的对象组装实现
核心操作逻辑
- 从已定位的
name="Sam"的Table元素中,提取所有直属下属的Row节点集合,每一个Row节点对应生成一个独立的Sam类实例 - 逐行遍历每个Row节点,先校验节点为有效元素节点,再读取Row下属的所有
Col子节点 - 以Col节点的
name属性为匹配依据,提取对应字段值完成对象填充:- Col的
name值为ID.1时,取其文本内容赋值给Sam实例的id字段 - Col的
name值为TYPE.1时,取其文本内容赋值给Sam实例的type字段 - 若存在
name值为DATA.1的Col节点,取其文本内容赋值给Sam实例的data字段 - 注:当前示例XML中未出现DATA对应的Col节点,无匹配内容时对应字段默认保持null即可
- Col的
- 字段填充完成的Sam实例统一存入
samList集合,完成批量对象组装
补全后的完整可运行代码
首先修正原有代码的笔误:原代码中new new ArrayList<>()多写了一个new关键字,会直接导致编译报错。同时优化了空指针防护逻辑,补全后的代码如下:
List<Sam> samList = new ArrayList<>(); NodeList nameNodeList = xml.getDocumentElement().getElementsByTagName("Table"); if (nameNodeList != null) { for (int i = 0; i < nameNodeList.getLength(); i++) { Node node = nameNodeList.item(i); // 提前校验节点类型,避免非元素节点读取属性时抛空指针 if (node.getNodeType() != Node.ELEMENT_NODE) { continue; } Node nameAttr = node.getAttributes().getNamedItem("name"); // 跳过没有name属性、name值不是Sam的Table节点 if (nameAttr == null || !"Sam".equals(nameAttr.getNodeValue())) { continue; } Element samTableElement = (Element) node; // 提取当前Sam Table下的所有Row节点 NodeList rowNodeList = samTableElement.getElementsByTagName("Row"); for (int j = 0; j < rowNodeList.getLength(); j++) { Node rowNode = rowNodeList.item(j); if (rowNode.getNodeType() != Node.ELEMENT_NODE) { continue; } Element rowElement = (Element) rowNode; Sam sam = new Sam(); // 提取当前Row下的所有Col节点 NodeList colNodeList = rowElement.getElementsByTagName("Col"); for (int k = 0; k < colNodeList.getLength(); k++) { Node colNode = colNodeList.item(k); if (colNode.getNodeType() != Node.ELEMENT_NODE) { continue; } Element colElement = (Element) colNode; String colName = colElement.getAttribute("name"); // 读取Col文本并去除排版带来的多余空白 String colValue = colElement.getTextContent().trim(); // 按Col名匹配对应Sam字段赋值 switch (colName) { case "ID.1": sam.id = colValue; break; case "TYPE.1": sam.type = colValue; break; case "DATA.1": sam.data = colValue; break; } } samList.add(sam); } } }
实现细节说明
- 所有属性读取操作都增加了空值校验,避免XML中缺失节点/属性时抛出空指针异常
- Col节点的匹配范围严格限定在当前Row下属,不会跨行取到其他行的Col值,避免出现字段串值问题
- 读取Col文本时统一做了trim处理,消除XML格式化排版带来的多余换行、空格字符
- 字符串比较时把固定常量放在equals方法的调用左侧,避免属性值为null时触发空指针
- 若后续需要读取Row节点自身的
id属性值,可直接通过rowElement.getAttribute("id")获取
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

