Java解析XML

(一)XML解析技術(shù)
解析:用java等技術(shù)將xml文件中有用的信息提取出來的過程。
現(xiàn)常用的有兩大類別:

  • DOM類別: 一次性將硬盤中的xml文件加載到內(nèi)存中形成一顆倒狀樹,從根節(jié)點開始從上向下遍歷,獲取有用節(jié)點的內(nèi)容。
  • SAX類別:分多次將硬盤中的xml文件加載到內(nèi)存中,以事件的方式去解析節(jié)點中有用的內(nèi)容。

在這里我們選擇XML解析器:dom4.j;dom4.j開發(fā)包叫:dom4.j-1.6.1.jar導入到你的工程的CLASSPATH路徑下
(二)DOM4.J簡單介紹
1、Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發(fā)JDOM的人分離出來而后獨立開發(fā)的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要復(fù)雜一些,但它提供了比JDOM更好的靈活性
2、Dom4j是一個非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強大和極易使用的特點。現(xiàn)在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
3、使用Dom4j開發(fā),需下載dom4j相應(yīng)的jar文件

(三)DOM4J解析案例

  • 1、獲得document的三種方式
    (1)讀取
    (2)字符串轉(zhuǎn)換
    (3)新建對象

(1)讀取




package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileOutputStream;

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

public class Demo01 {
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //將內(nèi)存中的xml文件寫入硬盤中去
        //創(chuàng)建一個內(nèi)存中的document對象,表示硬盤中的xml文件
        Document xmlDocument =  DocumentHelper.createDocument();
        //將內(nèi)存中的document文件寫入硬盤中,形成一個xml文件
        XMLWriter xmlWriter = new XMLWriter(
            new FileOutputStream(new File("E:/new123.xml"))
        );
        xmlWriter.write(xmlDocument);
        xmlWriter.close();      
    }
}

結(jié)果:



(2)字符串轉(zhuǎn)換


public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //type01(); 
        //字符串轉(zhuǎn)換
        String str = "<root><city>廣州</city></root>";
        Document xmlDocument = DocumentHelper.parseText(str);
        XMLWriter xmlWriter = new XMLWriter(
                new FileOutputStream(new File("E:/book1.xml"))
            );
            xmlWriter.write(xmlDocument);
            xmlWriter.close();
    }

(3)新建對象


public static void main(String[] args) throws Exception {       
   
        //新創(chuàng)建對象,dom4.j核心解析器
        SAXReader saxReader = new SAXReader();
        Document xmlDocument = saxReader.read(new File("E:/book.xml"));
        System.out.println(xmlDocument !=null?"已讀到xml文件":"未讀取到xml文件");
    }

結(jié)果:

  • 2、獲得根節(jié)點和其子節(jié)點
package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Demo02 {

    public static void main(String[] args) throws Exception {
        //創(chuàng)建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        //創(chuàng)建InputStream對象,指向硬盤中的xml文件
        InputStream is = new FileInputStream(new File("E:/new.xml"));
        Document xmlDocument = saxReader.read(is);
        //獲取根節(jié)點
        Element rootElement = xmlDocument.getRootElement();
        //輸出根節(jié)點名字
        System.out.println(rootElement.getName());
        //獲取根節(jié)點下面的直接子節(jié)點個數(shù)和名字
        List<Element> listElement = rootElement.elements("city");
        System.out.println(listElement.size());
        for(int i = 0;i<listElement.size();i++){
            System.out.println(listElement.get(i).getText());
        }
    }
}

  • 3、遍歷每個子節(jié)點屬性和標簽中的內(nèi)容
package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Demo03 {

    public static void main(String[] args) throws Exception {
        //遍歷子節(jié)點的屬性和內(nèi)容
        //創(chuàng)建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        /*Document xmlDocument  = saxReader.read(new File("E:/new.xml"));*/
        //創(chuàng)建InputStream對象,指向硬盤中的XML文件
        InputStream is = new  FileInputStream(new File("E:/book.xml"));
        //通過字節(jié)流對象,加載硬盤中的XML文件到內(nèi)存中
        Document xmlDocument = saxReader.read(is);
        //獲取根節(jié)點
        Element rootElement = xmlDocument.getRootElement();
        //顯示根節(jié)點的名字
        System.out.println(rootElement.getName());
        //獲取根節(jié)點下面的直接子節(jié)點個數(shù)和名字
        List<Element> elementList = rootElement.elements("book");
        //子節(jié)點個數(shù)
        System.out.println(elementList.size());
        /*System.out.println(elementList.size());*/
        for(Element element : elementList){
            //分別輸出子節(jié)點title,price,author的內(nèi)容
            String titleElement = element.element("title").getText().trim();
            System.out.println(titleElement);
            
            String priceElement = element.element("price").getText().trim();
            System.out.println(priceElement);
            
            String authorElement = element.element("author").getText().trim();
            System.out.println(authorElement);
            
            //子節(jié)點的id屬性
            String id = element.attributeValue("id");
            System.out.println(id);
        }
                

    }

}


(四)將Document對象寫入XML文件

  • 文檔中全為英文,不設(shè)置編碼,直接寫入的形式
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
  • 文檔中含有中文,設(shè)置編碼格式寫入的形式
package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Demo04 {

    public static void main(String[] args) throws Exception {
        //創(chuàng)建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        //創(chuàng)建InputStream對象,指向硬盤中的xml文件
        InputStream is = new FileInputStream(new File("E:/book.xml"));
        Document xmlDocument = saxReader.read(is);  
        /*
         * 第一種方法
         * 
        //將DOUCMENT對象存放入硬盤中,形成xml文件
        XMLWriter writer = new XMLWriter(new FileWriter("e:/newbook.xml"));
        writer.write(xmlDocument);  
        writer.close();
        *
        */
        //第二種方法
        OutputFormat format = OutputFormat.createCompactFormat();
        OutputStream os = new FileOutputStream(new File("e:/newbook.xml"));
        XMLWriter  xmlWriter = new XMLWriter(os, format);
        xmlWriter.write(xmlDocument);
        xmlWriter.close();      
    }
}

(五)XPATH快速定位
若一個xml文檔里有著多層次標簽的時候,想要定位到某個標簽的內(nèi)容時,使用dom4.j只能夠依次尋找從上到下,比較繁瑣。因此,使用XPATH
1、XPATH是啥?

XPATH是一門在xml文檔中查找信息的語言,可用來對其中的元素和屬性進行遍歷,簡化了dom4.j查找節(jié)點的過程

2、XPATH語法


3、查詢節(jié)點
(1)獲取所有符合條件的節(jié)點:selectNode()返回一個List集合
(2)獲取符合條件的單個節(jié)點:selectSingleNode(xpath)返回一個Node元素,一般需要轉(zhuǎn)換成Element類型,若有多個出現(xiàn)的話,只取其中一個。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容