xml-dom4j解析

1. sax的解析原理:事件驅(qū)動

javax.xml.parse包里面

  • SAXparse
    此類實(shí)例可以從SAXParerFactory.newSAXParser()方法獲得
    parse(File f,DefaultHandle dh)//第一個(gè)參數(shù)xml路徑围来,第二個(gè)參數(shù)事件處理器
    SAXParserFactory//實(shí)例newInstance()方法得到
    schema解析原理

2. 使用jaxp的sax方式解析xml

sax方式不能實(shí)現(xiàn)增刪改的操作,只能做查詢的操作

  • 打印出整個(gè)文檔
    執(zhí)行parse方法,第一個(gè)參數(shù)xml路徑帘靡,第二個(gè)參數(shù)是事件處理器
    創(chuàng)建一個(gè)類拒秘,繼承時(shí)間處理的類渺杉,重寫里面的三個(gè)方法
  • 獲取到所有的name元素的值
    定義一個(gè)成員變量flag= false
    判斷開始方法是否是name元素双霍,如果是name元素砚偶,把flag的值設(shè)置成true
    如果flag的值是ture,在characters方法中打印內(nèi)容
    當(dāng)執(zhí)行到結(jié)束方法的的時(shí)候洒闸,把flag的值設(shè)置成false
  • **獲取第一個(gè)name元素的值
    定義一個(gè)成員變量idx=1
    在結(jié)束方法的時(shí)候蟹演,idx+1
    想要打印出第一個(gè)name元素的值,在characters方法里面判斷顷蟀,flag==true&&id==1,再打印內(nèi)容

3. 使用dom4j解析xml

dom4j骡技,是一個(gè)組織鸣个,針對xml解析,提供解析器dom4j
dom4j不是javase的一部分布朦,想要使用第一步應(yīng)該導(dǎo)入dom4j提供的jar包

  • 得到document
    SAXReader reader = new SAXReader();
    Document doucment = reader.red(url);
  • document 的父接口是Node如果在document中找不到想要的方法囤萤,在Node里面找
  • document里面的 getRootElement():獲取根節(jié)點(diǎn)返回的是Element
  • Element也是一個(gè)接口,父接口是Node
    Element和Node里面的方法
    getParent():獲取父節(jié)點(diǎn)
    addElement():添加標(biāo)簽

4. 使用dom4j查詢xml

<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
  <name>zhangsan</name>
  <age>20</age>
</p1>
<p1>
  <name>lisi</name>
  <age>30</age>
</p1>
</person>

查詢所有name元素里面的值

  1. 創(chuàng)建解析器
  2. 得到doucment
  3. 得到根節(jié)點(diǎn)getRootElement()
  4. 得到所有的p1元素
    element(qname)表示獲取標(biāo)簽下面的第一個(gè)子標(biāo)簽是趴。qname:標(biāo)簽的名稱
    elements(qname)表示標(biāo)簽下面是這個(gè)名稱的所有子標(biāo)簽(一層)
    elements():獲取標(biāo)簽下面的所有一層子標(biāo)簽
  5. 得到name
  6. 得到name里面的值

得到第二個(gè)name里面的值

  1. 創(chuàng)建解析器
    SAXReader saxReader = new SAXReader();
  2. 得到document
    Document document - saxReader.read("src/p1.xml");
  3. 得到根節(jié)點(diǎn)
    Element root = document.getRootElement();
  4. 得到所有的p1
    List<Element> list = root.elements("p1");
  5. 得到第二個(gè)p1list集合下標(biāo)cong0開始
    Element p2 = list.get(1);
  6. 得到p1下面的name
    Element name2 = p2.element("name");
  7. 得到name里面的值
    String s2 = name2.getText();
    System.out.println(s2);

5.在特定位置添加元素

在第一個(gè)p1下面的age標(biāo)簽之前添加<school>exit</school>
步驟:

  1. 創(chuàng)建解析器
  2. 得到document
  3. 得到根節(jié)點(diǎn)
  4. 獲取到第一個(gè)p1
  5. 獲取p1下面的所有元素element()方法返回的是list集合
    使用list里面的方法涛舍,在特定的位置添加元素
    首先創(chuàng)建元素,在元素下面創(chuàng)建文本
    使用DocumentHelper類方法createElement創(chuàng)建標(biāo)簽
    把文本添加到標(biāo)簽下面使用setText(“文本內(nèi)容”)方法
    list集合里面的add(int index,E element)
    的一個(gè)參數(shù)是 位置下標(biāo)唆途,從0開始第二個(gè)參數(shù)是要添加的元素
    6.回寫xml
