Dom4j 核心類介紹
DocumentHelper:建立 Document 物件
Element:代表 XML 元素,支援屬性、子元素操作
SAXReader:基於 SAX 解析器,高效讀取 XML
XMLWriter:將 Document 寫入檔案,支援格式化輸出
一、建立並寫入 XML
public static void writeXML(String filename) {
try {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("PortConfig");
// 新增多個 Port 元素及屬性
addPort(root, "portBloodpress", "COM12");
addPort(root, "portWah", "COM14");
addPort(root, "portBloodsugar", "COM16");
addPort(root, "portBloodfat", "COM18");
addPort(root, "portUric", "COM20");
OutputFormat format = new OutputFormat(" ", true); // 縮排格式化
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)), format);
writer.write(document);
writer.close();
} catch (Exception e) { e.printStackTrace(); }
}
private static void addPort(Element root, String name, String number) {
Element port = root.addElement("Port");
port.addAttribute("Portname", name);
port.addAttribute("Portnumber", number);
}
二、讀取並解析 XML
public static void readXML(String filename) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(filename);
Element root = document.getRootElement();
for (Iterator it = root.elementIterator(); it.hasNext();) {
Element port = it.next();
String name = port.attributeValue("Portname");
String value = port.attributeValue("Portnumber");
// 根據名稱賦值給常數類(示例)
switch (name) {
case "portBloodpress": Constant.portBloodpress = value; break;
case "portWah": Constant.portWah = value; break;
case "portBloodsugar": Constant.portBloodsugar = value; break;
case "portBloodfat": Constant.portBloodfat = value; break;
case "portUric": Constant.portUric = value; break;
}
}
} catch (Exception e) { e.printStackTrace(); }
}
三、更新 XML
public static void updateXML(String filename) {
try {
File file = new File(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element root = document.getRootElement();
for (Iterator it = root.elementIterator(); it.hasNext();) {
Element port = it.next();
String name = port.attributeValue("Portname");
switch (name) {
case "portBloodpress": port.setAttributeValue("Portnumber", Constant.portBloodpress); break;
case "portWah": port.setAttributeValue("Portnumber", Constant.portWah); break;
case "portBloodsugar": port.setAttributeValue("Portnumber", Constant.portBloodsugar); break;
case "portBloodfat": port.setAttributeValue("Portnumber", Constant.portBloodfat); break;
case "portUric": port.setAttributeValue("Portnumber", Constant.portUric); break;
}
}
XMLWriter writer = new XMLWriter(new FileWriter(file));
writer.write(document);
writer.close();
} catch (Exception e) { e.printStackTrace(); }
}
範例 XML 內容
<?xml version="1.0" encoding="UTF-8"?>
<PortConfig>
<Port Portname="portBloodpress" Portnumber="COM126"/>
<Port Portname="portWah" Portnumber="COM146"/>
<Port Portname="portBloodsugar" Portnumber="COM166"/>
<Port Portname="portBloodfat" Portnumber="COM186"/>
<Port Portname="portUric" Portnumber="COM206"/>
</PortConfig>
關鍵點總結
- 建立:
DocumentHelper → Document → Element → Attribute
- 解析:
SAXReader → Document → RootElement → Iterator → attributeValue()
- 更新:解析後用
setAttributeValue() 修改,再用 XMLWriter 寫回
- 格式化輸出:
OutputFormat(" ", true) 產生可讀性良好的縮排 XML