什麼是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,這個就不用說明了
*/
**