JavaWeb学习日记----XML的解析
XML的解析简介:
在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象。
比如:document对象,element对象,属性对象,文本对象,Node结点对象
我们通常有两种方式来解析XML:DOM和SAX
DOM解析方式:
其实跟HTML差不多的,也是根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本都封装成对象。
缺点:如果文件过大的话,就和造成内存溢出。
优点:可以很方便实现增删改操作。
SAX解析方式:
采用事件驱动,从上到下,一行一行的解析,边读边解析。解析到某一个对象时,返回对象名称。
缺点:不能实现增删改操作
优点:不会内存溢出,可以方便实现查询操作。
解析器:
在解析XML时,需要解析器。针对DOM和SAX,不同的公司和组织向我们提供了不同的解析器。
SUN公司: jaxp
dom4j组织: dom4j
jdom组织 : jdom
在实际开发中,dom4j用的最多
jaxp:
jaxp解析器在JDK的javax.xml.parsers包里面。针对dom和sax分别提供了解析器:
dom: DocumentBuilder: 解析器类
DocumentBuilderFactory: 解析器工厂类
sax: SAXParser: 解析器类
SAXParserFactory: 解析器工厂类
那么我们具体获得JAXP中的DOM解析器的方法如下:
调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。
调用工厂对象的newDocumentBuilder()方法得到解析器对象。
调用解析器对象的parse()方法解析XML文档,该方法的参数为XML文档的URL或者封装了XML路径的文件对象。即:parse(String uri) parse(File f)
示例:
// 创建解析器工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析目标XML文件
Document document = documentBuilder.parse("src/OnePiece.xml");
通过上述步骤我们就能得到代表整个文档的Document对象,就可以利用DOM特性对整个XML文档进行操纵了。
Document接口中常用的方法:
NodeList getElementsByTagName(String tagname) 按文档顺序返回包含在文档中且具有给定标记名称的所Element的 NodeList。
Element createElement(String tagName) 创建指定类型的元素。
Text createTextNode(String data) 创建给定指定字符串的 Text 节点。
Document的父接口Node中常用的方法:
Node appendChild(Node newChild)
将节点 newChild 添加到此节点的子节点列表的末尾。
Node removeChild(Node oldChild)
从子节点列表中移除 oldChild 所指示的子节点,并将其返回。
Node getParentNode()
此节点的父节点。
String getTextContent()
此属性返回此节点及其后代的文本内容。
void setTextContent(String textContent)
此属性返回此节点及其后代的文本内容。
在得到的NodeList集合中有下列方法可以实现遍历:
int getLength()
列表中的节点数。
Node item(int index)
返回集合中的第 index 个项。
在对Document对象进行更新操作时,都是在内存中进行的。如果想要更直观地显示在XML文档中,需要进行回写操作。即:把Document对象又重新写入到XML文件中。
示例:
现有一个XML文档内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
<草帽海贼团>
<船长>路飞</船长>
<厨师>山治</厨师>
<航海士>娜美</航海士>
<船医>乔巴</船医>
<音乐家>贝多芬</音乐家> </草帽海贼团>
<草帽海贼团>
<副船长>索隆</副船长>
<考古学家>罗宾</考古学家>
<狙击手>乌索普</狙击手>
<船工>弗兰奇</船工>
</草帽海贼团>
</海贼王>
需求:将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克
代码如下:
package com.alex; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /*
* 将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克
*/
public class OnePieceTest3 {
public static void main(String[] args) throws Exception {
// 创建解析器
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析目标XML文件
Document document = documentBuilder.parse("src/OnePiece.xml"); // 获得目标元素集合
NodeList list = document.getElementsByTagName("草帽海贼团"); Node node = list.item(0);
NodeList childNodes = node.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node node2 = childNodes.item(j);
String nodeName = node2.getNodeName();
if (nodeName.equals("音乐家"))
node2.setTextContent("布鲁克");
}
// 回写
// 创建转换器
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/OnePiece.xml"));
}
}
修改后XML文档内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
<草帽海贼团>
<船长>路飞</船长>
<厨师>山治</厨师>
<航海士>娜美</航海士>
<船医>乔巴</船医>
<音乐家>布鲁克</音乐家>
</草帽海贼团>
<草帽海贼团>
<副船长>索隆</副船长>
<考古学家>罗宾</考古学家>
<狙击手>乌索普</狙击手>
<船工>弗兰奇</船工>
</草帽海贼团>
</海贼王>
2019-04-05
JavaWeb学习日记----XML的解析的更多相关文章
- JavaWeb学习日记----XML基础
1.XML基础: XML全称为eXtensible Markup Language;即可扩展标记型语言,同HTML一样使用标签来操作.它的可扩展性体现在标签可以由自己定义,可以是中文标签. XML用途 ...
- JavaWeb学习日记----表单提交方式
1.表单提交方式 (1) 使用input控件中的submit提交 代码如下: <!DOCTYPE html> <html lang="en"> <he ...
- JavaWeb学习——web.xml文件说明
JavaWeb学习——web.xml文件说明 摘要:本文主要学习了web.xml文件的作用以及如果配置. 是什么 web.xml文件是用来在JavaWeb项目里面初始化配置信息的,比如:访问的首页.S ...
- JavaWeb学习笔记——XML解析
DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding=&quo ...
- JavaScripts学习日记——XML DTD Schema
今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...
- JavaWeb学习日记----SAX解析XML
1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...
- Javaweb学习笔记——使用Jdom解析xml
一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...
- JavaWeb学习笔记——XML和SAX解析区别
- 【javaweb学习】XML和约束模式
xml:可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 <?xml version="1.0" encoding="g ...
随机推荐
- Ubuntu允许root远程登录配置
1.背景 近期在本地的虚拟机VMware上安装了Ubuntu Server 17.04,由于系统是无界面的,所有操作都需要通过Linux命令进行操作.后来不想直接在服务器上操作,想通过远程工具Xshe ...
- TX-LCN分布式事务Demo实战
1. TX-LCN分布式事务Demo实战 1.1. 原理介绍 1.1.1. 事务控制原理 TX-LCN由两大模块组成, TxClient.TxManager,TxClient作为模块的依赖框架,提供T ...
- NumPy 学习笔记(一)
NumPy: 1.NumPy 是一个功能强大的第三方库(需要自己安装),主要用于对多维数组执行计算: 它提供了大量的库函数和操作,可以帮助程序员更轻松地进行数值计算 2.可以和另外两个第三方库 S ...
- 机器学习入门13 - 正则化:稀疏性 (Regularization for Sparsity)
原文链接:https://developers.google.com/machine-learning/crash-course/regularization-for-sparsity/ 1- L₁正 ...
- Elastic Search 上市了,市值翻倍,这群人财务自由了!
国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分 ...
- linux audit工具
一个不错的博客,可以吸收营养,等读完后再决定写什么? https://www.cnblogs.com/bldly1989/p/7204358.html changelog -------------- ...
- jquery获取radio选中值及遍历
使用jquery获取radio的值,最重要的是掌握jquery选择器的使用,在一个表单中我们通常是要获取被选中的那个radio项的值,所以要加checked来筛选,比如有以下的一些radio项:1.& ...
- 深入理解JavaScript原型:prototype,__proto__和constructor
JavaScript语言的原型是前端开发者必须掌握的要点之一,但在使用原型时往往只关注了语法,其深层的原理并未理解透彻.本文结合笔者开发工作中遇到的问题详细讲解JavaScript原型的几个关键概念, ...
- HPE服务器做raid5阵列
HPE服务器做阵列的详细步骤: 注意:HPE服务器加硬盘需要安装配套的扩展笼~~~ 1.首先服务器开机,出现下图界面按F10. 2.然后在下图中选择HPE interlligent Provision ...
- mysql 开发进阶篇系列 18 MySQL Server(innodb_buffer_pool_size)
从这篇开始,讲innodb存储引擎中,对于几个重要的服务器参数配置.这些参数以innodb_xx 开头. 1. innodb_buffer_pool_size的设置 这个参数定义了innodb存储引擎 ...