天天看點

[相關解析]-- java解析xml檔案的四種方式

目前解析xml有4種方式:

一、DOM解析(此處介紹讀檔案的方式,暫未提供寫入的方式)

1、不需要架包,jdk自帶工具

2、建立dom.xml檔案和ResoveDom.java

dom.xml檔案内容如下

<?xml version="1.0" encoding="UTF-8"?>
<book>
    <bookname name="XML詳解" font="GB2312"></bookname>
    <authors>
        <author name="張孝祥" sex="男" age="45"></author>
                <author name="王勇" sex="男" age="35"></author>
        <author name="王波" sex="男" age="30"></author>
    </authors>
    <price value="$55"></price>
    <publishdate>
        <value>2015-08-28</value>
    </publishdate>
</book>      

java代碼如下

package com.test.dom;


import java.io.FileInputStream;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;


import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


//DOM解析Xml檔案。
public class ResolveDom {
@Test
public void testDom2(){
testDom();
}

public static void testDom() {
try {
// 讀取檔案到記憶體
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder dbd = dbf.newDocumentBuilder();
Document doc = dbd.parse(new FileInputStream("src/dom.xml"));
// 通過XML獲得authors的authors子節點清單
XPathFactory f = XPathFactory.newInstance();
XPath path = f.newXPath();
NodeList authors = (NodeList) path.evaluate("book/authors/author", doc, XPathConstants.NODESET);
// 獲得子節點長度(authors中有多少個author)
System.out.println(authors.getLength());


// 擷取authors的第一個子節點
Node author = (Node) path.evaluate("book/authors/author", doc, XPathConstants.NODE);
System.out.println("名稱:" + author.getNodeName());
System.out.println("内容:" + author.getTextContent());// 如果不存在則傳回null,有則傳回内容

//擷取節點屬性
NamedNodeMap attr=author.getAttributes();
System.out.println("該節點的屬性個數"+attr.getLength());

//周遊元素的屬性
if(attr!=null){
for(int i=0;i<attr.getLength();i++){
int n=i+1;
System.out.println("屬性"+n+"名稱:"+attr.item(i).getNodeName());
System.out.println("值:"+attr.item(i).getNodeValue());
System.out.println("類型:"+attr.item(i).getNodeType());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}      

二、Dom4j解析 (需要架包dom4j.jar)

        1、導入架包:dom4j-1.6.1.jar

        2、建立一個XMl檔案,c2.xml和XmlResoleDom4j.java檔案

3、測試

c2.xml檔案内容舉例

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <name>王五</name>
  <age>13</age>
  <id>23</id>
</user>      

 XmlResoleDom4j.java檔案内容如下

package com.test.dom4j;
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
  
import org.dom4j.Document;  
import org.dom4j.DocumentHelper;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter;  
import org.junit.Test; 


//字元串與XML互轉換案例
public class XmlResoleDom4j {
/**
* 讀取xml檔案内容
* @throws Exception
*/
@Test  
   public void test() throws Exception {  
 
       // 建立saxreader對象  
       SAXReader reader = new SAXReader();  
       // 讀取一個檔案,把這個檔案轉換成Document對象  
       Document document = reader.read(new File("src/c2.xml"));  
       // 擷取根元素  
       Element root = document.getRootElement();  
       // 把文檔轉換字元串  
       String docXmlText = document.asXML();  
       System.out.println(docXmlText);    //列印檔案的所有内容
       System.out.println("---------------------------");  
       //user元素标簽根轉換的内容  
       String rootXmlText = root.asXML();  
       System.out.println(rootXmlText);  //列印檔案具有标簽的所有内容
       System.out.println("---------------------------");  
       Element e = root.element("name");// 擷取xml檔案中name元素标簽 内的内容  
       Element e2=root.element("age");  //擷取xml檔案中age元素标簽的内容
       System.out.println(e.asXML());  
       System.out.println(e2.asXML());
 
   }  
 
   /** 
    * 第一種:建立一個document對象 往document對象中添加節點元素 轉存為xml檔案 
    *  
    * @throws Exception 
    */  
   @Test
   public void test2() throws Exception {  
 
       Document document = DocumentHelper.createDocument();
       // 建立根節點 并且加入元素
       Element root = document.addElement("user");  
       Element java = root.addElement("name");  
       java.setText("王五");  
       Element ios = root.addElement("age");  
       ios.setText("13");  
 
       writeXml(document);  
   }  
 
   /** 
    * 第二種:把一個文本字元串轉換Document對象 ,然後寫入xml檔案
    *  
    * @throws Exception 
    */  
   @Test
   public void test1() throws Exception {  
    //将要寫入的字元串,如果是一個集合,那麼使用循環然後拼接即可
       String text = "<user><id>1</id><name>張三</name><age>22</age></user>";  
       Document document = DocumentHelper.parseText(text);  
       Element e = document.getRootElement();  
       //列印标簽名稱csdn
       System.out.println(e.getName());  
       //調用方法寫入檔案
       writeXml(document);  
   }  
 
   
   /** 
    * 将document對象寫入新的檔案(xml檔案) 
    *  
    * @param document 
    * @throws Exception 
    */  
   public static void writeXml(Document document) throws Exception {  
       // 緊湊的格式  
       // OutputFormat format = OutputFormat.createCompactFormat();  
       // 排版縮進的格式  
       OutputFormat format = OutputFormat.createPrettyPrint();  
       // 設定編碼  
       format.setEncoding("UTF-8");  
       // 建立XMLWriter對象,指定了寫出檔案及編碼格式  
       XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
               new FileOutputStream(new File("src//c2.xml")), "UTF-8"), format);  
       // 寫入  
       writer.write(document);  
       // 立即寫入  
       writer.flush();  
       // 關閉操作  
       writer.close();  
   }  
}      

4、針對多個标簽的寫入

(1)xml檔案:dom4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<四大名著>
<西遊記 id="x001">  
        <作者>吳承恩1</作者>  
         <朝代>明朝</朝代>  
    </西遊記>  
    <紅樓夢 id="x002">  
        <作者>曹雪芹</作者>  
    </紅樓夢> 
    <三國演義 id="x003">
    <作者>羅貫中</作者>
    </三國演義>
</四大名著>      

       (2)測試的java檔案

package com.test.dom4j;


import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
import java.util.Iterator;  
import java.util.List;  
  
import org.dom4j.Attribute;  
import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter; 
import org.junit.Test;


public class ResolveDom4j {
@Test  
    public void test() throws Exception {  
        // 建立saxReader對象  
        SAXReader reader = new SAXReader();  
        // 通過read方法讀取一個檔案 轉換成Document對象  
        Document document = reader.read(new File("src/dom4j.xml"));  
        //擷取根節點元素對象  
        Element node = document.getRootElement();  
        //讀取dom4j.xml檔案中所有元素
        listNodes(node);  
  
        // 擷取四大名著元素節點中,子節點名稱為紅樓夢元素節點。  
        Element element = node.element("紅樓夢");  
        //擷取element的id屬性節點對象  
        Attribute attr = element.attribute("id");  
        //删除屬性  
        element.remove(attr);  
        //添加新的屬性  
        element.addAttribute("name", "作者");  
        // 在紅樓夢元素節點中添加朝代元素的節點  
        Element newElement = element.addElement("朝代");  
        newElement.setText("清朝");  
        //擷取element中的作者元素節點對象  
        Element author = element.element("作者");  
        //删除元素節點  
        boolean flag = element.remove(author);  
        //傳回true代碼删除成功,否則失敗  
        System.out.println(flag);  
        //添加CDATA區域  
        element.addCDATA("紅樓夢,是一部愛情小說.");  
        // 寫入到一個新的檔案中  
        writer(document);  
  
    }  
  
    /** 
     * 把document對象寫入新的檔案 
     *  
     * @param document 
     * @throws Exception 
     */  
    public void writer(Document document) throws Exception {  
        // 緊湊的格式  
        // OutputFormat format = OutputFormat.createCompactFormat();  
        // 排版縮進的格式  
        OutputFormat format = OutputFormat.createPrettyPrint();  
        // 設定編碼  
        format.setEncoding("UTF-8");  
        // 建立XMLWriter對象,指定了寫出檔案及編碼格式  
        // XMLWriter writer = new XMLWriter(new FileWriter(new  
        // File("src//a.xml")),format);  
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
                new FileOutputStream(new File("src//a.xml")), "UTF-8"), format);  
        // 寫入  
        writer.write(document);  
        // 立即寫入  
        writer.flush();  
        // 關閉操作  
        writer.close();  
    }  
  
