使用dom解析

什麼是DOM和SAX ?
DOM Document Object Model —– 文檔對象模型
DOM思想: 將整個xml 加載內存中,形成文檔對象,所有對xml操作都對內存中文檔對象進行
DOM 是官方xml解析標準
使用xml 存儲和傳輸數據
1、通過程序生成xml
2、讀取xml 中數據 —- xml 解析

1、創建 xml 文檔 books.xml
在企業實際開發中,爲了簡化xml 生成和解析 —- xml 數據文件通常不使用約束的
2、使用DOM解析xml 將整個xml文檔加載到內存中 : 工廠 — 解析器 — 解析加載
3、Document通過 getElementsByTagName 獲得 節點集合 NodeList
通過 NodeList 提供 getLength 和 item 遍歷 節點集合

DOM 編程思路小結
1,decumentBuliderFactory decumentbuilderfactory=decumentBuliderFactory.newinstance();
2.Document document=decumentbuilderfactory.parse();//裝載XML文檔 —- Document
3.Document 獲得指定元素 —– getElementsByTagName (返回 NodeList)
Nodelist nodelist=document.getElementsByTagName(“標籤名”)
4、遍歷NodeList 獲得 每個 Node
5、將每個Node 強制轉換 Element
5、通過元素節點API 操作屬性和文本內容
getAttribute 獲得屬性值
getTextContent 獲得元素內部文本內容

首先我們必須創建xml文檔,在這裏,我們先創建了一個value的文件夾,然後在裏面創建了Newfile.xml文檔
其次創建java代碼,
xml文檔內容如下

<?xml version="1.0" encoding="UTF-8"?>

<books>
  <book>
        <name> 高效java </name>
        <pirce>50 </pirce>
    </book>
    <book>
        <name>  java編程思想  </name>
            <pirce> 80  </pirce>
    </book>

</books>

//java代碼如下