package day6dom4jadd;

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 java.io.FileOutputStream;
import java.util.List;

public class add {
   public static void main(String[] args) throws Exception {
       add();
   }

   public static void add() throws Exception {
       //創(chuàng)建解析器
       SAXReader saxReader = new SAXReader();
       //得到document
       Document document = saxReader.read("src/day6dom4jadd/person.xml");
       //得到跟節(jié)點(diǎn)
       Element rootElement = document.getRootElement();
       //獲取第一個(gè)p1
       Element p1 = rootElement.element("p1");
       //獲取p1下面的所有的元素
       List<Element> elements = p1.elements();
       //創(chuàng)建元素使用
       Element school = DocumentHelper.createElement("school");
       //在school下創(chuàng)建文本
       school.setText("exit");
       //在特定位置添加
       elements.add(1, school);
       //回寫xml
       OutputFormat format = OutputFormat.createPrettyPrint();
       XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day6dom4jadd/person.xml"), format);
       xmlWriter.write(document);
       xmlWriter.close();
   }

}

實(shí)現(xiàn)封裝

package day6dom4jadd;

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileOutputStream;

public class Dom4jUtils {
    public static final String PATH = "src/day6dom4jadd/person.xml";
    public static Document getDocument(String path) {
        try{
            //創(chuàng)建解析器
            SAXReader reader = new SAXReader();
            //得到document
            Document document = reader.read(path);
            return document;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    //回寫方法
    public static  void xmlWriters(String path,Document document){
        try {
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),format);
            xmlWriter.write(document);
            xmlWriter.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
package day6dom4jadd;

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 java.io.FileOutputStream;
import java.util.List;
public class add {
    public static void main(String[] args) throws Exception {
        add();
    }

    public static void add() throws Exception {
        //創(chuàng)建解析器
       // SAXReader saxReader = new SAXReader();
        //得到document
//        Document document = saxReader.read("src/day6dom4jadd/person.xml");
        //方法的封裝
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到跟節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //獲取第一個(gè)p1
        Element p1 = rootElement.element("p1");
        //獲取p1下面的所有的元素
        List<Element> elements = p1.elements();
        //創(chuàng)建元素使用
        Element school = DocumentHelper.createElement("school");
        //在school下創(chuàng)建文本
        school.setText("exat");
        //在特定位置添加
        elements.add(1, school);
        //回寫xml
       /* OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day6dom4jadd/person.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();*/
       //回寫方法的封裝
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH,document);
    }

}

把document的操作和回寫xml進(jìn)行封裝方法
也可以吧傳遞的文件路徑富雅,封裝給一個(gè)常量
好處:可以提高代碼的開發(fā)速度,可以提高代碼的可維護(hù)性


6.使用dom4j實(shí)現(xiàn)與元素的修改

修改第一個(gè)p1下面的age元素的值<age>300</age>

public static void modifyAge()throws Exception{
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到第一個(gè)根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到p1
        Element p1 = rootElement.element("p1");
        //得到p1下面的age
        Element age = p1.element("age");
        //修改age的值
        age.setText("300");
        //回寫xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH,document);
    }

7. 使用dom4j實(shí)現(xiàn)與元素的刪除

//刪除節(jié)點(diǎn)
    public static void del(){
        //得到document
         Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到p1元素
        Element p1 = rootElement.element("p1");
        //得到p1下面的school標(biāo)簽
        Element school = p1.element("school");
        //刪除shcool肛搬,通過父節(jié)點(diǎn)刪除没佑,獲得父節(jié)點(diǎn)的方法:sch.getParent();//獲得school的父節(jié)點(diǎn)p1
        p1.remove(school);
        //回寫xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH,document);
    }

8.使用dom4j獲取屬性值的方法

查看第一個(gè)p1里面的屬性值

//查看屬性的值
    public static void getValues() throws Exception {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到p1元素
        Element p1 = rootElement.element("p1");
        String id1 = p1.attributeValue("id1");
        System.out.println(id1);
    }

attributeValue()獲取屬性的值


9.使用dom4j支持xpath

可以直接獲取某個(gè)元素

  • 形式:
    /AAA/DDD/BBB:表示一層一層的,AAA下面的DDD下面的BBB
    //BBB 表示和這個(gè)名稱相同的都得到
    /*:所有元素
    BBB[1]:表示第一個(gè)BBB元素
    BBB[last()]:表示最后一個(gè)BBB元素
    //BBB[@id]:表示BBB元素上有id屬性都可以得到

  • 在dom4j中提供了兩個(gè)方法温赔,用來支持xpath
    selectNodes("xpath表達(dá)式")獲得多個(gè)節(jié)點(diǎn)
    selectSingleNode("xpath表達(dá)式")后的一個(gè)節(jié)點(diǎn)

使用xpath實(shí)現(xiàn):查詢xml中所有name元素的值

  1. 得到document
  2. 直接使用selectNodes("http://name")方法得到所有的name元素
package day6xpath;

import day6dom4jadd.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;

import java.util.List;

public class xpath {
    public static void main(String[] args) {
        test();
    }

    public static void test() {
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        List<Node> list = document.selectNodes("http://name");
        for (Node node : list) {
            //node是每個(gè)name元素
            //得到name元素里面的值
            String s = node.getText();
            System.out.println(s);
        }
    }
}
  • 使用xpath實(shí)現(xiàn):獲取第一個(gè)p1下面的name的值
package day6xpath;

import day6dom4jadd.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;

public class xpath2 {
    public static void main(String[] args) throws Exception {
        //使用xpath實(shí)現(xiàn):獲取第一個(gè)p1下面的name的值
        test2();
    }
    public static void test2()throws Exception{
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //直接使用selectSingleNode方法
        Node name1 = document.selectSingleNode("http://p1[@id1='aaa']/name");
        //得到name里面的值
        String s1 = name1.getText();
        System.out.println(s1);

    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤奢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啤贩,老刑警劉巖待秃,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痹屹,居然都是意外死亡章郁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門痢掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱犹,“玉大人,你說我怎么就攤上這事足画⌒劬裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵淹辞,是天一觀的道長医舆。 經(jīng)常有香客問我,道長象缀,這世上最難降的妖魔是什么蔬将? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮央星,結(jié)果婚禮上霞怀,老公的妹妹穿的比我還像新娘。我一直安慰自己莉给,他們只是感情好毙石,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颓遏,像睡著了一般徐矩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叁幢,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天滤灯,我揣著相機(jī)與錄音,去河邊找鬼曼玩。 笑死鳞骤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黍判。 我是一名探鬼主播弟孟,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼样悟!你這毒婦竟也來了拂募?” 一聲冷哼從身側(cè)響起庭猩,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陈症,沒想到半個(gè)月后蔼水,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡录肯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年趴腋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论咏。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡优炬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厅贪,到底是詐尸還是另有隱情蠢护,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布养涮,位于F島的核電站葵硕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贯吓。R本人自食惡果不足惜懈凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悄谐。 院中可真熱鬧介评,春花似錦、人聲如沸爬舰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼专。三九已至,卻和暖如春孵构,著一層夾襖步出監(jiān)牢的瞬間屁商,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工颈墅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜡镶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓恤筛,卻偏偏與公主長得像官还,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子毒坛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • 1. XML總結(jié) 1.1. XML簡介 XML : 可擴(kuò)展的標(biāo)記語言望伦。(和HTML非常類似的) 可擴(kuò)展的林说。 自定義...
    Ethan_Walker閱讀 3,027評論 0 12
  • day5 一、表單提交方式 1.使用submit提交 2.使用button提交表單 3.使用超鏈接提交 4.onc...
    mwj610閱讀 410評論 0 0
  • 1.schema 約束 1.dtd 語法: 2.schema符合 xml 的語法屯伞,xml 語句3.一個(gè) xml 中...
    定格r閱讀 369評論 0 0
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,126評論 0 21
  • 隔世低吟你的詩 文/蒼穹殘?jiān)?夢里的純白色 開在了琥珀般的月牙上 我駕著前往金陵的彩云 客棧的酒旗隨風(fēng)輕搖 我們在...
    蒼穹殘?jiān)?/span>閱讀 130評論 0 0