DOM的文檔驅動
處理DOM的時候,我們需要讀入整個的XML文檔,然後在內存中創建DOM樹,生成 DOM樹上的每個Node對象
優點是:可以對XML文檔進行增刪改查的複雜操作,可以隨時按照節點間的關係訪問數據
缺點:
受內存容量限制,不能處理大的文檔,由於沒有索引機制,處理效率較低
DOM(文檔對象模型),爲XML文檔的解析定義了一組接口,解析器讀入整個文檔,然後構造一個駐留內存的樹結構,然後代碼就可以使用DOM接口來 操組整個樹結構,其他點如下:
優點:整個文檔樹都在內存當中,便於操作;支持刪除、修改、重新排列等多功能。
缺點:將整個文檔調入內存(經常包含大量無用的節點),浪費時間和空間。
使用場合:一旦解析了文檔還需要多次訪問這些數據,而且資源比較充足(如內存、CPU等)。
爲了解決DOM解析XML引起的這些問題,出現了SAX。SAX解析XML文檔爲事件驅動
package com.huang;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//測試DOM在XML文件上的CURD操作
//在XML中換行和標籤中的內容在遍歷過程中若不加判斷則會輸出#text
public class DOM {
public static void main(String[] args) {
//獲取抽象類的實例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse("./src/data.xml");
//遍歷XML表中的內容
list(document);
//查詢XML表中第一個Student的姓名
//find(document);
//在XML表中插入一個學生的信息
//add(document);
//在XML表中修改屬性和元素值
//update(document);
//在XML表中刪除一個學生或者屬性
//del(document);
}catch(Exception e){
e.printStackTrace();
}
}
// 遍歷xml中所有元素
// 在XML中換行和標籤中的內容在遍歷過程中若不加判斷則會輸出#text
public static void list(Node node) {
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList nodelist = node.getChildNodes();
for (int t = 0; t < nodelist.getLength(); ++t) {
Node n = nodelist.item(t);
list(n);
}
return;
}
//在XML表中刪除一個學生或者屬性
public static void del(Document document) throws TransformerException{
Element node = (Element)document.getElementsByTagName("student").item(0);
//移除屬性
node.removeAttribute("id");
//移除元素
Element name = (Element) node.getElementsByTagName("name").item(0);
node.removeChild(name);
//獲得父親結點
//Node parentnode = node.getParentNode();
//parentnode.removeChild(node);
//寫入文件XML中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
}
//在XML表中修改一個學生的信息
public static void update(Document document){
try{
Element stuName = (Element) document.getElementsByTagName("name").item(0);
stuName.setTextContent("zhang");
stuName.setAttribute("小名", "zhangsan");
//寫入文件XML中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
}catch(Exception e){
e.printStackTrace();
}
}
//在XML表中插入一個學生的信息
public static void add(Document document){
try{
Element stu = document.createElement("student");
//添加屬性
stu.setAttribute("學生稱號", "tiger");
Element name = document.createElement("name");
name.setTextContent("Ben");
Element studentid = document.createElement("studentid");
studentid.setTextContent("123321");
Element sex = document.createElement("sex");
sex.setTextContent("男");
stu.appendChild(name);
stu.appendChild(studentid);
stu.appendChild(sex);
//在根節點後面添加元素
document.getDocumentElement().appendChild(stu);
//寫入文件XML中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
}catch(Exception e){
e.printStackTrace();
}
}
//查詢XML表中第一個student的姓名
public static void find(Document document){
NodeList nodelist = document.getElementsByTagName("student");
//類型強制轉換轉換成子類Element類型
Element stu = (Element)nodelist.item(0);
//獲得屬性值
System.out.println("id : "+ stu.getAttribute("id"));
NodeList name = stu.getElementsByTagName("name");
Element firstname = (Element)name.item(0);
//獲得元素值
System.out.println("name : " + firstname.getTextContent());
}
}
運行結果: