溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

XML中JAXP的示例分析

發(fā)布時(shí)間:2021-09-17 15:22:38 來源:億速云 閱讀:86 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)XML中JAXP的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

根據(jù)一個(gè)CRUD的案例,對(duì)JAXP解析xml技術(shù),進(jìn)行詳細(xì)的解釋:

首先,已知一個(gè)xml文件中的數(shù)據(jù)如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<書架>
	<書 出版社="深圳出版社1"><!-- 出版社="深圳出版社1"屬性名和屬性值 -->
		<書名>Java</書名>
		<作者>張澤華</作者>
		<售價(jià)>39.00元</售價(jià)>
	</書>
	<書 出版社="深圳出版社2">
		<書名>JavaScript網(wǎng)頁開發(fā)</書名>
		<作者>李紅蕾</作者>
		<售價(jià)>28.00元</售價(jià)>
	</書>
</書架>

然后根據(jù)單元測(cè)試的形式,對(duì)CRUD分別寫在一個(gè)測(cè)試框架方法里面。以方便測(cè)試代碼正確性。

package com.itheima.dom;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 junit.framework.Assert;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/*
 * 
 * 			使用 xml  dom 對(duì)xml 文件進(jìn)行 CRUD操作 
 * 
 1.讀取節(jié)點(diǎn)的文本內(nèi)容
 2.讀取屬性值
 3.添加節(jié)點(diǎn)
 4.刪除節(jié)點(diǎn)
 5.更新節(jié)點(diǎn)
 6.打印所有元素節(jié)點(diǎn)的名稱.
 protected的方法,不讓new對(duì)象

 * 
 */
public class TestDomExercises {

	// 讀取節(jié)點(diǎn)的文本內(nèi)容 : Java就業(yè)培訓(xùn)教程
	@Test
	public void testReadContent() throws Exception {// 測(cè)試框架異常需要拋出

		// 獲得代表xml 文件的document 對(duì)象

		Document document = getDocument();

		// 根據(jù)標(biāo)簽名 獲得 名的標(biāo)簽的 節(jié)點(diǎn) 列表
		NodeList nl= document.getElementsByTagName("書名");

		int length = nl.getLength();

		System.out.println("長度 : " + length);

		// 返回第一個(gè) 書名 節(jié)點(diǎn)
		Node firstBookNameNode = nl.item(0);

		String result = firstBookNameNode.getTextContent();//String getTextContent()  此屬性返回此節(jié)點(diǎn)及其后代的文本內(nèi)容。 

		Assert.assertEquals("Java", result);
	}

	// 2.讀取屬性值 : 出版社="深圳出版社1"
	@Test
	public void testReadAttribute() throws Exception {

		// 獲得document 對(duì)象
		Document document = getDocument();

		NodeList nl = document.getElementsByTagName("書");

		// 拿到 第一本書的 節(jié)點(diǎn) 對(duì)象
		// Node firstBookNode = nl.item(0);

		// 注意:這里查看api 之后, 發(fā)現(xiàn)Node里面沒有【根據(jù) 屬性名獲得屬性值】的方法,而 元素 element 有 直接【根據(jù) 屬性名獲得屬性值】的方法, 而這里 拿到的 實(shí)際上就是
		// 一個(gè) 元素 Node節(jié)點(diǎn), 所以 這里 想到了強(qiáng)制類型 轉(zhuǎn)換 , 轉(zhuǎn)換為 元素Element , 然后 根據(jù)他的方法的屬性名獲得屬性的值

		// 拿到 第一本書
		//nl.item(0)返回Node對(duì)象,向下轉(zhuǎn)型成Element對(duì)象。因?yàn)镋lement里面有直接根據(jù)元素找值得方法:getAttribute("出版社");根據(jù)名稱獲取屬性的值
		Element firstBookElement = (Element) nl.item(0);

		//String getAttribute(String name) 通過名稱獲得屬性值。 
		String result = firstBookElement.getAttribute("出版社");//根據(jù)屬性名獲取屬性值

		Assert.assertEquals("深圳出版社1", result);

	}

	// 3.添加節(jié)點(diǎn) : <售價(jià)>79.00元</售價(jià)>
	@Test
	public void testAddPrice() throws Exception, SAXException, IOException {

		// 獲得document 對(duì)象
		Document document = getDocument();

		// 獲得第一本書 節(jié)點(diǎn)
		Node firstBookNode = document.getElementsByTagName("書").item(0);

		// 創(chuàng)建 售價(jià) 節(jié)點(diǎn), 并且將 文本設(shè)置為 79.00元
		//Element org.w3c.dom.Document.createElement(String tagName)
		//Element createElement(String tagName) 創(chuàng)建指定類型的元素。 
		Element createPriceElement = document.createElement("售價(jià)");
		//
		createPriceElement.setTextContent("79.00元");//<售價(jià)>79.00元</售價(jià)>

		//Node org.w3c.dom.Node.appendChild(Node newChild) 
		firstBookNode.appendChild(createPriceElement);//將節(jié)點(diǎn) newChild 添加到此節(jié)點(diǎn)的子節(jié)點(diǎn)列表的末尾。如果 newChild 已經(jīng)存在于樹中,則首先移除它。

		writeBack2Xml(document);

	}

