這篇文章將為大家詳細講解有關XML解析中DOM的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
主要從事網頁設計、PC網站建設(電腦版網站建設)、wap網站建設(手機版網站建設)、響應式網站開發(fā)、程序開發(fā)、微網站、小程序定制開發(fā)等,憑借多年來在互聯(lián)網的打拼,我們在互聯(lián)網網站建設行業(yè)積累了豐富的成都網站制作、成都做網站、外貿營銷網站建設、網絡營銷經驗,集策劃、開發(fā)、設計、營銷、管理等多方位專業(yè)化運作于一體,具備承接不同規(guī)模與類型的建設項目的能力。
1.XML解析分為:dom解析和sax解析
dom:(Document Object Model,即文檔對象模型),是W3C組織推薦的處理XML的一種方式
sax:(Simple API for XML),不是官方標準,但它是XML社區(qū)事實上的標準,幾乎所有的XML解析器都支持它
SAX解析采用事件驅動模型邊讀邊解析:從上到下一行一行解析,解析到某一元素,調用相應的解析方法。
DOM根據(jù)XML層級結構在內存中分配一個樹形結構,把XML的標簽,屬性和文本等元素都封裝成樹的節(jié)點對象。
不同的公司和組織提供了針對DOM和SAX兩種方式的解析器:
Sun的JAXP
Dom4j組織的dom4j(最常用,例如hibernate)
JDom組織的jdom
其中的JASP是J2SE的一部分,它分別針對DOM和SAX提供了DOM和SAX解析器。
在這里也主要介紹三種解析:dom、sax和dom4j
Sun公司提供了Java API for XML Parsing(JAXP)接口來使用SAX和DOM,通過JAXP,我們可以使用任何與JAXP兼容的XML解析器。
JAXP開發(fā)包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包組成
在javax.xml.parsers包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的DOM或SAX的解析器對象。
首先說明JAXP解析XML的DOM對象的原理,XML DOM把XML文檔視為一顆節(jié)點樹(node-tree),樹中的所有節(jié)點彼此之間都有關系。可通過這棵樹訪問所有的節(jié)點。可以修改或者刪除它們的內容,也可以創(chuàng)建新的元素。
比如,現(xiàn)在的XML文檔如下(該例子來自w3cschool在線教程):
<bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book></bookstore>
這棵樹從根節(jié)點開始,在樹的最低層級向文本節(jié)點長出枝條:

