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);
}
}
}