首頁 > 後端開發 > XML/RSS教程 > XML程式設計-DOM

XML程式設計-DOM

黄舟
發布: 2017-02-20 15:08:13
原創
1387 人瀏覽過

XML程式設計-DOM

XML 解析技術


    xml解析技術常用的有兩類:dom解析和sax解析。

dom(Document Object Model, 即文檔物件模型)W3C組織推薦的處理XML的一種方式。

sax(Simple API for XML)不是官方標準,但它是XML社群事實上的標準,幾乎所有的XML解析器都支援它。

 

Jaxp介紹

    Jaxp(Java API for XML Processing)JavaXML進行程式設計的開發包,它由javax.xmlorg. w3c.dom org.xml.sax 包及其子包組成。

    在 javax.xml.parsers包中,定義了幾個工廠類,程式設計師調用這些工廠類,可以得到對 xml文件進行解析的 DOM 或 SAX 的解析器物件。

 

DOM基本概述

    DOM(Document Object Model文檔物件模型),是W3C組織推薦的處理可擴展標誌語言的標準程式介面。 XML DOM 定義了所有 XML 元素的物件和屬性,以及存取它們的方法(介面)。

 

原理圖


DOM模型(document object model)


    DOM解析器在解析XML文件時,會把文件中的所有元素,按照其出現的層次關係,解析成一個個Node物件(節點)

dom中,節點之間關係如下:

1位於一個節點之上的節點是該節點的父節點(parent)

2一個節點之下的節點是該節點的子節點(children) 

3同一層次,具有相同父節點的節點是兄弟節點(sibling) 

4一個節點的下一個層次的節點集合是節點後代(descendant)

5父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor) 

 

Node物件

    Node物件提供了一系列常數來代表結點的類型,當開發人員取得某個Node類型後,就可以把Node節點轉換成對應的節點對象(Node的子類別物件),以便於呼叫其特有的方法。 (查看API文件) 

    Node物件提供了相應的方法去獲得它的父結點或子結點。程式設計人員透過這些方法就可以讀取整個XML文件的內容、或新增、修改、刪除XML文件的內容了。

PS:其子介面Element功能更多。

 

取得Jaxp中的DOM解析器

1、呼叫DocumentBuilderFactory.newInstance()方法建立DOM解析器的工廠。

2、呼叫DocumentBuilderFactory物件的newDocumentBuilder()方法得到 DOM解析器物件,其是DocumentBuilder的物件。

3、呼叫DocumentBuilder物件的parse()方法解析 XML文檔,得到代表整個文檔的Document對象。

4、透過Document物件和一些相關類別和方法,對XML文檔進行操作。

 

更新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的內容,更多相關內容請關注PHP中文網(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板