import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class XmlTreeParser {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
public static void main(String[] args) throws Exception {
File xmlFile = new File("tree.xml"); // 你的 XML
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList list = doc.getElementsByTagName("TreeSubdir");
List<TreeNodeBean> result = new ArrayList<>();
for (int i = 0; i < list.getLength(); i++) {
Element e = (Element) list.item(i);
String sftPath = getTagValue(e, "sft_path");
String iftSid = getTagValue(e, "ift_sid");
String sftName = getTagValue(e, "sft_name");
String iKBCount = getTagValue(e, "iKBCount");
String dInit = getTagValue(e, "dinit_time");
String dModi = getTagValue(e, "dmodi_time");
String iftPrev = getTagValue(e, "ift_prev");
TreeNodeBean bean = new TreeNodeBean();
bean.setId(iftSid);
bean.setParentId(iftPrev);
bean.setName(sftName);
bean.setPathRaw(sftPath);
bean.setPathParts(Arrays.asList(sftPath.split("\\\\"))); // 切開路徑
bean.setKbCount(iKBCount);
bean.setInitTime(LocalDateTime.parse(dInit, FORMATTER));
bean.setModiTime(LocalDateTime.parse(dModi, FORMATTER));
result.add(bean);
}
// 測試輸出
result.forEach(b -> System.out.println(b.getId() + " " + b.getName() + " " + b.getInitTime()));
}
private static String getTagValue(Element e, String tag) {
NodeList nl = e.getElementsByTagName(tag);
if (nl.getLength() > 0) {
return nl.item(0).getTextContent().trim();
}
return "";
}
}
aW1wb3J0IG9yZy53M2MuZG9tLio7CgppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CgppbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CgppbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdHRlcjsKCmltcG9ydCBqYXZhLnV0aWwuKjsKCgoKcHVibGljIGNsYXNzIFhtbFRyZWVQYXJzZXIgewoKCgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZVRpbWVGb3JtYXR0ZXIgRk9STUFUVEVSID0gRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CgoKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKCiAgICAgICAgRmlsZSB4bWxGaWxlID0gbmV3IEZpbGUoInRyZWUueG1sIik7IC8vIOS9oOeahCBYTUwKCiAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwoKICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CgogICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoeG1sRmlsZSk7CgogICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5ub3JtYWxpemUoKTsKCgoKICAgICAgICBOb2RlTGlzdCBsaXN0ID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUcmVlU3ViZGlyIik7CgoKCiAgICAgICAgTGlzdDxUcmVlTm9kZUJlYW4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewoKICAgICAgICAgICAgRWxlbWVudCBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbShpKTsKCgoKICAgICAgICAgICAgU3RyaW5nIHNmdFBhdGggID0gZ2V0VGFnVmFsdWUoZSwgInNmdF9wYXRoIik7CgogICAgICAgICAgICBTdHJpbmcgaWZ0U2lkICAgPSBnZXRUYWdWYWx1ZShlLCAiaWZ0X3NpZCIpOwoKICAgICAgICAgICAgU3RyaW5nIHNmdE5hbWUgID0gZ2V0VGFnVmFsdWUoZSwgInNmdF9uYW1lIik7CgogICAgICAgICAgICBTdHJpbmcgaUtCQ291bnQgPSBnZXRUYWdWYWx1ZShlLCAiaUtCQ291bnQiKTsKCiAgICAgICAgICAgIFN0cmluZyBkSW5pdCAgICA9IGdldFRhZ1ZhbHVlKGUsICJkaW5pdF90aW1lIik7CgogICAgICAgICAgICBTdHJpbmcgZE1vZGkgICAgPSBnZXRUYWdWYWx1ZShlLCAiZG1vZGlfdGltZSIpOwoKICAgICAgICAgICAgU3RyaW5nIGlmdFByZXYgID0gZ2V0VGFnVmFsdWUoZSwgImlmdF9wcmV2Iik7CgoKCiAgICAgICAgICAgIFRyZWVOb2RlQmVhbiBiZWFuID0gbmV3IFRyZWVOb2RlQmVhbigpOwoKICAgICAgICAgICAgYmVhbi5zZXRJZChpZnRTaWQpOwoKICAgICAgICAgICAgYmVhbi5zZXRQYXJlbnRJZChpZnRQcmV2KTsKCiAgICAgICAgICAgIGJlYW4uc2V0TmFtZShzZnROYW1lKTsKCiAgICAgICAgICAgIGJlYW4uc2V0UGF0aFJhdyhzZnRQYXRoKTsKCiAgICAgICAgICAgIGJlYW4uc2V0UGF0aFBhcnRzKEFycmF5cy5hc0xpc3Qoc2Z0UGF0aC5zcGxpdCgiXFxcXCIpKSk7IC8vIOWIh+mWi+i3r+W+kQoKICAgICAgICAgICAgYmVhbi5zZXRLYkNvdW50KGlLQkNvdW50KTsKCiAgICAgICAgICAgIGJlYW4uc2V0SW5pdFRpbWUoTG9jYWxEYXRlVGltZS5wYXJzZShkSW5pdCwgRk9STUFUVEVSKSk7CgogICAgICAgICAgICBiZWFuLnNldE1vZGlUaW1lKExvY2FsRGF0ZVRpbWUucGFyc2UoZE1vZGksIEZPUk1BVFRFUikpOwoKCgogICAgICAgICAgICByZXN1bHQuYWRkKGJlYW4pOwoKICAgICAgICB9CgoKCiAgICAgICAgLy8g5ris6Kmm6Ly45Ye6CgogICAgICAgIHJlc3VsdC5mb3JFYWNoKGIgLT4gU3lzdGVtLm91dC5wcmludGxuKGIuZ2V0SWQoKSArICIgIiArIGIuZ2V0TmFtZSgpICsgIiAiICsgYi5nZXRJbml0VGltZSgpKSk7CgogICAgfQoKCgogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhZ1ZhbHVlKEVsZW1lbnQgZSwgU3RyaW5nIHRhZykgewoKICAgICAgICBOb2RlTGlzdCBubCA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKTsKCiAgICAgICAgaWYgKG5sLmdldExlbmd0aCgpID4gMCkgewoKICAgICAgICAgICAgcmV0dXJuIG5sLml0ZW0oMCkuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7CgogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICIiOwoKICAgIH0KCn0K