使用jaxp解析器dom方式對xml節點進行操作

迷茫中前進發表於2018-03-25

    作為一名初學者,對一些程式語言感覺不是很簡單。尤其是正在學習的Javaweb這一部分的內容,非常駁雜,讓人頭大。

    看過一些書,也包括聽一些人說,寫部落格有利於理解和記憶。作為一名初學者,我抱著學習和積累的心理,開始我的部落格之旅。希望各位前輩和同濟多指教。

    jaxp,剛開始學習的時候不理解是什麼意思,特地百度一下,原來是處理xml的Java api。今天主要學習了xml的dom解析方式。對於jaxp,我也不知道準確的稱呼方式,在下文皆稱為解析器。jaxp解析器位於jdk api 的javax.xml.parsers包中。其中DocumentBuilder和DocumentBuilderFactory這兩個類是針對dom方式的。這兩個類都是抽象類,不能通過構造方法例項化,下面是這兩個類獲取例項的方法:

//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//通解析器工廠來建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();

下面使用jaxp解析器來解析xml文件,給出一個xml檔案如下(在下文中此xml檔案的位置為src/person.xml):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<perosn>
	<p1>
		<name>zhaosi</name>
		<age>12</age>
	</p1>
	<p1>
		<name>lisan</name>
		<age>22</age>
	</p1>
</perosn>

 

1.使用jaxp實現查詢操作,比如查詢所有name元素的值

 

java程式碼如下:

public static void selectNames() throws Exception {
		//建立解析器工廠
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//建立解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//解析xml檔案得到Document物件
		Document document = builder.parse("src/person.xml");
		//通過標籤(元素)名得到對應的集合
		NodeList names = document.getElementsByTagName("name");
		//遍歷集合,並列印節點文字內容
		for (int x=0; x<names.getLength(); x++) {
			Node name = names.item(x);//通過item方法得到集合中第x個項
			System.out.println(name.getTextContent());//獲取文字內容並列印
		}
	}

        使用getElementsByTagName()方法可以獲得對應元素的集合。如果想要查詢某一個元素的值,便不需要遍歷,直接使用item()方法即可:

Node name1 = document.getElementsByTagName("name").item(0);

這樣便可以得到對應的節點了。

 

2.使用jaxp實現新增操作,比如在第一個p1標籤中age標籤的後面新增一個節點<sex>man</sex>

java 程式碼如下:

public static void addSex() throws Exception {
	//建立解析器工廠
	DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
	//建立解析器
	DocumentBuilder builder = builderFactory.newDocumentBuilder();
	//解析xml文件得到Document物件
	Document document = builder.parse("src/person.xml");
	//得到第一個p1節點
	Node p1 = document.getElementsByTagName("p1").item(0);
	//新增sex節點
	//首先建立sex標籤及其文字並結合
	Node sex = document.createElement("sex");
	Text text = document.createTextNode("man");
	sex.appendChild(text);
	//將此節點新增到p1下
	p1.appendChild(sex);
	//回寫xml,將源樹轉換為結果樹
	TransformerFactory transformerFactory = TransformerFactory.newInstance();
	Transformer transformer = transformerFactory.newTransformer();
	//轉換
	transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}

       可以看到在使用jaxp對xml檔案進行操作時,前三步基本上是相同的。而新增節點後之所以需要回寫,是因為新增節點的操作改變的是記憶體中DOM樹(源樹)的結構,而非xml檔案。DOMSource(Source的子類)以DOM樹的形式充當源樹的持有者,StreamResult(Result的子類)充當轉換結果的持有者。

 

3.使用jaxp實現修改操作,比如將sex標籤的內容改為woman

public static void setSex() throws Exception {
	//建立解析器工廠
	DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
	//根據解析器工廠建立解析器
	DocumentBuilder builder = builderFactory.newDocumentBuilder();
	//解析xml檔案,得到Document物件
	Document document = builder.parse("src/person.xml");
	//得到sex節點
	Node sex = document.getElementsByTagName("sex").item(0);
	//修改節點文字內容
	sex.setTextContent("woman");
	//回寫
	TransformerFactory transformerFactory = TransformerFactory.newInstance();
	Transformer transformer = transformerFactory.newTransformer();
	transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}

 

 

4.使用jaxp實現刪除操作,比如刪除sex節點

public static void removeSex() throws Exception {
	//建立解析器工廠
	DocumentBuilderFactory builderFactory  = DocumentBuilderFactory.newInstance();
	//通過解析器工廠得到解析器
	DocumentBuilder builder = builderFactory.newDocumentBuilder();
	//解析xml檔案得到Document物件
	Document document = builder.parse("src/person.xml");
	//得到sex節點
	Node sex = document.getElementsByTagName("sex").item(0);
	//得到sex節點的父節點
	Node sexParent = sex.getParentNode();
	//刪除
	sexParent.removeChild(sex);
	//回寫
	TransformerFactory transformerFactory = TransformerFactory.newInstance();
	Transformer transformer = transformerFactory.newTransformer();
	transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}

 

5.使用jaxp遍歷所有節點

public static void nodesTraversal() throws Exception {
	//建立解析器工廠
	DocumentBuilderFactory builderFactory  = DocumentBuilderFactory.newInstance();
	//通過解析器工廠得到解析器
	DocumentBuilder builder = builderFactory.newDocumentBuilder();
	//解析xml檔案得到Document物件
	Document document = builder.parse("src/person.xml");
	//遍歷
	recurMethod(document);
}
//使用遞迴的方式進行節點的遍歷
public static void recurMethod(Node node) {
	if(node.getNodeType()==Node.ELEMENT_NODE) {
		//先判斷其是否為元素節點,是則列印
		System.out.println(node.getNodeName());
	}
	if(node.hasChildNodes()) {//判斷其是否存在子節點
		//如果該節點存在子節點則進行其子節點的遍歷
		NodeList nodeList = node.getChildNodes();
		for (int x=0; x<nodeList.getLength(); x++) {
			Node childNode = nodeList.item(x);
			recurMethod(childNode);//遞迴
		}
	}
}

        以上內容,作為對初學jaxp解析器dom方式解析xml的輸出和加強。如果有什麼錯誤或者誤差亦或是缺失,希望得到指正哈!

相關文章