首頁 後端開發 XML/RSS教程 XML解析之JAXP案例詳解

XML解析之JAXP案例詳解

Feb 16, 2017 pm 03:37 PM

根據一個CRUD的案例,對JAXP解析xml技術,進行詳細的解釋:


首先,已知一個xml檔案中的資料如下:


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
	<书 出版社="深圳出版社1"><!-- 出版社="深圳出版社1"属性名和属性值 -->
		<书名>Java</书名>
		<作者>张泽华</作者>
		<售价>39.00元</售价>
	</书>
	<书 出版社="深圳出版社2">
		<书名>JavaScript网页开发</书名>
		<作者>李红蕾</作者>
		<售价>28.00元</售价>
	</书>
</书架>
登入後複製


CRUD分別寫在一個測試框架方法裡面。以方便測試程式碼正確性。



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 对xml 文件进行 CRUD操作 
 * 
 1.读取节点的文本内容
 2.读取属性值
 3.添加节点
 4.删除节点
 5.更新节点
 6.打印所有元素节点的名称.
 protected的方法,不让new对象

 * 
 */
public class TestDomExercises {

	// 读取节点的文本内容 : Java就业培训教程
	@Test
	public void testReadContent() throws Exception {// 测试框架异常需要抛出

		// 获得代表xml 文件的document 对象

		Document document = getDocument();

		// 根据标签名 获得 名的标签的 节点 列表
		NodeList nl= document.getElementsByTagName("书名");

		int length = nl.getLength();

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

		// 返回第一个 书名 节点
		Node firstBookNameNode = nl.item(0);

		String result = firstBookNameNode.getTextContent();//String getTextContent()  此属性返回此节点及其后代的文本内容。 

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

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

		// 获得document 对象
		Document document = getDocument();

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

		// 拿到 第一本书的 节点 对象
		// Node firstBookNode = nl.item(0);

		// 注意:这里查看api 之后, 发现Node里面没有【根据 属性名获得属性值】的方法,而 元素 element 有 直接【根据 属性名获得属性值】的方法, 而这里 拿到的 实际上就是
		// 一个 元素 Node节点, 所以 这里 想到了强制类型 转换 , 转换为 元素Element , 然后 根据他的方法的属性名获得属性的值

		// 拿到 第一本书
		//nl.item(0)返回Node对象,向下转型成Element对象。因为Element里面有直接根据元素找值得方法:getAttribute("出版社");根据名称获取属性的值
		Element firstBookElement = (Element) nl.item(0);

		//String getAttribute(String name) 通过名称获得属性值。 
		String result = firstBookElement.getAttribute("出版社");//根据属性名获取属性值

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

	}

	// 3.添加节点 : <售价>79.00元</售价>
	@Test
	public void testAddPrice() throws Exception, SAXException, IOException {

		// 获得document 对象
		Document document = getDocument();

		// 获得第一本书 节点
		Node firstBookNode = document.getElementsByTagName("书").item(0);

		// 创建 售价 节点, 并且将 文本设置为 79.00元
		//Element org.w3c.dom.Document.createElement(String tagName)
		//Element createElement(String tagName) 创建指定类型的元素。 
		Element createPriceElement = document.createElement("售价");
		//
		createPriceElement.setTextContent("79.00元");//<售价>79.00元</售价>

		//Node org.w3c.dom.Node.appendChild(Node newChild) 
		firstBookNode.appendChild(createPriceElement);//将节点 newChild 添加到此节点的子节点列表的末尾。如果 newChild 已经存在于树中,则首先移除它。

		writeBack2Xml(document);

	}

	/*
	 * 回去写代码时, 如果碰到这个 异常 :
	 * 
	 * initializationError(org.junit.runner.manipulation.Filter)
	 * 
	 * 就是 你 没有 加 @Test 注解
	 */

	// 4.删除节点: <售价>39.00元</售价>
	@Test
	public void testDelete() throws Exception, SAXException, IOException {

		// 获得 document 对象
		Document document = getDocument();

		// 获得 售价 39.00元的 节点
		NodeList priceNodeList = document.getElementsByTagName("售价");

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

			// 拿到 每个售价节点
			Node node = priceNodeList.item(i);

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

				// 如果进来, 则说明找到 39.00元的售价节点
				// 拿到当前节点的父节点, 然后 删除 这个 节点
				node.getParentNode().removeChild(node);

			}
		}

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

	}

	// 5.更新节点 : <售价>79.00元</售价> ---------->> <售价>9.9元</售价>
	public void testUpdatePrice() {

	}

	// 6.打印所有元素节点的名称.

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

		// 获得document 对象
		Document document = getDocument();

		printAllElementsName(document);
	}

	public void printAllElementsName(Node node) {

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

			// 说明 就是 元素 节点
			System.out.println(node.getNodeName());
		}

		NodeList childNodes = node.getChildNodes();

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

			// 拿到 遍历过程中的 每一个 node
			Node item = childNodes.item(i);

			printAllElementsName(item);
		}
	}

	// 需要将内存中的document 对象 重新写回到 xml 文件中去
	private void writeBack2Xml(Document document)
			throws TransformerFactoryConfigurationError,
			TransformerConfigurationException, TransformerException {

		// 如何弄?
		// 查看 文档, transformerFacotry --->> Transformer实例

		TransformerFactory factory = TransformerFactory.newInstance();

		// 获得转换器的 实例对象
		Transformer transformer = factory.newTransformer();

		// 调用 转换方法 将 内存中document 对象 写到 xml 文件中 去
		//abstract  void transform(Source xmlSource, Result outputTarget) 将 XML Source 转换为 Result。 
		//DOMSource正好是Source实现类。而且它有构造方法DOMSource(Node n) 正好接收一个Node
		//Result实现类有一个StreamResult他的构造方法StreamResult.StreamResult(String systemId)
// systemId:Must be a String that conforms to the URI syntax
		//因此源Source,和结果Result都解决了
		transformer.transform(new DOMSource(document), new StreamResult(
				"src/book.xml"));
	}

	// 抽取 方法 (右键——>>refactor--->>rctract method)--->> 重构 -- 抽取 方法
	private Document getDocument() throws ParserConfigurationException,
			SAXException, IOException {
		// 1. 获得工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		// 2. 获得 builder 对象
		DocumentBuilder builder = factory.newDocumentBuilder();

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

}
登入後複製

 以上是XML解析之JAXP案例詳解的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用Gin框架實作XML和JSON資料解析功能 使用Gin框架實作XML和JSON資料解析功能 Jun 22, 2023 pm 03:14 PM

