dom4j是一個優秀的開源項目,專用於xml檔案的讀寫,而且支援強大的xpath.
下面的代碼示範了對xml檔案demo.xml的讀寫
demo.xml內容:
<?xml version="1.0" encoding="UTF-8" ?><address-list> <card name="yangjm" id="1"> <sex>男</sex> <address><![CDATA[中國上海外灘No.01]]> </address> <telephone>13916732212</telephone> </card> <card name="zhangsan" id="2"> <sex>女</sex> <address> <item type="家庭地址"><![CDATA[中國.北京.東直門外大街]]> </item> <item type="單位地址"><![CDATA[中國.上海.田林路888號]]> </item> </address> <telephone>010-123123</telephone> </card></address-list>
java代碼:
package jmyang.dom4j;/** * <p>Title:dom4j測試 </p> * <p>Description: 使用xpath讀取節點內容、屬性</p> * <p>Copyright: Copyright (c) 2012</p> * <p>Company: infosky.com.cn</p> * @author:yjmyzz@126.com 菩提樹下的楊過 * @version 1.0 */import java.util.*;import java.io.*;import org.dom4j.*;import org.dom4j.io.*;public class XmlTest { public static void Test() { String fileName = System.getProperty("user.dir") + "\\demo.xml"; //當前路徑下的demo.xml try { SAXReader reader = new SAXReader(); Document doc = reader.read(fileName); //載入xml檔案 List peoples = doc.selectNodes("//*[@name]"); //選擇所有具有name屬性的節點(即demo.xml中的所有card節點) for (Iterator iter = peoples.iterator(); iter.hasNext(); ) { Element card = (Element) iter.next(); //System.out.println(node.asXML()); //System.out.println("---------------------------------------"); //System.out.println(node.attributeCount()); List attrList = card.attributes(); //輸出每個card的所有屬性 for (Iterator attr = attrList.iterator(); attr.hasNext(); ) { Attribute a = (Attribute) attr.next(); System.out.println(a.getName() + "=" + a.getValue()); } System.out.println( "----------------------------------------------------"); } Element zhangsan = (Element) doc.selectSingleNode("//card[@id='2']"); //尋找“id屬性”=2的card元素 System.out.println("張三的名稱:" + zhangsan.attribute("name").getValue()); //輸出zhangsan的name屬性 Node addrFamily = zhangsan.selectSingleNode("./address/item[2]"); //選擇zhangsan元素下的address節點下的第2個item子節點 System.out.println("張三的單位地址:" + addrFamily.getStringValue()); //輸出cdata內容 System.out.println( "----------------------------------------------------"); //為zhangsan下增加二個節點 zhangsan.addElement("email").addAttribute("type", "工作").addText("work@some-domain.com"); zhangsan.addElement("email").addAttribute("type", "私人").addCDATA("private@some-domain.com"); //設定CDATA內容 System.out.println(zhangsan.asXML()); //列印zhangsan節點的xml內容(調試用) System.out.println( "----------------------------------------------------"); //將上述改動儲存到檔案demo2.xml FileWriter fileWriter = new FileWriter(System.getProperty( "user.dir") + "\\demo2.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); //設定美觀的縮排格式,便於閱讀 //format = OutputFormat.createCompactFormat();//設定緊湊格式(消除多餘空格),便於下載 XMLWriter writer = new XMLWriter(System.out, format); writer.setWriter(fileWriter); writer.write(doc); writer.close(); } catch (Exception e) { e.printStackTrace(); } }}
jBuilder下的運行結果:
name=yangjm
id=1
----------------------------------------------------
name=zhangsan
id=2
----------------------------------------------------
張三的名稱:zhangsan
張三的單位地址:中國.上海.田林路888號
----------------------------------------------------
<card name="zhangsan" id="2">
<sex>女</sex>
<address>
<item type="家庭地址"><![CDATA[中國.北京.東直門外大街]]> </item>
<item type="單位地址"><![CDATA[中國.上海.田林路888號]]> </item>
</address>
<telephone>010-123123</telephone>
<email type="工作">work@some-domain.com</email><email type="私人"><![CDATA[private@some-domain.com]]></email></card>
----------------------------------------------------
儲存後的demo2.xml
<?xml version="1.0" encoding="UTF-8"?>
<address-list>
<card name="yangjm" id="1">
<sex>男</sex>
<address><![CDATA[中國上海外灘No.01]]> </address>
<telephone>13916732212</telephone>
</card>
<card name="zhangsan" id="2">
<sex>女</sex>
<address>
<item type="家庭地址"><![CDATA[中國.北京.東直門外大街]]> </item>
<item type="單位地址"><![CDATA[中國.上海.田林路888號]]> </item>
</address>
<telephone>010-123123</telephone>
<email type="工作">work@some-domain.com</email>
<email type="私人"><![CDATA[private@some-domain.com]]></email>
</card>
</address-list>