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就业培训教程@Testpublic 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"@Testpublic 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元</售价>@Testpublic 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元</售价>@Testpublic 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.打印所有元素节点的名称.@Testpublic 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++) {// 拿到 遍历过程中的 每一个 nodeNode 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;}}


转载于:https://www.cnblogs.com/wanghang/p/6299753.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机梯度下降

1.SGD 代价函数通常可以分解成每个样本的代价函数的总和转载于:https://www.cnblogs.com/bigcome/p/10042800.html

iis mysql5.7_手动配置网站环境 IIS 10+PHP 7.1+MySQL 5.7

之前配置环境一直用的一键安装包&#xff0c;不管是phpStudy还是lnmp&#xff0c;昨天尝试在自己电脑配置一下iis的环境&#xff0c;也踩了一些坑&#xff0c;整理了一下。测试电脑是Windows10&#xff0c;理论上Win7和IIS7.5都支持的。安装 IIS1&#xff1a;控制面板 > 程序…

如何使用Apache的Prediction IO Machine Learning Server构建推荐引擎

by Vaghawan Ojha通过瓦哈万欧哈(Vaghawan Ojha) 如何使用Apache的Prediction IO Machine Learning Server构建推荐引擎 (How to build a recommendation engine using Apache’s Prediction IO Machine Learning Server) This post will guide you through installing Apache…

JavaScript DOM编程艺术第二版学习(1/4)

接下来项目需要网页相关知识&#xff0c;故在大牛的指引下前来阅读本书。 记录方式&#xff1a;本书分四部分阅读&#xff0c;完成阅读之后会多写一篇包括思维导图的算是阅读指南的东西&#xff0c;浏览的童鞋看着指南可以跳过一些不必要的坑~ 当前水平&#xff1a;HTML&CS…

github开源大项目_GitHub刚刚发布了一份大规模的开源指南

github开源大项目Here are three links worth your time:这是三个值得您花费时间的链接&#xff1a; GitHub just released a massive guide to contributing to open source (5 to 60 minute read) GitHub刚刚发布了一份有关开源的大型指南( 阅读5至60分钟 ) A new way to br…

mysql中where条件判断语句_MySQL Where 条件语句介绍和运算符小结

WHERE 条件有时候操作数据库时&#xff0c;只操作一些有条件限制的数据&#xff0c;这时可以在SQL语句中添加WHERE子句来规定数据操作的条件。语法&#xff1a;SELECT column,… FROM tb_name WHERE definitionWHERE 关键字后面接有效的表达式(definition)&#xff0c;该表达式…

node webkit(nw.js) 设置自动更新

原理&#xff1a;把更新的文件放在服务器上&#xff0c;设置一个客户端版本号&#xff0c;每次打开客户端的时候&#xff0c;通过接口获取服务器上的版本&#xff0c;如果高于本地的版本就下载服务器上的代码&#xff0c;低于或等于就不更新 1 <script>2 var htt…

个人工作总结04(冲刺二)

今天是团队第二次冲刺阶段开始的第04天&#xff0c;我的工作总结如下&#xff1a; 一、昨天干了什么&#xff1f; 知识圈查询功能 基本实现数据库查询 (未完成) 二、今天准备做什么&#xff1f; 知识圈查询功能 基本实现数据库查询 三、遇到了什么困难&#xff1f; 数据库访问出…

mysql8.0版1130_navicat premium连接mysql 8.0报错error 10061和error1130问题

昨天安装了最新版的mysql navicat premium, 但没来得及测试使用Navicat连接。今天上班时&#xff0c;使用Navicat premium连接mysql时&#xff0c;出现报错ERROR 2003 (HY000): Can’t connect to MySQL server on ‘1XX.XX.XX.XX’ (10061).起初以为是mysql没有安装成功&#…

freecodecamp_为什么您一定要参与freeCodeCamp的一个研究小组

