XML解析——DOM方式

  • XML解析方式
    DOM:(Document Object Model)文檔對象模型瑟蜈。
    SAX:(Simple API for XML)這種方式屬于開源社區(qū)XML-DEV畸裳,幾乎所有的XML解析器都支持它
  • XML解析開發(fā)包
    JAXP:(Java API for XML Processing)SUN公司的解析標準實現(xiàn)
    Dom4J和JDom:是開源組織的解析開發(fā)包
  • JAXP JavaSE的一部分昏滴,它由以下幾個包及其子包組成:
    org.w3c.dom:提供DOM方式解析XML的標準接口
    org.xml.sax:提供SAX方式解析XML的標準接口
    javax.xml:提供解析XML文檔的類
    javax.xml.parsers:定義了工廠類秃嗜,通過調用這些工廠類惑申,獲取解析XML文檔的解析器對象DocumentBuilderFactory和SAXParserFactory
    </br>
    DocumentBuilderFactory是一個抽象工廠類岩睁,不能直接實例化,用于創(chuàng)建DOM模式的解析器對象 燥狰,調用其newInstance方法 棘脐,會自動創(chuàng)建工廠對象
    DOM解析.png
DOM解析原理(document object model)

DOM解析器在解析XML文檔時,會把文檔中的所有元素龙致,按照其出現(xiàn)的層次關系蛀缝,解析成一個個Node對象(節(jié)點) ,節(jié)點之間關系可以用DOM樹描述

DOM樹.png

Node對象
  • 節(jié)點類型:父節(jié)點(parent) 子節(jié)點(children) 兄弟節(jié)點(sibling) 節(jié)點后代(descendant) 節(jié)點的祖先(ancestor)
  • Node對象提供了一系列常量來代表結點的類型
    當獲得某個Node類型后目代,就可以把Node節(jié)點轉換成相應的節(jié)點對象(Node的子類對象)屈梁,以便于調用其特有的方法
  • Node對象提供了相應的方法去獲得它的父結點或子結點
    通過這些方法就可以讀取整個XML文檔的內容像啼、或添加、修改潭苞、刪除XML文檔的內容了

DOM解析流程

獲取DOM解析器

調用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠
調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象
調用 DOM 解析器對象的 parse() 方法解析 XML 文檔忽冻,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了

獲取文檔各節(jié)點內容或屬性

得到某個具體的節(jié)點內容
打印某節(jié)點的所有元素節(jié)點
修改某個元素節(jié)點的主體內容
向指定元素節(jié)點中增加子元素節(jié)點
向指定元素節(jié)點上增加同級元素節(jié)點
刪除指定元素節(jié)點
操作XML文件屬性

更新XML文檔

通過TransformerFactory獲得的Transformer類可以把代表XML文件的Document對象轉換為某種格式后進行輸出此疹,也可以把Document對象又重新寫入到一個XML文件中
通過transform方法完成轉換操作僧诚,該方法接收一個源和一個目的地
通過javax.xml.transform.dom.DOMSource類來關聯(lián)要轉換的document對象
用javax.xml.transform.stream.StreamResult 對象來表示數(shù)據(jù)的目的地

//jaxp dom解析的標準寫回流程
//
TransformerFactory tsf =TransformerFactory.newInstance();
Transformer tsTransformer = tsf.newTransformer();
tsTransformer.transform(new DOMSource(document), new StreamResult("src/books.xml"));

DOM編程測試

xml文檔代碼:
<?xml version="1.0" encoding="utf-8"?>
<書架>
    <書>
        <書名>浪潮之巔</書名>
        <作者>吳軍</作者>
        <售價>50</售價>
        <個人信息><age>50</age></個人信息>
    </書>
    <書>
        <書名>數(shù)學之美</書名>
        <作者 title='ADS'>陸奇</作者>
        <售價>29</售價>
        <個人信息><age>40</age></個人信息>
    </書>
</書架>

DOM解析代碼:

//為方便查看結構遮婶,聲明異常throws Exception
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class MyParser2
{
    public static void main(String[] args) throws Exception
    {
        //定義集合用于接收BOOk類
        ArrayList<Book> booklist = new ArrayList<>();
        // 獲取 DocumentBuilderFactory的實例
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //獲取DOM模式的解析器對象
        DocumentBuilder parser = dbf.newDocumentBuilder();
        //輸入流讀取xml文檔
        Document document = parser.parse(new FileInputStream(new File("src/book.xml")));
        //獲取document對象中的"書"元素節(jié)點
        NodeList booknodelist = document.getElementsByTagName("書");
        //遍歷節(jié)點的子元素及其屬性
        
        for (int i = 0; i < booknodelist.getLength(); i++)
        {//Element接口用于獲取元素節(jié)點的屬性
            Element bookitem = (Element) booknodelist.item(i);
        //創(chuàng)建Book對象用于設置Book類成員及其屬性
            Book book = new Book();
        //書名 作者 售價 age title
        //獲取書的子元素節(jié)點
            NodeList childNodes = bookitem.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++)
            {//遍歷子元素
                if (childNodes.item(j).getNodeType() == 1)
                {//如果子元素節(jié)點類型為文本節(jié)點,繼續(xù)判斷其有沒有子節(jié)點
                    Element child = (Element) childNodes.item(j);
                    //獲取節(jié)點名稱
                    switch (child.getNodeName())
                    {
                        case "書名"://將獲取到的xml書名標簽內容存入book對象的Name屬性中
                            book.setName(child.getTextContent());
                            break;
                        case "作者":
                            book.setAuthor(child.getTextContent());
                            book.setTitle(child.getAttribute("title"));
                            break;
                        case "售價":
                            book.setPrice(child.getTextContent());
                            break;
                        case "個人信息":
                            //個人信息節(jié)點還有子節(jié)點,獲取子節(jié)點標簽內的文本內容(字符串)
                            //存入book類的age屬性中
                            int age = Integer.parseInt(child.getFirstChild().getTextContent());
                            book.setAge(age);
                            break;
                        default:
                            break;
                    }
                }
            }
            //遍歷完成后 將book對象加入到集合中
            booklist.add(book);
        }
        //輸出集合
        System.out.println(booklist);
    }   
}

BOOK類代碼:

public class Book
{// 設置和獲取book類的成員屬性及方法
    String name;
    String author;
    String price;
    int age;
    String title;

    public Book(String name, String author, String price, int age, String title)
    {
        super();
        this.name = name;
        this.author = author;
        this.price = price;
        this.age = age;
        this.title = title;
    }
    public Book()
    {
        super();
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getAuthor()
    {
        return author;
    }
    public void setAuthor(String author)
    {
        this.author = author;
    }
    public String getPrice()
    {
        return price;
    }
    public void setPrice(String price)
    {
        this.price = price;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }

    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }
    @Override
    public String toString()
    {
        return "Book [name=" + name + ", author=" + author + ", price=" + price
                + ", age=" + age + ", title=" + title + "]";
    }

}

控制臺解析文檔后打印集合

[Book [name=浪潮之巔, author=吳軍, price=50, age=50, title=], Book [name=數(shù)學之美, author=陸奇, price=29, age=50, title=ADS]]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市湖笨,隨后出現(xiàn)的幾起案子旗扑,更是在濱河造成了極大的恐慌,老刑警劉巖慈省,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臀防,死亡現(xiàn)場離奇詭異,居然都是意外死亡边败,警方通過查閱死者的電腦和手機袱衷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笑窜,“玉大人致燥,你說我怎么就攤上這事∨沤兀” “怎么了嫌蚤?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長断傲。 經常有香客問我脱吱,道長,這世上最難降的妖魔是什么艳悔? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任急凰,我火速辦了婚禮,結果婚禮上猜年,老公的妹妹穿的比我還像新娘抡锈。我一直安慰自己,他們只是感情好乔外,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布床三。 她就那樣靜靜地躺著,像睡著了一般杨幼。 火紅的嫁衣襯著肌膚如雪撇簿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天差购,我揣著相機與錄音四瘫,去河邊找鬼。 笑死欲逃,一個胖子當著我的面吹牛找蜜,可吹牛的內容都是我干的。 我是一名探鬼主播稳析,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洗做,長吁一口氣:“原來是場噩夢啊……” “哼弓叛!你這毒婦竟也來了?” 一聲冷哼從身側響起诚纸,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撰筷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畦徘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毕籽,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年旧烧,在試婚紗的時候發(fā)現(xiàn)自己被綠了影钉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掘剪,死狀恐怖平委,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情夺谁,我是刑警寧澤廉赔,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站匾鸥,受9級特大地震影響蜡塌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜勿负,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一馏艾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奴愉,春花似錦琅摩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至檀头,卻和暖如春轰异,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暑始。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工搭独, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廊镜。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓牙肝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惊奇,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • xml解析工具: Sun官方jaxp工具imjdom工具dom4j工具:三大框架讀取xml文件的程序颂郎。(非官方的,...
    小小機器人閱讀 456評論 0 0
  • 之前通過深入學習DOM的相關知識容为,看了慕課網DOM探索之基礎詳解篇這個視頻(在最近看第三遍的時候乓序,準備記錄一點東西...
    微醺歲月閱讀 4,481評論 2 62
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法坎背,內部類的語法替劈,繼承相關的語法,異常的語法得滤,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 南麂島 因外形似一只奔跑的山麂而得名陨献,別名海山,古代又寫作“南己山”懂更,其位于浙江省平陽縣鰲江口外30海里的東海海面...
    一吱瓜閱讀 571評論 0 0
  • 第一次看到金剛狼眨业,是在十年之前,高考之后沮协,網吧包夜龄捡,窺了隔壁好友的屏,剛好看到了他正在看的電影《X戰(zhàn)警:2》慷暂。那時...
    喜歌raki閱讀 350評論 0 1