You need to enable JavaScript to run this app. Java DOM解析XML:如何封装Row节点数据为Sam对象并填充集合
优惠活动
大模型
产品
解决方案
定价
更多

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即可
  • 字段填充完成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 09:54:06