【要知道的幾個知識點】:
1.dom會把xml文件看做一棵樹,并加載到內存
2.dom特別適合做crud操作
3.dom不太適合去操作比較大的xml文件(占用內存)
4.dom會把xml文件中每一個元素、屬性、文本都映射成對應的Node對象。
1.調用DocumentBuilderFactory.newInstance()方法得到創(chuàng)建DOM解析器的工廠
2.調用工廠對象的newDocumentBuilder方法得到DOM解析器對象
3.調用DOM解析器對象的parse()方法解析XML文檔,得到代表整個文檔的Document對象,進行可以利用DOM特性對整個XML文檔進行操作了。
XML文檔如下:
<?xml version="1.0" encoding="utf-8"?><班級> <學生 地址="香港"> <名字>周小星</名字> <年齡>23</年齡> <介紹>學習刻苦</介紹> </學生> <學生 地址="澳門"> <名字>林曉</名字> <年齡>25</年齡> <介紹>是一個好學生</介紹> </學生> </班級>
首先使用2.2中介紹了三個步驟得到代表整個文檔的document對象,并調用我們所寫的read(Document document)方法,如下:
// 1.創(chuàng)建一個DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.通過工廠實例得到DocumentBuilder對象DocumentBuilder builder = factory.newDocumentBuilder();
// 3.指定要解析的xml文件,返回document對象Document document = builder.parse(new File("src/myClass.xml"));
read(document);其中的read方法是這么寫的:
/**
* 顯示所有學生的所有信息
* @param document
*/public static void read(Document document){ // 通過學生這個標簽名字得到NodeList
NodeList nodeList = document.getElementsByTagName("學生");
for(int i=0;i<nodeList.getLength();i++){ // 因為Element是Node的子接口,所有這里可以轉換成Element
// 從而可以使用更多的方法
Element student = (Element)nodeList.item(i); // 獲取屬性
String address = student.getAttribute("地址");
System.out.println(address); // 得到學生的所有子節(jié)點,并循環(huán)輸出
NodeList childList = student.getChildNodes(); for(int j=0;j<childList.getLength();j++){
Node node = childList.item(j); if(node.getNodeType() == Node.ELEMENT_NODE)
System.out.println(node.getNodeName()+":"+node.getTextContent());
}
System.out.println("-------------");
} // 這樣一層一層向下查詢也可以
//Element name = (Element)student.getElementsByTagName("名字").item(0);
//System.out.println(name.getTextContent()); }最后的運行結果如下所示:

利用DOM更新XML文檔一定要使用Transformer類將更改寫入文件,否則只是更改了在內存中的XML文檔對象。
javax.xml.transform包中的Transformer類用于把代表XML文件的Document對象轉換為某種格式后進行輸出,例如把xml文件應用樣式表后轉成一個html文檔。利用這個對象,當然也可以把Document對象又重新寫回到一個XML文件中
Transformer類通過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以通過:
javax.xml.transform.dom.DOMSource類來關聯(lián)要轉換的document對象
用javax.xml.transform.stream.StreamResult對象來表示數(shù)據(jù)的目的地
Transformer對象通過TransformerFactory獲得
【1】添加元素
我們可以向上述XML中添加一個學生子節(jié)點,如下:
/**
* 添加學生
*
* @param document
* @throws Exception
*/public static void add(Document document) throws Exception { // 創(chuàng)建一個新的學生節(jié)點
Element newStudent = document.createElement("學生"); // 給新的學生添加地址屬性
newStudent.setAttribute("地址", "舊金山"); // 創(chuàng)建學生的子節(jié)點
Element newStudent_name = document.createElement("名字");
newStudent_name.setTextContent("小明");
Element newStudent_age = document.createElement("年齡");
newStudent_age.setTextContent("25");
Element newStudent_intro = document.createElement("介紹");
newStudent_intro.setTextContent("這是一個好孩子"); // 將子節(jié)點添加到學生節(jié)點上
newStudent.appendChild(newStudent_name);
newStudent.appendChild(newStudent_age);
newStudent.appendChild(newStudent_intro); // 把新的學生節(jié)點添加到根節(jié)點下
document.getDocumentElement().appendChild(newStudent); // 更新XML文檔
// 得到TransformerFactory
TransformerFactory tff = TransformerFactory.newInstance(); // 通過TransformerFactory得到一個轉換器
Transformer tf = tff.newTransformer(); // 更新當前的XML文件
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}【2】刪除元素
同樣的,我們也可以刪除一個學生節(jié)點,如下:
/**
* 刪除第一個學生節(jié)點
*
* @param document
*/public static void delete(Document document) throws Exception { // 首先找到這個學生,這里可以不用轉為Element
Node student = document.getElementsByTagName("學生").item(0); // 通過它的父節(jié)點來刪除
student.getParentNode().removeChild(student); // 更新這個文檔
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}【3】更改元素的值
比如,我們也可以將第一個學生的名字改為松江,如下:
/**
* 把第一個學生的元素名字改為宋江
*
* @param document
*/public static void update_name(Document document) throws Exception{
Element student = (Element) document.getElementsByTagName("學生").item(0);
Element name = (Element) student.getElementsByTagName("名字").item(0);
name.setTextContent("宋江"); // 更新這個文檔
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}【4】更改或刪除元素的屬性
/**
* 刪除第一個學生節(jié)點的屬性
*
* @param document
*/public static void delete_attribute(Document document) throws Exception { // 首先找到這個學生
Element student = (Element) document.getElementsByTagName("學生").item(0); // 刪除student的地址屬性
student.removeAttribute("地址"); // 更新屬性
// student.setAttribute("地址", "新地址");
// 更新這個文檔
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}上述列舉了幾個更新元素(節(jié)點)的例子,更一般的需求是這樣的:將名字是周小星的同學的年齡改為30,這時候我們需要去遍歷XML文檔,找到對應的節(jié)點,再進行修改。
另外,所有關于更新的方法中都用到了TransformerFactory來進行實際的更新,所以,我們可以把這三句話寫成一個函數(shù),從而避免代碼冗余,如下:
public static void update(Document document, String path) throws Exception {
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File(path)));
}XML編程,就是對XML文件進行crud操作。
那么為什么要用java或者C/C++對XML進行crud操作呢?
1.XML作為數(shù)據(jù)傳遞需要解析
2.XML作為配置文件需要讀取
3.XML作為小型數(shù)據(jù)庫,需要進行crud操作
w3C組織為了大家解析XML方便,定義了一套規(guī)范(API)
1.XML解析分為:dom解析和sax解析
dom:(Document Object Model,即文檔對象模型),是W3C組織推薦的處理XML的一種方式
sax:(Simple API for XML),不是官方標準,但它是XML社區(qū)事實上的標準,幾乎所有的XML解析器都支持它
SAX解析采用事件驅動模型邊讀邊解析:從上到下一行一行解析,解析到某一元素,調用相應的解析方法。
DOM根據(jù)XML層級結構在內存中分配一個樹形結構,把XML的標簽,屬性和文本等元素都封裝成樹的節(jié)點對象。
不同的公司和組織提供了針對DOM和SAX兩種方式的解析器:
Sun的JAXP
Dom4j組織的dom4j(最常用,例如hibernate)
JDom組織的jdom
其中的JASP是J2SE的一部分,它分別針對DOM和SAX提供了DOM和SAX解析器。
在這里也主要介紹三種解析:dom、sax和dom4j
Sun公司提供了Java API for XML Parsing(JAXP)接口來使用SAX和DOM,通過JAXP,我們可以使用任何與JAXP兼容的XML解析器。
JAXP開發(fā)包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包組成
在javax.xml.parsers包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的DOM或SAX的解析器對象。
首先說明JAXP解析XML的DOM對象的原理,XML DOM把XML文檔視為一顆節(jié)點樹(node-tree),樹中的所有節(jié)點彼此之間都有關系。可通過這棵樹訪問所有的節(jié)點。可以修改或者刪除它們的內容,也可以創(chuàng)建新的元素。
比如,現(xiàn)在的XML文檔如下(該例子來自w3cschool在線教程):
<bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book></bookstore>
這棵樹從根節(jié)點開始,在樹的最低層級向文本節(jié)點長出枝條:

