XML解析之JAXP案例详解
根据一个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)!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

在Web开发领域中,数据格式之一的XML和JSON被广泛应用,而Gin框架则是一款轻量级的Go语言Web框架,它简洁易用且具有高效的性能。本文将介绍如何使用Gin框架实现XML和JSON数据解析功能。Gin框架概述Gin框架是一款基于Go语言的Web框架,它可用于构建高效和可扩展的Web应用程序。Gin框架的设计思想是简洁易用,它提供了多种中间件和插件,使开

随着Java在互联网领域中的应用越来越广泛,很多开发者可能会在使用XML进行数据解析的过程中遇到“XML解析错误”的问题。XML解析错误是指在使用Java解析XML数据时,由于数据格式不正确、标签未闭合或者其他原因导致程序无法正常解析数据,从而引发错误和异常。那么,在面对XML解析错误时,我们应该如何解决和避免呢?本文将对这一问题进行详细说明。一、XML解析

XML是一种常用的数据交换格式,在Java开发中,经常需要解析大规模的XML文件。然而,由于XML文件往往包含大量的节点和元素,传统的XML解析方式容易导致内存占用过高的问题。本文将介绍一些解决XML解析内存占用过高问题的方法。使用SAX解析器SAX(SimpleAPIforXML)是一种基于事件驱动的XML解析方式。相比于DOM(DocumentO

在开发Web应用程序时,XML是一种非常重要的数据格式,它可以用于数据交换和信息共享等场景。在PHP中,我们可以使用内置的函数和第三方库来解析和操作XML。下面我们将讨论如何使用PHP解析XML,并获取其中节点的内容。解析XML文件首先,我们需要解析XML文件,PHP提供了两种主要的方法来解析XML:1.1.使用SimpleXMLSimpleXML是PHP内

PHP8.1更新:增强的XML解析功能随着互联网的快速发展,XML(可扩展标记语言)在数据交换和信息传递中扮演了重要的角色。作为一种通用的数据格式,XML经常被用于在不同应用程序之间传递和存储数据。为了提供更好的XML解析能力,PHP8.1在XML解析功能上进行了增强,为开发者提供了更多便利。在PHP8.1中,一个重要的改进是引入了libxml_disabl

解决JavaXML解析异常(XMLParsingException)的解决方案简介:在处理XML文件时,我们常常会遇到XML解析异常(XMLParsingException),这是由于XML文件格式错误或者XML解析器配置不正确等原因导致的。本文将介绍一些常见的XML解析异常以及解决方案,帮助开发者更好地应对这些问题。一、XML解析异常的原因在解析XML文

PHP是一种广泛使用的编程语言,它支持许多不同的文件格式,包括XML。在处理XML文件时,可能会出现解析错误。本文将介绍如何在PHP中处理XML解析错误,并提供一些具体的代码示例。检查XML文件格式在处理XML文件之前,必须确保XML文件的格式正确。XML文件必须是严格的格式,否则解析器将无法处理该文件。例如,XML文件必须包含根元素,并使用正确的命名空间、

Java开发中如何解决XML解析占用过多堆内存问题引言:随着信息和数据的爆炸式增长,XML(可扩展标记语言)在企业应用开发中的重要性不断增加。然而,XML解析过程中可能会遇到占用过多堆内存的问题,尤其是在处理大型XML文件时。本文将介绍一些解决这个问题的方法和技巧。一、了解XML解析过程在深入解决XML解析占用过多堆内存问题之前,我们先了解一下XML解析的基
