這篇文章主要介紹了XML中DOM的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
xml解析技術常用的有兩類:dom解析和sax解析。
dom:(Document Object Model, 即文檔對象模型)是W3C組織推薦的處理XML的一種方式。
sax:(Simple API for XML)不是官方標準,但它是XML社區事實上的標準,幾乎所有的XML解析器都支持它。
Jaxp(Java API for XML Processing)是Java對XML進行編程的開發包,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成。
在 javax.xml.parsers包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的 DOM 或 SAX 的解析器對象。
DOM(Document Object Model文檔對象模型),是W3C組織推薦的處理可擴展標志語言的標準編程接口。XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法(接口)。

DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關系,解析成一個個Node對象(節點)。
在dom中,節點之間關系如下:
1、位于一個節點之上的節點是該節點的父節點(parent)
2、一個節點之下的節點是該節點的子節點(children)
3、同一層次,具有相同父節點的節點是兄弟節點(sibling)
4、一個節點的下一個層次的節點集合是節點后代(descendant)
5、父、祖父節點及所有位于節點上面的,都是節點的祖先(ancestor)
Node對象提供了一系列常量來代表結點的類型,當開發人員獲得某個Node類型后,就可以把Node節點轉換成相應的節點對象(Node的子類對象),以便于調用其特有的方法。(查看API文檔)
Node對象提供了相應的方法去獲得它的父結點或子結點。編程人員通過這些方法就可以讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。
PS:其子接口Element功能更多。
1、調用DocumentBuilderFactory.newInstance()方法創建DOM解析器的工廠。
2、調用DocumentBuilderFactory對象的newDocumentBuilder()方法得到DOM解析器對象,其是DocumentBuilder的對象。
3、調用DocumentBuilder對象的parse()方法解析XML文檔,得到代表整個文檔的Document對象。
4、通過Document對象和一些相關類和方法,對XML文檔進行操作。
javax.xml.transform包中的Transformer類用于把代表XML文件的Document對象轉換為某種格式后進行輸出,例如把xml文件應用樣式表后轉成一個html文檔。利用這個對象,當然也可以把Document對象又重新寫入到一個XML文件中。
Transformer類通過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以通過:
javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象,
用javax.xml.transform.stream.StreamResult 對象來表示數據的目的地。
Transformer對象通過TransformerFactory獲得。
案例:
XML5.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><班級 班次="1班" 編號="C1"> <學生 地址="湖南" 學號="n1" 性別="男" 授課方式="面授" 朋友="n2" 班級編號="C1"> <名字>張三</名字> <年齡>20</年齡> <介紹>不錯</介紹> </學生> <學生 學號="n2" 性別="女" 授課方式="面授" 朋友="n1 n3" 班級編號="C1"> <名字>李四</名字> <年齡>18</年齡> <介紹>很好</介紹> </學生> <學生 學號="n3" 性別="男" 授課方式="面授" 朋友="n2" 班級編號="C1"> <名字>王五</名字> <年齡>22</年齡> <介紹>非常好</介紹> </學生> <學生 性別="男"> <名字>小明</名字> <年齡>30</年齡> <介紹>好</介紹> </學生> </班級>
package com.pc;
import java.awt.List;
import java.util.ArrayList;
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.TransformerFactoryConfigurationError;
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;
/**
*
* @author Switch
* @function Java解析XML
*
*/
public class XML5 {
// 使用dom技術對xml文件進行操作
public static void main(String[] args) throws Exception {
// 1.創建一個DocumentBuilderFactory對象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
// 2.通過DocumentBuilderFactory,得到一個DocumentBuilder對象
DocumentBuilder documentBuilder = documentBuilderFactory
.newDocumentBuilder();
// 3.指定解析哪個xml文件
Document document = documentBuilder.parse("src/com/pc/XML5.xml");
// 4.對XML文檔操作
// System.out.println(document);
// list(document);
// read(document);
// add(document);
// delete(document, "小明");
update(document, "小明", "30");
}
// 更新一個元素(通過名字更新一個學生的年齡)
public static void update(Document doc, String name, String age)
throws Exception {
NodeList nodes = doc.getElementsByTagName("名字");
for (int i = 0; i < nodes.getLength(); i++) {
Element nameE = (Element) nodes.item(i);
if (nameE.getTextContent().equals(name)) {
Node prNode = nameE.getParentNode();
NodeList stuAttributes = prNode.getChildNodes();
for (int j = 0; j < stuAttributes.getLength(); j++) {
Node stuAttribute = stuAttributes.item(j);
if (stuAttribute.getNodeName().equals("年齡")) {
stuAttribute.setTextContent(age);
}
}
}
}
updateToXML(doc);
}
// 刪除一個元素(通過名字刪除一個學生)
public static void delete(Document doc, String name) throws Exception {
// 找到第一個學生
NodeList nodes = doc.getElementsByTagName("名字");
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (node.getTextContent().equals(name)) {
Node prNode = node.getParentNode();
prNode.getParentNode().removeChild(prNode);
}
}
// 更新到XML
updateToXML(doc);
}
// 添加一個學生到XML文件
public static void add(Document doc) throws Exception {
// 創建一個新的學生節點
Element newStu = doc.createElement("學生");
newStu.setAttribute("性別", "男");
Element newStu_name = doc.createElement("名字");
newStu_name.setTextContent("小明");
Element newStu_age = doc.createElement("年齡");
newStu_age.setTextContent("21");
Element newStu_intro = doc.createElement("介紹");
newStu_intro.setTextContent("好");
newStu.appendChild(newStu_name);
newStu.appendChild(newStu_age);
newStu.appendChild(newStu_intro);
// 把新的學生節點添加到根元素
doc.getDocumentElement().appendChild(newStu);
// 更新到XML
updateToXML(doc);
}
// 更新到XML
private static void updateToXML(Document doc)
throws TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
// 得到TransformerFactory對象
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
// 通過TransformerFactory對象得到一個轉換器
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(
"src/com/pc/XML5.xml"));
}
// 具體查詢某個學生的信息(小時第一個學生的所有)
public static void read(Document doc) {
NodeList nodes = doc.getElementsByTagName("學生");
// 取出第一個學生
Element stu1 = (Element) nodes.item(0);
Element name = (Element) stu1.getElementsByTagName("名字").item(0);
System.out.println("姓名:" + name.getTextContent() + " 性別:"
+ stu1.getAttribute("性別"));
}
// 遍歷該XML文件
public static void list(Node node) {
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println("名字:" + node.getNodeName());
}
// 取出node的子節點
NodeList nodes = node.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
// 顯示所有子節點
Node n = nodes.item(i);
list(n);
}
}
}感謝你能夠認真閱讀完這篇文章,希望小編分享的“XML中DOM的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。