dom4j讀寫xml

    DOM4J是一個非常非常優秀的JavaXML API,是jdom的升級品,用來讀寫XML文件的,且具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。

   首先需要下載dom4j的jar包:dom4j 1.6.1。本篇文章需要引入dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar。

寫xml

   寫xml文件非常簡單,就是不停地在節點下添加子節點。

<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
 * @Description: 寫xml
 */
public class TestXmlWriter
{
	public static void main(String[] args){
		// XML 聲明 <?xml version="1.0" encoding="UTF-8"?> 自動添加到 XML文檔中  
		  
        // 使用DocumentHelper類創建文檔實例(生成 XML文檔節點的 dom4j API工廠類) 
		Document doc=DocumentHelper.createDocument();
		
		// addElement():創建根元素 items(用於向 XML 文檔中增加元素) 
		Element rootElt=doc.addElement("items");
		
		//在items節點下添加item節點
		Element itemElt=rootElt.addElement("item");
		
		//addAttribute()方法:在item節點內添加id和name屬性  
		itemElt.addAttribute("id", "0001");  
		itemElt.addAttribute("name", "wanglp"); 
		
		//在item節點下添加id元素
		Element idElt=itemElt.addElement("id");
		//設置id的值
		idElt.setText("10023");
		//在item節點下添加name元素
		Element nameElt=itemElt.addElement("name");
		//設置name的值
		nameElt.setText("吉林省");
		
		//打印xml內容
		String xmlString=doc.asXML();
		System.out.println(xmlString);
		
		/*try
		{
			OutputFormat format=OutputFormat.createPrettyPrint();
			format.setEncoding("GBK");	//設置xml文件編碼的格式
			//將xml寫入test.xml文件中
			XMLWriter writer=new XMLWriter(new FileWriter("h:\\test.xml"));
			writer.write(doc);
			writer.close();
			System.out.println("寫XML成功!");
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		
	}
}</span>

讀xml文件

xml文件:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<employees>  
    <!--An XML Note -->  
    <?target text?>  
    <employee id="lo" name="lele">  
        <sex>m</sex>  
        <age>23</age>  
    </employee>  
    <employee id="ve" name="fox">  
        <sex>f</sex>  
        <age>22</age>  
    </employee>  
</employees>  </span>
利用節點讀取xml文件
<span style="font-family:KaiTi_GB2312;font-size:18px;">/** 
     * 利用dom4j進行xml文檔的讀取操作  
     */  
    public void parserXml(File file) {  
  
        Document document = null;  
  
        // 使用 SAXReader 解析 XML 文檔 catalog.xml:  
        SAXReader saxReader = new SAXReader();  
  
        try {  
            document = saxReader.read(file);  
        } catch (DocumentException e) {  
            e.printStackTrace();  
        }  
        // 將字符串轉爲XML  
        // document = DocumentHelper.parseText(fileString);  
  
        // 獲取根節點  
        Element root = document.getRootElement();  
        // 打印節點名稱  
        System.out.println("<" + root.getName() + ">");  //打印<employees>
  
        // 獲取根節點下的子節點遍歷  
        Iterator<?> iter = root.elementIterator("employee");  
        // 遍歷employee節點  
        while (iter.hasNext()) {  
            // 獲取當前子節點  
            Element empEle = (Element) iter.next();  
            System.out.println("<" + empEle.getName() + ">");  //<employee>
  
            // 獲取當前子節點的屬性遍歷  
            Iterator<?> attrList = empEle.attributeIterator();  
            while (attrList.hasNext()) {  
                Attribute attr = (Attribute) attrList.next();  
                System.out.println(attr.getName() + "=" + attr.getValue());  //id=lo,,name=lele
            }  
  
            // 遍歷employee節點下所有子節點  
            Iterator<?> eleIte = empEle.elementIterator();  
            while (eleIte.hasNext()) {  
                Element ele = (Element) eleIte.next();  
                System.out.println("<" + ele.getName() + ">" + ele.getTextTrim());  //<sex>m ,,<age>23

            }  
  
            // 獲取employee節點下的子節點sex值  
            // String sex = empEle.elementTextTrim("sex");  
            // System.out.println("sex:" + sex);  
  
        }  
        System.out.println("</" + root.getName() + ">");  
    }  </span>

根據字符串讀取xml文件

    這種方式讀取xml文件時,xml文件中不能有重複的標籤,也就是說我們需要將xml文件中的employee標籤寫成唯一。否則就會出錯。

<span style="font-family:KaiTi_GB2312;font-size:18px;"> //這種方式讀取xml文件,xml文件中不能有重複的標籤
    public void ReadXml(InputStream in){
    	SAXReader reader = new SAXReader();
    	try {
    		//讀取配置文件
    		Document doc = reader.read(in);
    		//上面這部分一樣,
    		
    		//獲取配置文件中的相關信息
    		Element sexElt = (Element)doc.selectObject("/employees/employee/sex");
			Element ageElt = (Element)doc.selectObject("/employees/employee/age");
    		System.out.println(sexElt.getStringValue());
    		System.out.println(ageElt.getStringValue());
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
    }</span>
客戶端調用
<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void main(String[] args) {
		DOM4JReadXML dom4j = new DOM4JReadXML();  
		//使用輸入流得到要讀取的xml文件
		//讀取classpath下的TestXMLFile.xml文件
		//ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,
		//使用相對於當前項目的classpath的相對路徑來查找資源。
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("TestXMLFile.xml");
		dom4j.ReadXml(in);
		
		//使用File查找xml文件
        File file = new File("e:/TestXMLFile.xml");  
        dom4j.parserXml(file); 
	}</span>

   使用InputStream輸入流查找xml文件,可以查找到classpath下的xml文件,使用相對路徑;使用File查找xml文件,可以使用絕對路徑,也可以使用相對路徑(File file = new File("src/TestXMLFile.xml"),就是在classpath下查找xml文件)。在代碼中,我們最好不要使用絕對路徑。

   其他讀寫xml文件方法參考:http://blog.csdn.net/sdsky1987/article/details/7286306

發佈了129 篇原創文章 · 獲贊 18 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章