package com.effective_java;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Model5 {

    public static void main(String[] args) {
        // TODO 自動生成的方法存根

        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();//定義工廠api使應用程序能夠從 XML 文檔獲取生成 DOM 對象樹的解析器。 
        try {
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            //使用當前配置的參數創建一個新的 DocumentBuilder 實例。
            Document document = documentBuilder.parse("value\\NewFile.xml");
        //定義 API, 使其從 XML 文檔獲取 DOM 文檔實例。使用此類,應用程序員可以從 XML 獲取一個 Document。
        //在這裏,我們通過url創建
        NodeList nodelist = document.getElementsByTagName("name");
//按文檔順序返回包含在文檔中且具有給定標記名稱的所有 Element 的 NodeList。
            for (int i = 0; i < nodelist.getLength(); i++) {//對nodellist進行遍歷
                Node node = nodelist.item(i);// 返回集合中的每一個項
               Element element=(Element)node;//將node強轉爲element對象
               element.gettextcontent();//獲得標籤內容

            }
                        // 下面我們查找java編程基礎的價格
            nodelist = document.getElementsByTagName("book");
            for (int i = 0; i < nodelist.getLength(); i++) {
                Element element = (Element) nodelist.item(i);
                System.out.println(element.getTextContent());
                if (element.getTextContent().equals("java編程思想")) {
                    // 說明我們找到了這本書,在xml中我們發現價格是book的第四個節點(回車換行也是子節點)
                    element = (Element) nodelist.item(3);
                    System.out.println(element.getTextContent());
                }
                  /*
           * 這裏面我們使用最常見的api就是 getElementsByTagName();通過節點的名稱,我們可以
           * 獲得一個節點的nodelist,這個nodelist是一個節點的集合
           * 通過getItem我們就可以得到具體的NOde對象
           * 
           *爲了我更好的理解,我們將xml改寫如下
           */

/*
* <books>
  <book>
        <name> 高效java </name>
        <pirce>50 </pirce>
    </book>
    <book>
        <name>  java編程思想  </name>
            <pirce> 80  </pirce>
    </book>
    <book>
    <name type="計算機">深入瞭解java虛擬機</name>
      <price>60</price>
      <author>
      <name>周志明</name>
      <address>母雞</address>    
      </author>
    </book>
</books>
             */


 //獲得java虛擬機的作者的名字
           /*
            * 分析:是name節點的子節點的孩子節點
            */
            Node node;
            NodeList child;
            Node Node1;
            //NodeList nodelist3;
            NodeList nodeList2=document.getElementsByTagName("name");
     for(int i=0;i<nodeList2.getLength();i++){
           node=nodeList2.item(i);
           if(node.getTextContent().equals("深入瞭解java虛擬機")){
               System.out.println("正確");

                Node1= node.getNextSibling().getNextSibling().getNextSibling().getNextSibling();

                child=Node1.getChildNodes();

                for(i=0;i<child.getLength();i++){
                    node=child.item(i);
                    if(node.getNodeName().equals("name")){
                        System.out.println(node.getTextContent());
                    }
                }          
           }
     }

       System.out.println(document.getAttributes());//屬性
       System.out.println(document.getBaseURI());//xml文件的地址
       System.out.println(document.getNodeName());//節點名稱
       //Element和Node節點相同
       //node=(Element)child.item(0);
       //document.getDocumentElement();可以直接獲得文檔元素的子節點
       System.out.println(document.getDocumentElement().getNodeName());


        } catch (Exception e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
    }
}

**
//首先我們說明一下這幾個類,
/*
DocumentBuilderFactory
定義工廠 API,使應用程序能夠從 XML 文檔獲取生成 DOM 對象樹的解析器。
通過工廠我們可以拿到
DocuemtnBuilder實例
對於DocumentBuilder類,我們來看一下簡介:
定義 API, 使其從 XML 文檔獲取 DOM 文檔實例。使用此類,應用程序員可以從 XML 獲取一個 Document。
此類的實例可以從 DocumentBuilderFactory.newDocumentBuilder() 方法獲取。獲取此類的實例之後,
將可以從各種輸入源解析 XML。這些輸入源有 InputStreams、Files、URL 和 SAX InputSources。
注意,此類重用了 SAX API 中的一些類。這並不要求底層 DOM 實現的實現者使用 SAX 解析器將 XML 文檔解析爲 Document。
它僅要求該實現使用這些現有的 API 與應用程序交流。
DocumentBuilder獲得Document對象有五種方式
當然我們在使用解析式是對文件解析,所以使用 Document parse(File f);

重點我們去看看Document類
文檔的解釋如下
Document 接口表示整個 HTML 或 XML 文檔。從概念上講,它是文檔樹的根,並提供對文檔數據的基本訪問。
因爲元素、文本節點、註釋、處理指令等不能存在於 Document 的上下文之外,所以 Document 接口還包含所需的創建這些對象的工廠方法。所創建的 Node 對象具有 ownerDocument 屬性,該屬性將 Node 對象與創建這些對象時的上下文所屬的 Document 關聯起來。
從這裏我們可以看出Document提供了對html和xml文件節點的訪問,同時提供了大量的api支持我們的操作
這就是最簡單的實現方式
當時希望大家注意解析的方式是可以解析換行的,默認換行也是一個節點
在這裏我們重點關注一下Node類和NodeLisst類的幾個方法
NOde的幾個重要的方法
getFirstChild() 此節點的第一個子節點。
getLastChild() 獲得最後一個子節點
getAttributes() 獲得節點屬性
getChildNodes() 獲得孩子節點返回Nodelist
getNextSibling() 獲得下一個節點
getNodeValue() 獲得節點的值
等等都能幫助我們查找指定的xml屬性或節點
具體的自己大家查看api

    再來看看Nodelist類中常見的方法
getLength()   列表中的節點數。 
item(int index)  返回節點
    就兩個api,這個就不用說明了

 */

**

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章