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案例详解的更多相关文章
- spring的IOC,DI及案例详解
一:spring的基本特征 Spring是一个非常活跃的开源框架:它是一个基于Core来架构多层JavaEE系统的框架,它的主要目的是简化企业开发.Spring以一种非侵入式的方式来管理你的代码,Sp ...
- 深入浅出 spring-data-elasticsearch - 基本案例详解(三
『 风云说:能分享自己职位的知识的领导是个好领导. 』运行环境:JDK 7 或 8,Maven 3.0+技术栈:SpringBoot 1.5+, Spring Data Elasticsearch ...
- http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误)
http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误) 一.总结 服务器内部错误可能是服务器中代码运行的时候的语法错误或者逻辑错误 二.http500:服务器内部错误案例详解 只是一 ...
- 解析Tomcat之HttpServlet详解
解析Tomcat之HttpServlet详解 Servlet的框架是 由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所 ...
- str_replace函数的使用规则和案例详解
str_replace函数的使用规则和案例详解 str_replace函数的简单调用: <?php $str = '苹果很好吃.'; //请将变量$str中的苹果替换成香蕉 $strg = st ...
- 数据结构图文解析之:队列详解与C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 用一个开发案例详解Oracle临时表
用一个开发案例详解Oracle临时表 2016-11-14 bisal ITPUB  一.开发需求 最近有一个开发需求,大致需要先使用主表,或主表和几张子表关联查询出ID(主键)及一些主表字段 ...
- XML 解析之 jaxp 解析器
XML 的解析方式有两种方式: DOM 解析和 SAX 解析. DOM 解析: 根据 XML 的层级结构, 在内存中分配一个树形结构, 把 XML 的标签, 属性和文本都封装成对象. 优点: 可以实现 ...
- linux ssh使用深度解析(key登录详解)
linux ssh使用深度解析(key登录详解) SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SSH协议是IETF(Internet Engineering Task ...
随机推荐
- Docker学习系列(二)Docker初体验
一.系统要求 Docker的安装,需要在CentOS 7.0+版本,内核至少3.10,64-bit uname --r [randy@randysun ~]$ uname --r -.el7.x86_ ...
- MongoDB 排序
MongoDB sort()方法 在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 ...
- Swift类中如何创建一个对外只读对内可读写的属性
很简单用private修饰符,后面跟限制关键字set: class Day{ private(set) var rawValue:Int = 0 func showRawValue(){ print( ...
- ROS机器人程序设计(原书第2版)补充资料 (伍) 第五章 计算机视觉
ROS机器人程序设计(原书第2版)补充资料 (伍) 第五章 计算机视觉 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 计算机视觉这章分为两 ...
- Hive-ORC文件存储格式(续)
本文在Hive-ORC文件存储格式的理论基础上,进一步分析一个实际的Hive ORC表中的数据存储形式. 一.表结构 库名+表名:fileformat.test_orc 字段 类型 category_ ...
- Cocoa层粒子发射器动画添加多个cell的一种重构
在iOS动画之旅第19章中最后的挑战中需要我们在雪花例子发生器中添加多个雪花贴图,也就是多个cell,因为我们不可能将每个cell的参数都重新写一遍,所以有必要写一个helper方法来做这件事: fu ...
- Java学习之控制跳转语句
控制跳转语句 控制跳转语句: (1)break:中断的意思 A:用在循环和switch语句中,离开此应用场景无意义. B:作用 a:跳出单层循环 b:跳出多层循环,需要标签语句的配合 (2)conti ...
- Hive-ORC文件存储格式
ORC文件格式是从Hive-0.11版本开始的.关于ORC文件格式的官方文档,以及基于官方文档的翻译内容这里就不赘述了,有兴趣的可以仔细研究了解一下.本文接下来根据论文<Major Techni ...
- iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascr ...
- 18 Ui美化 剪切动画clip
输入0 - 10000 让图片根据数值显示部分图片 在工程文件的res/drawable/新建clip文件 <?xml version="1.0" encoding=&quo ...