   //節點内容
    public void listNodes(Element node) {  
        System.out.println("目前節點的名稱::" + node.getName());  
        // 擷取目前節點的所有屬性節點  
        List<Attribute> list = node.attributes();  
        // 周遊屬性節點  
        for (Attribute attr : list) {  
            System.out.println(attr.getText() + "-" + attr.getName()  
                    + "---" + attr.getValue());  
        }  
       //如果文本内容不是空,則列印
        if (!(node.getTextTrim().equals(""))) {  
            System.out.println("文本内容::::" + node.getText());  
        }  
        // 目前節點下面子節點疊代器  
        Iterator<Element> it = node.elementIterator();  
        // 周遊  
        while (it.hasNext()) {  
            // 擷取某個子節點對象  
            Element e = it.next();  
            // 對子節點進行周遊  
            listNodes(e);  
        }  
    }  
  
    /** 
     * 根據标簽元素名稱擷取内容
     */  
    public void elementMethod(Element node) {  
        // 擷取node節點中,子節點的元素名稱為西遊記的元素節點。  
        Element e = node.element("西遊記");  
        // 擷取西遊記元素節點中,子節點為作者的元素節點(可以看到隻能擷取第一個作者元素節點)  
        Element author = e.element("作者");  
        System.out.println(e.getName() + "----" + author.getText());  
        // 擷取西遊記這個元素節點 中,所有子節點名稱為作者元素的節點 。  
        List<Element> authors = e.elements("作者");  
        for (Element aut : authors) {  
            System.out.println(aut.getText());  
        }  
        // 擷取西遊記這個元素節點 所有元素的子節點。  
List<Element> elements = e.elements();  
        for (Element el : elements) {  
            System.out.println(el.getText());  
        }  
    }  
}      

三、SAX(simple ApIs for xml)

四、JDOM解析(需要架包jdom.jar)