【要知道的幾個知識點】:
1.dom會把xml文件看做一棵樹,并加載到內存
2.dom特別適合做crud操作
3.dom不太適合去操作比較大的xml文件(占用內存)
4.dom會把xml文件中每一個元素、屬性、文本都映射成對應的Node對象。
1.調用DocumentBuilderFactory.newInstance()方法得到創(chuàng)建DOM解析器的工廠
2.調用工廠對象的newDocumentBuilder方法得到DOM解析器對象
3.調用DOM解析器對象的parse()方法解析XML文檔,得到代表整個文檔的Document對象,進行可以利用DOM特性對整個XML文檔進行操作了。
XML文檔如下:
<?xml version="1.0" encoding="utf-8"?><班級> <學生 地址="香港"> <名字>周小星</名字> <年齡>23</年齡> <介紹>學習刻苦</介紹> </學生> <學生 地址="澳門"> <名字>林曉</名字> <年齡>25</年齡> <介紹>是一個好學生</介紹> </學生> </班級>
首先使用2.2中介紹了三個步驟得到代表整個文檔的document對象,并調用我們所寫的read(Document document)方法,如下:
// 1.創(chuàng)建一個DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.通過工廠實例得到DocumentBuilder對象DocumentBuilder builder = factory.newDocumentBuilder();
// 3.指定要解析的xml文件,返回document對象Document document = builder.parse(new File("src/myClass.xml"));
read(document);其中的read方法是這么寫的:
/**
* 顯示所有學生的所有信息
* @param document
*/public static void read(Document document){ // 通過學生這個標簽名字得到NodeList
NodeList nodeList = document.getElementsByTagName("學生");
for(int i=0;i<nodeList.getLength();i++){ // 因為Element是Node的子接口,所有這里可以轉換成Element
// 從而可以使用更多的方法
Element student = (Element)nodeList.item(i); // 獲取屬性
String address = student.getAttribute("地址");
System.out.println(address); // 得到學生的所有子節(jié)點,并循環(huán)輸出
NodeList childList = student.getChildNodes(); for(int j=0;j<childList.getLength();j++){
Node node = childList.item(j); if(node.getNodeType() == Node.ELEMENT_NODE)
System.out.println(node.getNodeName()+":"+node.getTextContent());
}
System.out.println("-------------");
} // 這樣一層一層向下查詢也可以
//Element name = (Element)student.getElementsByTagName("名字").item(0);
//System.out.println(name.getTextContent()); }最后的運行結果如下所示:

利用DOM更新XML文檔一定要使用Transformer類將更改寫入文件,否則只是更改了在內存中的XML文檔對象。
javax.xml.transform包中的Transformer類用于把代表XML文件的Document對象轉換為某種格式后進行輸出,例如把xml文件應用樣式表后轉成一個html文檔。利用這個對象,當然也可以把Document對象又重新寫回到一個XML文件中
Transformer類通過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以通過:
javax.xml.transform.dom.DOMSource類來關聯(lián)要轉換的document對象
用javax.xml.transform.stream.StreamResult對象來表示數(shù)據(jù)的目的地
Transformer對象通過TransformerFactory獲得
【1】添加元素
我們可以向上述XML中添加一個學生子節(jié)點,如下:
/**
* 添加學生
*
* @param document
* @throws Exception
*/public static void add(Document document) throws Exception { // 創(chuàng)建一個新的學生節(jié)點
Element newStudent = document.createElement("學生"); // 給新的學生添加地址屬性
newStudent.setAttribute("地址", "舊金山"); // 創(chuàng)建學生的子節(jié)點
Element newStudent_name = document.createElement("名字");
newStudent_name.setTextContent("小明");
Element newStudent_age = document.createElement("年齡");
newStudent_age.setTextContent("25");
Element newStudent_intro = document.createElement("介紹");
newStudent_intro.setTextContent("這是一個好孩子"); // 將子節(jié)點添加到學生節(jié)點上
newStudent.appendChild(newStudent_name);
newStudent.appendChild(newStudent_age);
newStudent.appendChild(newStudent_intro); // 把新的學生節(jié)點添加到根節(jié)點下
document.getDocumentElement().appendChild(newStudent); // 更新XML文檔
// 得到TransformerFactory
TransformerFactory tff = TransformerFactory.newInstance(); // 通過TransformerFactory得到一個轉換器
Transformer tf = tff.newTransformer(); // 更新當前的XML文件
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}【2】刪除元素
同樣的,我們也可以刪除一個學生節(jié)點,如下:
/**
* 刪除第一個學生節(jié)點
*
* @param document
*/public static void delete(Document document) throws Exception { // 首先找到這個學生,這里可以不用轉為Element
Node student = document.getElementsByTagName("學生").item(0); // 通過它的父節(jié)點來刪除
student.getParentNode().removeChild(student); // 更新這個文檔
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}【3】更改元素的值
比如,我們也可以將第一個學生的名字改為松江,如下:
/**
* 把第一個學生的元素名字改為宋江
*
* @param document
*/public static void update_name(Document document) throws Exception{
Element student = (Element) document.getElementsByTagName("學生").item(0);
Element name = (Element) student.getElementsByTagName("名字").item(0);
name.setTextContent("宋江"); // 更新這個文檔
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}【4】更改或刪除元素的屬性
/**
* 刪除第一個學生節(jié)點的屬性
*
* @param document
*/public static void delete_attribute(Document document) throws Exception { // 首先找到這個學生
Element student = (Element) document.getElementsByTagName("學生").item(0); // 刪除student的地址屬性
student.removeAttribute("地址"); // 更新屬性
// student.setAttribute("地址", "新地址");
// 更新這個文檔
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml")));
}上述列舉了幾個更新元素(節(jié)點)的例子,更一般的需求是這樣的:將名字是周小星的同學的年齡改為30,這時候我們需要去遍歷XML文檔,找到對應的節(jié)點,再進行修改。
另外,所有關于更新的方法中都用到了TransformerFactory來進行實際的更新,所以,我們可以把這三句話寫成一個函數(shù),從而避免代碼冗余,如下:
public static void update(Document document, String path) throws Exception {
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new File(path)));
}關于“XML解析中DOM的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
本文標題:XML解析中DOM的示例分析
網站路徑:http://chinadenli.net/article42/gspgec.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網頁設計公司、自適應網站、網站導航、ChatGPT、企業(yè)建站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)