freecodecampby Frederick Ige弗雷德里克艾格(Frederick Ige) 为什么您一定要参与freeCodeCamp的一个研究小组 (Why you should definitely get involved with one of freeCodeCamp’s study groups) I’m writing this article in hopes of convincing you to take advantage…

C语言运行时数据结构

段&#xff08;Segment&#xff09;&#xff1a; 对象文件/可执行文件&#xff1a; SVr4 UNIX上被称为ELF&#xff08;起初"Extensible Linker Format", 现在"Executable and Linking Format"&#xff09;文件。BSD UNIX上被称为a.out。这些格式都具有段的…

Java挂起线程

2019独角兽企业重金招聘Python工程师标准>>> 不优雅的suspend import java.util.concurrent.TimeUnit;public class SuspendTest {static Object lock new Object();SuppressWarnings("deprecation")public static void main(String[] args) {Suspend s1…

Hibernate包及相关工具包下载地址

Hibernate包及相关工具包下载地址&#xff1a; http://prdownloads.sourceforge.net/hibernate/ 这里包含所有hibernate各个版本的包下载&#xff0c;且提供了 Middlegen Hibernate及hibernate-extensions包的下载。这两个包是用于自动生成相就的JAVA和*.hb…

init(coder:)_2018年《 New Coder》调查:31,000人告诉我们他们如何学习编码并在工作中获得工作…

init(coder:)More than 31,000 people responded to our 2018 New Coder Survey, granting researchers an unprecedented glimpse into how adults are learning to code.超过31,000人对我们的2018年《新编码器调查》做出了回应&#xff0c;使研究人员对成年人如何学习编码有了…

Redis源码解析:21sentinel(二)定期发送消息、检测主观下线

六&#xff1a;定时发送消息 哨兵每隔一段时间&#xff0c;会向其所监控的所有实例发送一些命令&#xff0c;用于获取这些实例的状态。这些命令包括&#xff1a;”PING”、”INFO”和”PUBLISH”。 “PING”命令&#xff0c;主要用于哨兵探测实例是否活着。如果对方超过一段时间…

[SDOI2018]原题识别

题解&#xff1a; 。。感觉挺烦得 而且我都没有注意到树随机这件事情。。 就写个30分的莫队。。 #include <bits/stdc.h> using namespace std; #define rint register int #define IL inline #define rep(i,h,t) for (int ih;i<t;i) #define dep(i,t,h) for (int it;…

django app中扩展users表

app models中编写新的User1 # _*_ coding:utf-8 _*_2 from __future__ import unicode_literals34 from django.db import models5 from django.contrib.auth.models import AbstractUser # 继承user67 # Create your models here.8910 class UserProfile(AbstractUser):11 …

[bzoj2301] [HAOI2011]Problem b

Description 对于给出的n个询问&#xff0c;每次求有多少个数对(x,y)&#xff0c;满足a≤x≤b&#xff0c;c≤y≤d&#xff0c;且gcd(x,y) k&#xff0c;gcd(x,y)函数为x和y的最大公约数。 Input 第一行一个整数n&#xff0c;接下来n行每行五个整数&#xff0c;分别表示a、b、…

华为p4用鸿蒙系统吗_华为p40pro是鸿蒙系统吗

华为的鸿蒙OS是一款“面向未来”的操作系统&#xff0c;一款基于微内核的面向全场景的分布式操作系统&#xff0c;此前mate30系列并没有搭载鸿蒙系统。那华为p40pro是鸿蒙系统吗&#xff1f;品牌型号&#xff1a;华为p40pro华为p40pro是鸿蒙系统吗&#xff1f;华为p40pro没有搭…

设置MYSQL允许用IP访问

mysql>use mysql;mysql>update user set host % where user root;mysql>flush privileges;mysql>select host,user from user where userroot;mysql>quit 转载于:https://www.cnblogs.com/vipstone/p/5541619.html