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 中国語 Web サイト (www.php.cn) に注目してください。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Jin フレームワークを使用して XML および JSON データ解析関数を実装する Jin フレームワークを使用して 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 解析エラーに直面した場合、どのように解決し、回避すべきでしょうか?この記事ではこの問題について詳しく説明します。 1. XML の解析

Java 開発における XML 解析のメモリ使用量が多い問題を解決する方法 Java 開発における XML 解析のメモリ使用量が多い問題を解決する方法 Jun 29, 2023 am 09:37 AM

XML は一般的に使用されるデータ交換形式であり、Java 開発では、大規模な XML ファイルを解析する必要があることがよくあります。ただし、XML ファイルには多数のノードや要素が含まれることが多いため、従来の XML 解析方法ではメモリ使用量が高くなりやすい可能性があります。この記事では、XML 解析のメモリ使用量が多い問題を解決するいくつかの方法を紹介します。 SAX パーサーの使用 SAX (SimpleAPI for XML) は、イベント駆動型の XML 解析メソッドです。 DOM との比較 (DocumentO

PHP を使用して XML を解析し、ノードのコンテンツを取得する方法 PHP を使用して XML を解析し、ノードのコンテンツを取得する方法 Jun 13, 2023 pm 04:31 PM

Web アプリケーションを開発する場合、XML はデータ交換や情報共有などのシナリオで使用できる非常に重要なデータ形式です。 PHP では、組み込み関数とサードパーティのライブラリを使用して XML を解析および操作できます。以下では、PHP を使用して XML を解析し、その中のノードのコンテンツを取得する方法について説明します。 XML ファイルの解析 まず、XML ファイルを解析する必要があります。PHP には、XML を解析するための 2 つの主な方法があります: 1.1. SimpleXML の使用 SimpleXML は PHP 内にあります。

PHP8.1 アップデート: XML 解析機能の強化 PHP8.1 アップデート: XML 解析機能の強化 Jul 07, 2023 am 09:22 AM

PHP8.1アップデート:XML解析機能の強化 インターネットの急速な発展に伴い、XML(Extensible Markup Language)はデータ交換や情報伝達において重要な役割を果たしています。 XML は汎用データ形式として、異なるアプリケーション間でデータを転送および保存するためによく使用されます。より優れた XML 解析機能を提供するために、PHP8.1 では XML 解析機能が強化され、開発者にさらなる利便性を提供しています。 PHP8.1 における重要な改善点は、libxml_disabl の導入です。

Java XML 解析例外 (XMLParsingException) を解決するソリューション Java XML 解析例外 (XMLParsingException) を解決するソリューション Aug 19, 2023 pm 01:43 PM

Java XML 解析例外 (XMLParsingException) を解決するソリューションの紹介: XML ファイルを処理するときに、XML 解析例外 (XMLParsingException) が頻繁に発生します。これは、XML ファイル形式のエラーまたは不適切な XML パーサー構成が原因です。この記事では、開発者がこれらの問題に適切に対処できるようにするための、一般的な XML 解析の例外と解決策をいくつか紹介します。 1. 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 (Extensible Markup Language) の重要性が高まり続けています。ただし、特に大きな XML ファイルを扱う場合、XML 解析中に過度のヒープ メモリ使用量に関する問題が発生する可能性があります。この記事では、この問題を解決するためのいくつかの方法とテクニックを紹介します。 1. XML 解析プロセスを理解する XML 解析がヒープ メモリを占有しすぎる問題を深く解決する前に、まず XML 解析の基本を理解します。

See all articles