一、什麼Dom4J方式
Dom4j是一個簡單、靈活的開放源代碼的庫,是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件採用的Dom4j,例如Hibernate。
二、Java中使用Dom4J方式的準備工作
由於Dom4J並不是JDK中的API,需要自己到網絡上下載相應的jar包,並且在需要使用Dom4J的項目中添加。
三、具體的Java代碼實現
在java中用Dom4JAPI實現以下七種常見操作:(註釋中解釋具體操作)
0、創建解析器,得到Document對象、將修改結果輸出到源文件
1、得到某個具體的節點內容
2、遍歷所有元素節點
3、修改某個元素節點的主體內容
4、向指定元素節點中增加子元素節點
5、向指定元素節點上增加同級元素節點
6、刪除指定元素節點
7、操作XML文件屬性
待解析的XML文檔內容:
<聯繫人列表>
<聯繫人>
<姓名>張三</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>30</年齡>
</聯繫人>
<聯繫人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>31</年齡>
</聯繫人>
</聯繫人列表>
0、創建解析器,得到Document對象、將修改結果輸出到源文件
//創建Dom4j解析器
SAXReader reader = new SAXReader();
//加載document對象
Document document = reader.read("src/j2ee/dom/linkman.xml");
//將結果保存到硬盤上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());//參數:文件輸出流(目標文件),輸出格式(有兩種,一般選用PrettyPrint格式)
writer.write(document);
writer.close();
1、得到某個具體的節點內容(獲取第二個聯繫人姓名,輸出結果爲李四)
public static void test01(Document document) {
//拿到根節點
Element root = document.getRootElement();
//拿到所有的聯繫人
List<Element> men = root.elements();
//拿到第二個聯繫人
Element man = men.get(1);
//打印第二個聯繫人的姓名
System.out.println(man.elementText("姓名"));
}
2、遍歷所有元素節點
public static void treeWalk(Document document) {
//從根節點開始遍歷
treeWalk( document.getRootElement() );
}
public static void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
//循環拿到當前節點下的每一個子節點
Node node = element.node(i);
//如果當前拿到的節點時一個元素,則輸出元素名,且遞歸調用遍歷方法遍歷當前元素的子節點
if ( node instanceof Element ) {
System.out.println(node.getName());
treeWalk((Element) node);
}
}
}
輸出結果:(將XML文檔中的元素標籤名按順序輸出)
聯繫人
姓名
EMAIL
年齡
聯繫人
姓名
EMAIL
年齡
3、修改某個元素節點的主體內容
/**
* 3、修改某個元素節點的主體內容 (李四年齡改爲27)
*/
public static void test03(Document document) throws IOException {
//拿到根節點
Element root = document.getRootElement();
//拿到根節點下所有元素
List<Element> men = root.elements();
//拿到第二個聯繫人李四
Element man = men.get(1);
//拿到李四的年齡節點
Element name = man.element("年齡");
//將李四的年齡改爲27
name.setText("27");
//將結果保存到硬盤上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件發現聯繫人李四的年齡變爲27
4、向指定元素節點中增加子元素節點
/**
* 4、向指定元素節點中增加子元素節點(張三姓名內添加暱稱)
*/
public static void test04(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
Element man = men.get(0);
//拿到第一個聯繫人的姓名節點
Element name = man.element("姓名");
//在姓名節點內添加元素"暱稱"內容爲"三哥"
name.addElement("暱稱").setText("三哥");
//將結果保存到硬盤上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:(張三姓名下多了暱稱節點,李四年齡在3操作時被修改)
<聯繫人列表>
<聯繫人>
<姓名>張三
<暱稱>三哥</暱稱>
</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>30</年齡>
</聯繫人>
<聯繫人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>27</年齡>
</聯繫人>
</聯繫人列表>
5、向指定元素節點上增加同級元素節點
/**
* 5、向指定元素節點上增加同級元素節點(給李四年齡節點增加同級別節點婚否)
*/
public static void test05(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
Element man = men.get(1);
//得到李四年齡節點
Element age = man.element("年齡");
//添加年齡節點的同級別節點"婚否",內容爲"已婚"
age.getParent().addElement("婚否").setText("已婚");
//將結果保存到硬盤
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:
<聯繫人列表>
<聯繫人>
<姓名>張三
<暱稱>三哥</暱稱>
</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>30</年齡>
</聯繫人>
<聯繫人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>27</年齡>
<婚否>已婚</婚否>
</聯繫人>
</聯繫人列表>
6、刪除指定元素節點
/**
* 6、刪除指定元素節點(刪除張三暱稱)
*/
public static void test06(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
Element man = men.get(0);
Element name = man.element("姓名");
Element nickname = name.element("暱稱");
//刪除了name元素(姓名)的子元素nickname(暱稱)
name.remove(nickname);
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:(暱稱節點已經被刪除)
<聯繫人列表>
<聯繫人>
<姓名>張三</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>30</年齡>
</聯繫人>
<聯繫人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>27</年齡>
<婚否>已婚</婚否>
</聯繫人>
</聯繫人列表>
7、操作XML文件屬性
/**
* 7、操作XML文件屬性(聯繫人添加性別)
*/
public static void test07(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
//遍歷所有聯繫人
for (Element man: men) {
//給每個聯繫人添加屬性"性別",內容爲"男"
man.addAttribute("性別","男");
}
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:(性別屬性被添加到聯繫人標籤內)
<聯繫人列表>
<聯繫人 性別="男">
<姓名>張三</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>30</年齡>
</聯繫人>
<聯繫人 性別="男">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年齡>27</年齡>
<婚否>已婚</婚否>
</聯繫人>
</聯繫人列表>