精品推荐

  • 国内稀缺优秀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详解相关推荐

  1. XML的概述,.Dom4解析和SAX解析

    1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...

  2. 阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解

    阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确 ...

  3. Java解析XML(DOM解析和SAX解析)

    前言:在程序中访问和操作XML文件一般有两种模型:DOM(文档对象模型)和流模型:在本篇文章中分别对应DOM解析和SAX解析. 目录 1 .DOM解析与SAX解析的相关知识点 1.1 DOM 1.2 ...

  4. XML的SAX解析以及DOM解析和SAX解析区别

    前言: XML解析工具 DOM解析原理:1)JAXP (oracle-Sun公司官方)2)JDOM工具(非官方)3)Dom4J工具(非官方)三大框架(默认读取xml的工具就是Dom4j)....... ...

  5. JavaWeb-05 XML基础(Dom解析和Sax解析)

    JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据 ...

  6. dicom多帧转换_Python解析多帧dicom数据详解

    概述 pydicom是一个常用python DICOM parser.但是,没有提供解析多帧图的示例.本文结合相关函数和DICOM知识做一个简单说明. DICOM多帧数据存储 DICOM标准中关于多帧 ...

  7. Android[中级教程]第六章 XML解析之SAX解析器

    Android[中级教程]第六章 XML解析之SAX解析器 分类: Android中级2011-10-06 01:52 125人阅读 评论(1) 收藏 举报 接上一章,这一章我们就来学习SAX解析器, ...

  8. python3 urlopen_扣丁学堂解析Python3中urlopen()使用详解

    扣丁学堂解析Python3中urlopen()使用详解 2018-07-23 13:31:14 1318浏览 在现如今,2018年Python一直属于IT行业中比较热门技术,那么今天扣丁学堂Pytho ...

  9. UI一揽子计划 15 (XML的解析方式 (SAX解析/ DOM解析) 、JSON 解析)

    一. XML的SAX解析 1).SAX解析   1. 遵守协议      @interfaceRootViewController ()<NSXMLParserDelegate> 2. 声 ...

  10. Tomcat(二):tomcat配置文件server.xml详解和部署简介

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可 ...

最新文章

  1. 语音识别数据集的处理在训练之前
  2. 决策树 随机森林 xgboost_一文搞定XGboost 面试常见问题
  3. Ubuntu 安装配置Git过程记录
  4. 关于使用JQ scrollTop方法进行滚动定位
  5. php 关于日期的知识总结
  6. 数据可视化系列(一):Matplotlib初相识
  7. Servlet、Struts2以及SpringMvc中的线程安全
  8. js正则匹配小数点后2位_正则实践与详解
  9. 基于OpenCV视频帧差分的身高检测
  10. 使用FreeHttp强制登出微信公众号登陆状态(实现~原理)
  11. 头条推荐越来越少是否还要坚持下去
  12. html磁贴模板,文本磁贴模板(列表文件夹)(HTML)
  13. spring学习笔记 (6)使用mybatis操作数据库增删改查
  14. 尤雨溪-写一个mini vue
  15. ChatGPT桌面应用【保姆级教程、亲测可用】mac、windows双系统推荐
  16. 软件需求工程 高校教学平台 软件需求规格说明书 part 1 (重点!!!)
  17. staruml的各类图
  18. 你需要掌握的 Koa 洋葱模型和中间件
  19. 牛客小白月赛8 F-数列操作 (有序表)
  20. 如何通过home brew安装MongoDB macOS

热门文章

  1. 阿里云推出全球云网络人才赋能计划,打造云网络认证体系
  2. 自带公网IP上阿里云 | 凌云时刻
  3. 259年后,中国最大的皇家园林上云了
  4. 顶级赛事,大神现身,速来观战
  5. php随机函数给字加颜色,四种php随机字生成符串的方法
  6. 【三维路径规划】基于matlab麻雀算法求解无人机三维航迹优化问题【含Matlab源码 301期】
  7. 【优化调度】基于matlab粒子群算法求解经济调度优化问题【含Matlab源码 1489期】
  8. 【元胞自动机】基于matlab六边形网格六方元胞自动机【含Matlab源码 1362期】
  9. 【滤波器】基于matlab GUI高通+低通+带通+带阻FIR滤波器设计【含Matlab源码 092期】
  10. 【水果识别】基于matlab GUI RGB+HSV水果成熟度分级系统【含Matlab源码 825期】