在Web開發領域中,資料格式之一的XML和JSON被廣泛應用,而Gin框架則是一款輕量級的Go語言Web框架,它簡潔易用且具有高效的效能。本文將介紹如何使用Gin框架實作XML和JSON資料解析功能。 Gin框架概述Gin框架是一款基於Go語言的Web框架,它可用於建立高效且可擴展的Web應用程式。 Gin框架的設計想法是簡潔易用,它提供了多種中間件和插件,使開

Java錯誤:XML解析錯誤,如何解決與避免 Java錯誤:XML解析錯誤,如何解決與避免 Jun 24, 2023 pm 05:46 PM

隨著Java在網際網路領域的應用越來越廣泛,許多開發者可能會在使用XML進行資料解析的過程中遇到「XML解析錯誤」的問題。 XML解析錯誤是指在使用Java解析XML資料時,由於資料格式不正確、標籤未閉合或其他原因導致程式無法正常解析數據,從而引發錯誤和異常。那麼,在面對XML解析錯誤時,我們該如何解決與避免呢?本文將對這一問題進行詳細說明。一、XML解析

Java開發中如何解決XML解析記憶體佔用過高問題 Java開發中如何解決XML解析記憶體佔用過高問題 Jun 29, 2023 am 09:37 AM

XML是一種常用的資料交換格式,在Java開發中,經常需要解析大規模的XML檔案。然而,由於XML檔案往往包含大量的節點和元素,傳統的XML解析方式容易導致記憶體佔用過高的問題。本文將介紹一些解決XML解析記憶體佔用過高問題的方法。使用SAX解析器SAX(SimpleAPIforXML)是一種基於事件驅動的XML解析方式。相較於DOM(DocumentO

使用PHP解析XML,取得節點內容的方法 使用PHP解析XML,取得節點內容的方法 Jun 13, 2023 pm 04:31 PM

在開發Web應用程式時,XML是一種非常重要的資料格式,它可以用於資料交換和資訊共享等場景。在PHP中,我們可以使用內建的函數和第三方函式庫來解析和操作XML。下面我們將討論如何使用PHP解析XML,並取得其中節點的內容。解析XML文件首先,我們需要解析XML文件,PHP提供了兩種主要的方法來解析XML:1.1.使用SimpleXMLSimpleXML是PHP內

PHP8.1更新:增強的XML解析功能 PHP8.1更新:增強的XML解析功能 Jul 07, 2023 am 09:22 AM

PHP8.1更新:增強的XML解析功能隨著互聯網的快速發展,XML(可擴展標記語言)在資料交換和資訊傳遞中扮演了重要的角色。作為一種通用的資料格式,XML經常被用於在不同應用程式之間傳遞和儲存資料。為了提供更好的XML解析能力,PHP8.1在XML解析功能上進行了增強,為開發者提供了更多便利。在PHP8.1中,一個重要的改進是引入了libxml_disabl

解決Java XML解析異常(XMLParsingException)的解決方案 解決Java XML解析異常(XMLParsingException)的解決方案 Aug 19, 2023 pm 01:43 PM

解決JavaXML解析異常(XMLParsingException)的解決方案簡介:在處理XML檔案時,我們常常會遇到XML解析異常(XMLParsingException),這是由於XML檔案格式錯誤或XML解析器設定不正確等原因導致的。本文將介紹一些常見的XML解析異常以及解決方案,幫助開發者更好地應對這些問題。一、XML解析異常的原因在解析XML文

PHP中如何處理XML解析錯誤? PHP中如何處理XML解析錯誤? Dec 02, 2023 pm 02:58 PM

PHP是一種廣泛使用的程式語言,它支援許多不同的檔案格式,包括XML。在處理XML檔案時,可能會出現解析錯誤。本文將介紹如何在PHP中處理XML解析錯誤,並提供一些具體的程式碼範例。檢查XML檔案格式在處理XML檔案之前,必須確保XML檔案的格式正確。 XML檔案必須是嚴格的格式,否則解析器將無法處理該檔案。例如,XML檔案必須包含根元素,並使用正確的命名空間、

Java開發如何減少XML解析記憶體佔用問題 Java開發如何減少XML解析記憶體佔用問題 Jun 30, 2023 pm 09:19 PM

Java開發中如何解決XML解析佔用過多堆記憶體問題引言:隨著資訊和資料的爆炸性成長,XML(可擴展標記語言)在企業應用開發中的重要性不斷增加。然而,XML解析過程中可能會遇到佔用過多堆記憶體的問題,尤其是在處理大型XML檔案時。本文將介紹一些解決這個問題的方法和技巧。一、了解XML解析過程在深入解決XML解析佔用過多堆記憶體問題之前,我們先了解XML解析的基

See all articles