dom4j解析xml_JAVADom、Sax解析XML详解
精品推荐
国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布!
Docker快速手上视频教程(无废话版)【免费】
作者:NQian
转载自:
https://www.cnblogs.com/lifexy/p/12025336.html
在JAVA中,解析有三种方式:
Dom解析(支持改删,耗内存)、
Sax解析(不支持改删,不耗内存)、
Pull解析(在Android中推荐使用的一种解析XML的方式,在下章学习)、
1.支持Dom与Sax解析的开发包
分为两种.
JAXP: 由sun公司推出的解析标准实现(本章只学习该包的解析方法)
Dom4j: 一种开源的解析开发包.
jaxp是java api中自带的一个包,而dom4j需要我们加入jar文件才能使用
2.JAXP使用
JAXP(Java API for XMLProcessing)主要由下面几个包组成:
org.w3c.dom: 定义DOM解析器的标准接口
org.w3c.sax: 定义SAX解析器的标准接口
javax.xml:提供解析xml文档的类
javax.xml.parsers:提供了用来获取DOM和SAX解析器对象的工厂类,比如:DocumentBuilderFactory(创建DOM解析器对象)、SAXParserFactory,如下图所示:
3.使用JAXP进行DOM解析
会将XML文档全部内容都读入内存中,并且将文档里的每个数据都创建为一个个对象,所以方便增删改.并且遍历简单。
DOM的缺点主要表现在:效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用。
3.1 persons.xml示例如下:
<?xml version="1.0" encoding="UTF-8"?><persons> <person> <姓名>张三姓名> <性别>男性别> <年龄>22年龄> person> <person> <姓名>李四姓名> <性别>男性别> <年龄>17年龄> person>persons>
3.2 DOM读取xml步骤
1.通过DocumentBuilderFactory.newInstance()静态方法得到创建 DOM 解析器的工厂对象(DocumentBuilderFactory)
2.通过工厂对象的newDocumentBuilder()方法得到 DocumentBuilder解析器对象
3.然后通过DocumentBuilder解析器对象的parse(filename)方法来得到解析xml文档的Document对象
4.通过Document对象的成员方法来获取XML文档的元素信息,比如getElementsByTagName("person")方法来获取xml文件中的person元素(返回的类为NodeList,保存person所有的集合,比如list.item(0). getTextContent()打印第一个元素的内容)
具体实现方法如下:
@Test public void DomReadXml() throws Exception{ //获取工厂实例 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //创建builder DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //解析xml Document document = documentBuilder.parse("src//persons.xml"); //读出元素内容 System.out.println("第一个姓名:"+document.getElementsByTagName("姓名").item(0).getTextContent()); //读出元素内容 System.out.println("第二个姓名:"+document.getElementsByTagName("姓名").item(1).getTextContent()); }
打印:
3.3 DOM修改xml步骤
1.先将xml信息读取到Document对象中
2.然后通过getElementsByTagName("person")方法来获取xml文件中的person元素(返回的类为NodeList),然后通过NodeList.item(i).setTextContent("text")来修改节点内容
3.修改完成后通过Transformer类的transform(Source , Result )方法来将改过的Document对象写入XML文件
具体实现方法如下:
@Test public void DomWriteXml() throws Exception{ DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); //1.先将xml信息读取到Document对象中 Document document = documentBuilder.parse("src//persons.xml"); //2.修改第一个节点内容为99 document.getElementsByTagName("年龄").item(0).setTextContent("99"); //3.通过transform(Source , Result )方法来将改过的Document对象写入XML文件 Transformer transformer = TransformerFactory.newInstance().newTransformer(); Source xmlSource = new DOMSource(document); Result outputTarget = new StreamResult("src//persons.xml"); transformer.transform(xmlSource, outputTarget); }
4.使用JAXP进行SAX解析
sax解析的优点是边读边解析,占用内存少,解析速度快,缺点是不能对XML文件改删,并且不支持向后遍历,只能从头到尾读取.
4.1 SAX读取XML步骤
1.获取SAXParser对象,该对象通过SAXParserFactory构造
2.通过SAXParser.getXMLReader()获取XMLReder对象
3.实现一个ContentHandler的子类(PersonHandler),其实就是构造一个DefaultHandler的子类(因为contentHandler接口太多方法没实现),如下图所示:
然后重写startElement()等方法(用来实现具体的XML读取)
4.再调用XMLReder对象的setContentHandler(new PersonHandler())来设置我们要解析的具体handler
5.最后调用XMLReder对象的parse(file),开始进行解析
4.2 Myhandler需要重写的方法有以下几个
startDocument(); //当文档开始解析时,触发该方法endDocument(); //当文档解析完成时,触发该方法startElement(String uri, String localName, String qName, Attributes attributes)//解析到开始元素时,触发该方法endElement(String uri, String localName, String qName)//解析到结束元素时,触发该方法//uri:名称空间URI,如果元素没有名称空间,没有则为空字符串。//localName:本地名称(不带前缀),没有则为空字符串。//qName:元素名(带有前缀),如果元素名不可用则为空字符串。//attributes:该元素的所有属性。如果没有属性,则为空对象.characters(char[] ch, int start, int length)//接收字符内容时,触发该方法,比如"李四姓名>",当解析到"李四"时,会调用到该方法,并将"李四"作为参数传递进来.
4.3 persons.xml示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><persons> <person> <姓名>张三姓名> <性别>男性别> <年龄>99年龄> person> <person> <姓名>李四姓名> <性别>男性别> <年龄>17年龄> person>persons>
4.4 Person类如下所示:
public class Person { private String name; private String sex; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]"; }}
4.5 SaxParseTest类如下所示:
package com.my.xmlparser;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.junit.Test;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import com.my.bean.Person;class PersonHandler extends DefaultHandler{ private String status=null; private ArrayList persons=null; private Person person=null; @Override public void startDocument() throws SAXException { persons = new ArrayList(); person = new Person(); } @Override public void endDocument() throws SAXException { for(Person person1:persons){ //打印所有信息 System.out.println(person1); } } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { status = qName; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { status =null; if("person".equals(qName)) //添加一个person { persons.add(person); person = new Person(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String text = new String(ch,start,length); if(status == null) return; else if("姓名".equals(status)) { person.setName(text); } else if("性别".equals(status)) { person.setSex(text); } else if("年龄".equals(status)) { person.setAge(text); } }}public class SaxParseTest { @Test public void SaxParse() throws Exception{ //1.获取SAXParser对象,该对象通过SAXParserFactory构造 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); SAXParser saxParser = saxParserFactory.newSAXParser(); //2.通过SAXParser.getXMLReader()获取XMLReder对象 XMLReader reader = saxParser.getXMLReader(); //3~4:实现一个ContentHandler的子类(Myhandler),然后来设置我们要解析的具体handler reader.setContentHandler(new PersonHandler()); //5.最后调用XMLReder对象的parse(file),开始进行解析 reader.parse("src//persons.xml"); }}
测试运行:
dom4j解析xml_JAVADom、Sax解析XML详解相关推荐
- XML的概述,.Dom4解析和SAX解析
1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...
- 阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解
阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确 ...
- Java解析XML(DOM解析和SAX解析)
前言:在程序中访问和操作XML文件一般有两种模型:DOM(文档对象模型)和流模型:在本篇文章中分别对应DOM解析和SAX解析. 目录 1 .DOM解析与SAX解析的相关知识点 1.1 DOM 1.2 ...
- XML的SAX解析以及DOM解析和SAX解析区别
前言: XML解析工具 DOM解析原理:1)JAXP (oracle-Sun公司官方)2)JDOM工具(非官方)3)Dom4J工具(非官方)三大框架(默认读取xml的工具就是Dom4j)....... ...
- JavaWeb-05 XML基础(Dom解析和Sax解析)
JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据 ...
- dicom多帧转换_Python解析多帧dicom数据详解
概述 pydicom是一个常用python DICOM parser.但是,没有提供解析多帧图的示例.本文结合相关函数和DICOM知识做一个简单说明. DICOM多帧数据存储 DICOM标准中关于多帧 ...
- Android[中级教程]第六章 XML解析之SAX解析器
Android[中级教程]第六章 XML解析之SAX解析器 分类: Android中级2011-10-06 01:52 125人阅读 评论(1) 收藏 举报 接上一章,这一章我们就来学习SAX解析器, ...
- python3 urlopen_扣丁学堂解析Python3中urlopen()使用详解
扣丁学堂解析Python3中urlopen()使用详解 2018-07-23 13:31:14 1318浏览 在现如今,2018年Python一直属于IT行业中比较热门技术,那么今天扣丁学堂Pytho ...
- UI一揽子计划 15 (XML的解析方式 (SAX解析/ DOM解析) 、JSON 解析)
一. XML的SAX解析 1).SAX解析 1. 遵守协议 @interfaceRootViewController ()<NSXMLParserDelegate> 2. 声 ...
- Tomcat(二):tomcat配置文件server.xml详解和部署简介
1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可 ...
最新文章
- 语音识别数据集的处理在训练之前
- 决策树 随机森林 xgboost_一文搞定XGboost 面试常见问题
- Ubuntu 安装配置Git过程记录
- 关于使用JQ scrollTop方法进行滚动定位
- php 关于日期的知识总结
- 数据可视化系列(一):Matplotlib初相识
- Servlet、Struts2以及SpringMvc中的线程安全
- js正则匹配小数点后2位_正则实践与详解
- 基于OpenCV视频帧差分的身高检测
- 使用FreeHttp强制登出微信公众号登陆状态(实现~原理)
- 头条推荐越来越少是否还要坚持下去
- html磁贴模板,文本磁贴模板(列表文件夹)(HTML)
- spring学习笔记 (6)使用mybatis操作数据库增删改查
- 尤雨溪-写一个mini vue
- ChatGPT桌面应用【保姆级教程、亲测可用】mac、windows双系统推荐
- 软件需求工程 高校教学平台 软件需求规格说明书 part 1 (重点!!!)
- staruml的各类图
- 你需要掌握的 Koa 洋葱模型和中间件
- 牛客小白月赛8 F-数列操作 (有序表)
- 如何通过home brew安装MongoDB macOS
热门文章
- 阿里云推出全球云网络人才赋能计划,打造云网络认证体系
- 自带公网IP上阿里云 | 凌云时刻
- 259年后,中国最大的皇家园林上云了
- 顶级赛事,大神现身,速来观战
- php随机函数给字加颜色,四种php随机字生成符串的方法
- 【三维路径规划】基于matlab麻雀算法求解无人机三维航迹优化问题【含Matlab源码 301期】
- 【优化调度】基于matlab粒子群算法求解经济调度优化问题【含Matlab源码 1489期】
- 【元胞自动机】基于matlab六边形网格六方元胞自动机【含Matlab源码 1362期】
- 【滤波器】基于matlab GUI高通+低通+带通+带阻FIR滤波器设计【含Matlab源码 092期】
- 【水果识别】基于matlab GUI RGB+HSV水果成熟度分级系统【含Matlab源码 825期】