	/*
	 * 回去寫代碼時(shí), 如果碰到這個(gè) 異常 :
	 * 
	 * initializationError(org.junit.runner.manipulation.Filter)
	 * 
	 * 就是 你 沒有 加 @Test 注解
	 */

	// 4.刪除節(jié)點(diǎn): <售價(jià)>39.00元</售價(jià)>
	@Test
	public void testDelete() throws Exception, SAXException, IOException {

		// 獲得 document 對(duì)象
		Document document = getDocument();

		// 獲得 售價(jià) 39.00元的 節(jié)點(diǎn)
		NodeList priceNodeList = document.getElementsByTagName("售價(jià)");

		for (int i = 0; i < priceNodeList.getLength(); i++) {

			// 拿到 每個(gè)售價(jià)節(jié)點(diǎn)
			Node node = priceNodeList.item(i);

			if ("39.00元".equals(node.getTextContent())) {

				// 如果進(jìn)來, 則說明找到 39.00元的售價(jià)節(jié)點(diǎn)
				// 拿到當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn), 然后 刪除 這個(gè) 節(jié)點(diǎn)
				node.getParentNode().removeChild(node);

			}
		}

		// 更新 到 xml 文件
		writeBack2Xml(document);

	}

	// 5.更新節(jié)點(diǎn) : <售價(jià)>79.00元</售價(jià)> ---------->> <售價(jià)>9.9元</售價(jià)>
	public void testUpdatePrice() {

	}

	// 6.打印所有元素節(jié)點(diǎn)的名稱.

	@Test
	public void testPrintAllElementsName() throws Exception, SAXException,
			IOException {

		// 獲得document 對(duì)象
		Document document = getDocument();

		printAllElementsName(document);
	}

	public void printAllElementsName(Node node) {

		if (Node.ELEMENT_NODE == node.getNodeType()) {

			// 說明 就是 元素 節(jié)點(diǎn)
			System.out.println(node.getNodeName());
		}

		NodeList childNodes = node.getChildNodes();

		for (int i = 0; i < childNodes.getLength(); i++) {

			// 拿到 遍歷過程中的 每一個(gè) node
			Node item = childNodes.item(i);

			printAllElementsName(item);
		}
	}

	// 需要將內(nèi)存中的document 對(duì)象 重新寫回到 xml 文件中去
	private void writeBack2Xml(Document document)
			throws TransformerFactoryConfigurationError,
			TransformerConfigurationException, TransformerException {

		// 如何弄?
		// 查看 文檔, transformerFacotry --->> Transformer實(shí)例

		TransformerFactory factory = TransformerFactory.newInstance();

		// 獲得轉(zhuǎn)換器的 實(shí)例對(duì)象
		Transformer transformer = factory.newTransformer();

		// 調(diào)用 轉(zhuǎn)換方法 將 內(nèi)存中document 對(duì)象 寫到 xml 文件中 去
		//abstract  void transform(Source xmlSource, Result outputTarget) 將 XML Source 轉(zhuǎn)換為 Result。 
		//DOMSource正好是Source實(shí)現(xiàn)類。而且它有構(gòu)造方法DOMSource(Node n) 正好接收一個(gè)Node
		//Result實(shí)現(xiàn)類有一個(gè)StreamResult他的構(gòu)造方法StreamResult.StreamResult(String systemId)
// systemId:Must be a String that conforms to the URI syntax
		//因此源Source,和結(jié)果Result都解決了
		transformer.transform(new DOMSource(document), new StreamResult(
				"src/book.xml"));
	}

	// 抽取 方法 (右鍵——>>refactor--->>rctract method)--->> 重構(gòu) -- 抽取 方法
	private Document getDocument() throws ParserConfigurationException,
			SAXException, IOException {
		// 1. 獲得工廠
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		// 2. 獲得 builder 對(duì)象
		DocumentBuilder builder = factory.newDocumentBuilder();

		// 3. 拿到 代表xml 文件的document 對(duì)象
		Document document = builder.parse("src/book.xml");
		return document;
	}

}

感謝各位的閱讀!關(guān)于“XML中JAXP的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI