Java解析XML

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

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

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

(三)DOM4J解析案例

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

(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)建一個(gè)內(nèi)存中的document對(duì)象,表示硬盤中的xml文件
        Document xmlDocument =  DocumentHelper.createDocument();
        //將內(nèi)存中的document文件寫入硬盤中,形成一個(gè)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)新建對(duì)象


public static void main(String[] args) throws Exception {       
   
        //新創(chuàng)建對(duì)象,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é)點(diǎn)和其子節(jié)點(diǎn)
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對(duì)象,指向硬盤中的xml文件
        InputStream is = new FileInputStream(new File("E:/new.xml"));
        Document xmlDocument = saxReader.read(is);
        //獲取根節(jié)點(diǎn)
        Element rootElement = xmlDocument.getRootElement();
        //輸出根節(jié)點(diǎn)名字
        System.out.println(rootElement.getName());
        //獲取根節(jié)點(diǎn)下面的直接子節(jié)點(diǎn)個(gè)數(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、遍歷每個(gè)子節(jié)點(diǎn)屬性和標(biāo)簽中的內(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é)點(diǎn)的屬性和內(nèi)容
        //創(chuàng)建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        /*Document xmlDocument  = saxReader.read(new File("E:/new.xml"));*/
        //創(chuàng)建InputStream對(duì)象,指向硬盤中的XML文件
        InputStream is = new  FileInputStream(new File("E:/book.xml"));
        //通過(guò)字節(jié)流對(duì)象,加載硬盤中的XML文件到內(nèi)存中
        Document xmlDocument = saxReader.read(is);
        //獲取根節(jié)點(diǎn)
        Element rootElement = xmlDocument.getRootElement();
        //顯示根節(jié)點(diǎn)的名字
        System.out.println(rootElement.getName());
        //獲取根節(jié)點(diǎn)下面的直接子節(jié)點(diǎn)個(gè)數(shù)和名字
        List<Element> elementList = rootElement.elements("book");
        //子節(jié)點(diǎn)個(gè)數(shù)
        System.out.println(elementList.size());
        /*System.out.println(elementList.size());*/
        for(Element element : elementList){
            //分別輸出子節(jié)點(diǎn)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é)點(diǎn)的id屬性
            String id = element.attributeValue("id");
            System.out.println(id);
        }
                

    }

}


(四)將Document對(duì)象寫入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對(duì)象,指向硬盤中的xml文件
        InputStream is = new FileInputStream(new File("E:/book.xml"));
        Document xmlDocument = saxReader.read(is);  
        /*
         * 第一種方法
         * 
        //將DOUCMENT對(duì)象存放入硬盤中,形成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快速定位
若一個(gè)xml文檔里有著多層次標(biāo)簽的時(shí)候,想要定位到某個(gè)標(biāo)簽的內(nèi)容時(shí),使用dom4.j只能夠依次尋找從上到下,比較繁瑣。因此,使用XPATH
1、XPATH是啥?

XPATH是一門在xml文檔中查找信息的語(yǔ)言,可用來(lái)對(duì)其中的元素和屬性進(jìn)行遍歷,簡(jiǎn)化了dom4.j查找節(jié)點(diǎn)的過(guò)程

2、XPATH語(yǔ)法


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容