Luo Hao

Java的DOM4J解析XML文件

rehoni / 2020-06-29


dom4j获取iterator

/**
 * @author luohao
 * @create 2020/6/18 17:21
 */
@Slf4j
public class Dom4jUtils {
    public static Iterator<Element> getElementIterator(String path) {
        SAXReader reader = new SAXReader();
        Document document = null;
        try {
            document = reader.read(new File(path));
        } catch (DocumentException e) {
            log.error("Dom4j:读取xml文件时异常{}", e.getMessage(), e);
        }
        Optional<Document> docElementOpt = Optional.ofNullable(document);
        return docElementOpt.map(Document::getRootElement).map(Element::elementIterator).orElseGet(() -> new Iterator<Element>() {
            @Override
            public boolean hasNext() {
                return false;
            }

            @Override
            public Element next() {
                return null;
            }
        });
    }
}

获取xml的node节点和属性

/**
     * @param path  文件路径
     * @param list  用于基本信息表的数据list
     * @param list1 用于详细信息表的数据list
     */
    private static void extractXml(String path, List<Map<String, Object>> list, List<Map<String, Object>> list1) {
        Iterator<Element> it = Dom4jUtils.getElementIterator(path);
        // 遍历迭代器,获取根节点中的信息(书籍)
        while (it.hasNext()) {
            Map<String, Object> map = new HashMap<>();
            // 存放一个主键
            String stationNameVal = "";
            String checkTimeVal = "";
            Element node = it.next();
            // 塞入巡检报告基本信息表(IFR_CHECKREPORT_BASEINFO)
            if ("System".equals(node.getName())) {
                // 迭代一次
                Iterator<Element> itt = node.elementIterator();
                while (itt.hasNext()) {
                    Element nodeChild = itt.next();
                    // 转换substation的key
                    if ("Substation".equals(nodeChild.getName())) {
                        map.put("StationName", nodeChild.getStringValue());
                        stationNameVal = nodeChild.getStringValue();
                    } else if ("CheckTime".equals(nodeChild.getName())) {
                        map.put("CheckTime", nodeChild.getStringValue());
                        checkTimeVal = nodeChild.getStringValue();
                    } else {
                        map.put(nodeChild.getName(), nodeChild.getStringValue());
                    }
                }
            }
            // 塞入巡检报告概要结果表(IFR_CHECKREPORT_DETAILINFO)
            else if ("Ied".equals(node.getName())) {
                // 迭代两次
                Iterator<Element> itt = node.elementIterator();
                while (itt.hasNext()) {
                    Element nodeChild = itt.next();
                    Map<String, Object> map1 = new HashMap<>();
                    // 在map1里边存入一个主键
                    map1.put("StationName", stationNameVal);
                    map1.put("CheckTime", checkTimeVal);
                    // 获取nodeChild的attrs
                    List<Attribute> attrs = nodeChild.attributes();
                    for (Attribute attr : attrs) {
                        if ("IsChecked".equals(attr.getName())) {
                            map1.put("DeviceIsChecked", attr.getValue());
                        } else if ("UnCheckedReason".equals(attr.getName())) {
                            map1.put("DeviceUnCheckReason", attr.getValue());
                        } else if ("result".equals(attr.getName())) {
                            map1.put("DeviceResult", attr.getValue());
                        } else {
                            map1.put(attr.getName(), attr.getValue());
                        }
                    }
                    Iterator<Element> ittt = nodeChild.elementIterator();
                    while (ittt.hasNext()) {
                        Element nodeChild1 = ittt.next();
                        // 获取nodeChild1的attrs
                        List<Attribute> attrs1 = nodeChild1.attributes();
                        for (Attribute attr : attrs1) {
                            if ("result".equals(attr.getName())) {
                                map1.put(nodeChild1.getName() + "Result", attr.getValue());
                            } else {
                                map1.put(nodeChild1.getName() + attr.getName(), attr.getValue());
                            }
                        }
                    }
                    list1.add(map1);
                }
            } else {
                // 详细报告不录入,之后再改
                break;
            }
            if (map.size() > 0) {
                list.add(map);
            }
        }
    }