xpath,sax,DOM解析xml文件(基础)

2023-10-26

基础

XML解析器有二类,分别是DOM和SAX。

DOM

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

很方便对文档进行遍历 对文档curd也特别方便 xml文档比较大的时候,dom解析占用的内存也会比较大,浪费系统资源。所以dom解析这种方式不适合解析大的xml文档。

SAX

解析文件速度快,占用资源(内存)少。 sax解析只适合读取文档数据,不适合对文档进行增删改。


1 DOM一次性将整个XML文件读到内存,形成一个倒状的树形结构
2 SAX多次将整个XML文件读到内存

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:
解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。


3 Document对象代表XML文件在内存中的映像 


 

4 基于dom4j的xpath技术


 能够在xml文件中,快速定位需要元素,无需从根元素一个一个的导航到需要的子元素
    Document.selectNodes():取得所有符合xpath格式的元素
    Document.selectSingleNode():取得所有符合xpath格式的元素的第一个元素
    Node类型是Element/Text/Attribute/Document/...类型的父接口

 

 

 

xpath读取xml

//使用xpath技术取得xml文件中任意级别下的内容
public class Demo1 {
	public static void main(String[] args) throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/cn/feizhou/xml/xpath/car.xml"));
		String xpath = "//单价";
		Element element = (Element) document.selectSingleNode(xpath);
		System.out.println("第一辆汽车的单价是:" + element.getText());
		//List<Element> elementList = document.selectNodes(xpath);
		//System.out.println("第二辆汽车的单价是:" + elementList.get(1).getText());
	}
}

结果:第一辆汽车的单价是:30

sax解析器解析xml文件


import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

//使用sax解析器解析xml文件
public class Demo1 {
	public static void main(String[] args) throws Exception {
		//创建SAX解析器工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//创建SAX解析器
		SAXParser saxParser = factory.newSAXParser();
		//加载xml文件
		saxParser.parse(
				new File("src/cn/feizhou/xml/sax/car.xml"),
				new MyHandler());
	}
}
//自定义SAX处理器
class MyHandler extends DefaultHandler{
	private long begin;
	public void startDocument(){
		System.out.println("解析XML文件开始");
		begin = System.currentTimeMillis();
	} 
	public void endDocument() {
		System.out.println("解析XML文件结束");
		long end = System.currentTimeMillis();
		System.out.println("解析XML共用" + (end-begin) + "毫秒");
	}
	public void startElement(
			String uri, 
			String localName, 
			String qName, 
			Attributes attributes){
		//元素名称
		System.out.println("<"+qName+">");
		//属性数量
		System.out.println("有"+attributes.getLength()+"个属性");
		//属性值
		System.out.println(attributes.getValue("出产时间"));
	} 
	public void endElement(
			String uri, 
			String localName, 
			String qName){
		System.out.println("</"+qName+">");
	} 
	public void characters(
			char[] ch, 
			int start, 
			int length){
		//元素值
		String content = new String(ch,start,length);
		if(content.trim().length()>0){
			System.out.println(content);
		}
	} 
}




结果


解析XML文件开始
<车辆清单>
有0个属性
null
<汽车>
有0个属性
null
<车牌>
有1个属性
2011年
奥迪
</车牌>
<产地>
有0个属性
null
北京
</产地>
<单价>
有0个属性
null
30
</单价>
</汽车>
</车辆清单>
解析XML文件结束
解析XML共用2毫秒








  

 

上面引用的包

dom4j-1.6.1.jar

jaxen-1.1-beta-6.jar

 

使用DOM解析器解析XML文件

1 理解dom解析器机制
  1)dom解析和dom4j原理一致
  2)Node是所有元素的父接口
  3)常用的API:
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();取得DOM解析器工厂
	DocumentBuilder domParser = factory.newDocumentBuilder();取得DOM解析器
	domParser.parse(*.xml)加载需要解析的XML文件
	Document.getDocumentElement()取得XML文件的根元素/节点
	Element.getNodeName():取得根元素
	Element.getElementsByTagName("汽车")取得"汽车"元素的集合
	NodeList.item(i)取得第N个元素,从0开始
	Element.getTextContent():取得元素的文本内容
	Element.getAttributes().getNamedItem("出产时间").getTextContent():取得元素中某属性的值
	document.createElement("汽车");创建新元素
	Element.setTextContent("我的汽车");设置元素的内容
	Element.appendChild(newCarElement);在尾部添加元素
	Element.insertBefore(newCarElement,
			     rootElement.getElementsByTagName("汽车").item(1));在指定的元素前添加元素
	TransformerFactory tf = TransformerFactory.newInstance();创建输出工厂
	Transformer transformer = tf.newTransformer();创建输出对象
	Source source = new DOMSource(document);创建内存的document对象		
	Result result = new StreamResult(new File("XXX/car.xml"));指定输出的目标地点
	transformer.transform(source,result);将document对象输出到xml文件中
        Element.setTextContent("深圳");更新元素的内容
	Element.removeChild(secondCarElement);在父元素基础上删除直接子元素
   4)dom解析器会将空白字符当作有效元素对待 
   5)要让dom解析器将空白字符忽略,必须满足二条件
	a)对XML文件必须写一个DTD约束
	b)factory.setIgnoringElementContentWhitespace(true);
   6)dom类解析器和sax类解析器
	a)dom是一次性加载到内容,形成document对象,人工导航,适合curd
	b)sax是分次性加载到内容,sax解析器导航,但程序员需要编写sax处理器,必须扩展DefaultHandler类


import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Demo2 {
	
	
	 
 
	@Test
	/**
	 * 显示
	 * @return
	 */
		public void showElements() throws Exception{
			Document document = getDocument();
			Element rootElement  = document.getDocumentElement();
			//根元素
			System.out.println("根元素为:"+rootElement.getNodeName());
			//获取标签名为汽车的所有元素
			NodeList nodeList = rootElement.getElementsByTagName("汽车");
			System.out.println("共有:" + nodeList.getLength()+"辆汽车");
			System.out.println("+++++++第一辆汽车的信息+++++++++");
			for(int i=0;i<nodeList.getLength();i++){
				Element element = (Element) nodeList.item(i);
				String band = element.getElementsByTagName("车牌").item(0).getTextContent();
				String place = element.getElementsByTagName("产地").item(0).getTextContent();
				String price = element.getElementsByTagName("单价").item(0).getTextContent();
				String time = element.getElementsByTagName("车牌").item(0).getAttributes().getNamedItem("出产时间").getTextContent();		
				System.out.println("车牌:" + band);
				System.out.println("产地:" + place);
				System.out.println("单价:" + price);
				System.out.println("出产时间:" + time);
			}
		}
	@Test
	/**
	 * 创建元素并插入元素
	 * @throws Exception
	 */
	public void createAndInsert() throws Exception{
		Document document = getDocument();
//		创建元素
		Element newCarElement = document.createElement("汽车");
		newCarElement.setTextContent("我的汽车");
		Element rootElement = document.getDocumentElement();
		//rootElement.appendChild(newCarElement);
//		插入元素
		rootElement.insertBefore(
				newCarElement,
				rootElement.getElementsByTagName("汽车").item(1));
		write2xml(document);
	}
	@Test
	/**
	 * 修改元素
	 * @throws Exception
	 */
	public void update() throws Exception{
		Document document = getDocument();
		//获取元素
		Element secondCarElement = (Element) document.getElementsByTagName("汽车").item(1);
		//修改元素
		secondCarElement.getElementsByTagName("产地").item(0).setTextContent("深圳");
		secondCarElement.getElementsByTagName("车牌").item(0).getAttributes().getNamedItem("出产时间").setTextContent("2012年");
		write2xml(document);
	}
	@Test
	/**
	 * 删除元素
	 * @throws Exception
	 */
	public void delete() throws Exception{
		Document document = getDocument();
//		获取元素
		Element rootElement = document.getDocumentElement();
		Element secondCarElement = (Element) rootElement.getElementsByTagName("汽车").item(1);
		//删除元素
		rootElement.removeChild(secondCarElement);
		write2xml(document);
	}
	/**
	 *将Document写入xml
	 * @param document
	 * @throws Exception
	 */
	private void write2xml(Document document)throws Exception {
		//将内存中的document对象写到外存的xml文件
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		//源
		Source source = new DOMSource(document);
		//目
		Result result = new StreamResult(new File("src/cn/feihzou/xml/dom/car.xml"));
		transformer.transform(source,result);
	}
	/**
	 * 获取Document对象
	 * @return
	 * @throws Exception
	 */
	private static Document getDocument() throws Exception {
//		得到创建 DOM 解析器的工厂。
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//设置dom解析器将空白字符过滤
		factory.setIgnoringElementContentWhitespace(true);
		//DOM 解析器对象
		DocumentBuilder domParser = factory.newDocumentBuilder();
		Document document = domParser.parse(new File("src/cn/feihzou/xml/dom/car.xml"));
		return document;
	}
}






 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xpath,sax,DOM解析xml文件(基础) 的相关文章

  • ReentrantReadWriteLock

    一ReentrantReadWriteLock 是Lock的另一种实现方式 我们知道ReentrantLock是一个排他锁 同一时间只允许一个线程访问 而ReentrantReadWriteLock允许多个读线程同时访问 但不允许写线程和读
  • xpath,sax,DOM解析xml文件(基础)

    基础 XML解析器有二类 分别是DOM和SAX DOM DOM解析器在解析XML文档时 会把文档中的所有元素 按照其出现的层次关系 解析成一个个Node对象 节点 很方便对文档进行遍历 对文档curd也特别方便 xml文档比较大的时候 do
  • Tcp协议中的3次握手与4次挥手过程分析

    转载https blog csdn net u012824097 article details 52490091 客户端与服务端的通信中步骤 1建立Tcp连接 3次握手 2再进行数据传输 3数据传输完成后 断开连接 4次挥手 建立Tcp连
  • Lock锁和Condition条件

    Lock的特性 Lock不是Java语言内置的 synchronized是在JVM层面上实现的 如果代码执行出现异常 JVM会自动释放锁 但是Lock不行 要保证锁一定会被释放 就必须将unLock放到finally 中 手动释放 在资源竞
  • JAVA中的DO、DTO、BO、AO、VO、POJO

    定义 DO Data Object 与数据库表结构一一对应 通过DAO层向上传输数据源对象 DTO Data Transfer Object 数据传输对象 Service或Manager向外传输的对象 BO Business Object
  • 深入理解单例模式:静态内部类单例原理

    本文主要介绍java的单例模式 以及详细剖析静态内部类之所以能够实现单例的原理 OK 废话不多说 进入正文 首先我们要先了解下单例的四大原则 1 构造私有 2 以静态方法或者枚举返回实例 3 确保实例只有一个 尤其是多线程环境 4 确保反序
  • Java开发:如何将model对象与json互相转换?

    model javabean 与json相互转换 文章声明 model对象与json之间互转网上有很多方法 此处只记录一种常用的 并且比较安全便捷的转换方法 使用gson 一 model转换json 1 首先创建一个model实体类 pac
  • java TreeSet 和 TreeMap 源码解读

    目录 一 前言 二 TreeSet详解 1 TreeSet简介 2 TreeSet的底层实现 0 准备工作 1 TreeSet构造器 2 匿名内部类实现接口的多态 3 TreeMap构造器 4 add方法 5 put方法和put方法 6 继
  • Java进阶--编译时注解处理器(APT)详解

    本文同步发布在掘金 未经本人允许不得转载 上篇文章 Java进阶 Java注解及其实例应用 我们使用注解 反射实现了一个仿ButterKnife功能的示例 考虑到反射是在运行时完成的 多少会影响程序性能 因此 ButterKnife本身并非
  • Java进阶--Java垃圾回收机制全面解析

    本文同步发布在我的个人博客 如需转载请注明出处 提起Java的垃圾回收机制大家应该都有所了解 它不仅是面试的常客 也是Java体系中相当重要的一块知识 深入理解Java的GC机制 不仅有助于我们在开发中提高程序的性能 更有了在面试官面前炫
  • java会话技术--02--服务器session共享

    java会话技术 02 服务器session共享 1 原理图 2 代码实现 2 1 接口代码 package cn zhou common web session import java io Serializable import jav
  • java--进阶--1.1--Dom4j--常用api

    java 进阶 1 1 Dom4j 常用api 代码位置 https gitee com DanShenGuiZu learnDemo tree master Dom4j learn 1 SAXReader类的方法 获取Document 文
  • FutureTask 源码 并发设计模式

    一 代码 https www jianshu com p 60f661d95d53 public static void main String args throws Exception Callable
  • Unsafe学习

    一 介绍 一个管理内存的类 Unsafe类是 final 的 不允许继承 且构造函数是private的 使用单列模式模式获取类对象 1 1 测试的类 public class UnsafeBean private static int st
  • java会话技术--03--Session覆盖问题

    java会话技术 03 Session覆盖问题 代码位置 https gitee com DanShenGuiZu learnDemo tree master sessionCookie learn 1 现象 同一域名 同一个服务 不同的端
  • STM32F103ZET6【标准库函数开发】------02.2 按键实现短按、长按、双击的效果(非中断方式)

    一 硬件介绍 正点原子战舰开发板 LED0 PB5 LED1 PE5 KEY0 PA4 二 实现目的 开机LED0 LED1均熄灭 单击KEY0 LED0点亮 LED1熄灭 双击KEY0 LED0熄灭 LED1点亮 长按 LED0 LED1
  • Java多线程两种实现

    在java中实现多线程的方式有两种 一种是继承Thread类 另一个是实现Runnable接口 对于两种实现 各有优缺点 接下来进行对比总结一下 这两种方法 都可以实现多线程 以下为两种实现的写法 继承Thread类的方式 package
  • Kafka3.1安装配置,配置Kafka集群,Zookeeper集群

    1 下载Kafka安装包 Kafka官网下载地址 https kafka apache org downloads 2 解压压缩包 tar zxvf kafka 2 12 3 1 0 tgz c kafka 3 进入配置文件目录 cd ka
  • 什么是Docker容器?一文带你了解,看完直接学会

    一 为什么需要Docker容器 1 引入 1 1麻烦的环境部署 1 在软件开发中 最麻烦的事情之一就是环境配置 在正常情况下 如果要保证程序能运行 我们需要设置好操作系统 以及各种库和组件的安装 2 举例来说 要运行一个Python程序 计
  • SpringBoot整合Druid-Mybatis&SpringSecurity使用

    SpringBoot整合JDBC 创建springBoot项目时首先需要导入JDBC的支持 以及MySQL驱动

随机推荐

  • mac编程提示 Undefined symbol: _OBJC_CLASS_$_xxxx

    使用cocoa编程 编译提示报错 Showing All Issues Undefined symbol OBJC CLASS NSAlert 解决办法 link Binary With Libraries 添加 Foundation fr
  • TNS-12542: TNS: 地址已被占用

    TNS 12542 TNS 地址已被占用 监听该对象时出错 DESCRIPTION ADDRESS PROTOCOL TCP HOST HKY PORT 1521 TNS 12560 TNS 协议适配器错误 TNS 00512 地址已在使用
  • rocketMq中文文档

    title 用户指引 date 2017 12 29 categories 文档翻译 为什么是RocketMQ 动机 在早期阶段 我们在ActiveMQ 5 x 早于5 3 的基础上构建我们的分布式消息中间件 我们的跨国业务使用它来实现异步
  • 将Go程序打包成Docker镜像

    将Go程序打包成Docker镜像 1 Go程序 hello go 文件的内容 package main import fmt func main fmt Println hello world 2 编写Dockerfile文件 FROM g
  • 练习:可迭代的对象和四个函数—— enumerate()、zip()、map()、filter()

    Python 官网 https www python org 这里 才 python 前沿 可惜是英文原版 所以 我要练习英文阅读 我的CSDN主页 My Python 学习个人备忘录 我的HOT博 自学并不是什么神秘的东西 一个人一辈子自
  • a标签的用法,base标签用法

    在前端开发中 经常会遇到 a标签 超链接 a 标签定义超链接 用于从一张页面链接到另一张页面 a 元素最重要的属性是 href 属性 它指示链接的目标 超链接 a href http www baid com target blank 跳转
  • Unity游戏项目_3D迷宫(游戏源码免费)

    目录 一 效果图 二 讲解 三 资源分享 总结 一 效果图 游戏开始界面 游戏画面 游戏结束界面 二 讲解 主要代码如下 1 链接代码 using System Collections using System Collections Ge
  • 浅拷贝与深拷贝

    目录 什么是拷贝 浅拷贝 前端浅拷贝方法 java后端深拷贝方法 深拷贝 前端深拷贝方法 java后端深拷贝方法 需要注意的事情 什么是拷贝 拷贝是指对对象进行复制的操作 是为了创建一个与原对象具有相同值的新对象 以便在不改变原对象的情况下
  • firewalld防火墙配置

    firewalld是自CentOS 7以来带有一个动态的 可定制而无需重新启动防火墙守护程序或服务 firewall cmd就是iptables nftable的前端 在CentOS 8中 nftables取代iptables成为默认的Li
  • python2安装模块出现Command “python setup.py egg_info“ failed with error code 1 in报错

    root jenkins 8f57b8495 4r8ws opt pip install gitpython 2 1 0 i https mirrors aliyun com pypi simple Collecting gitpython
  • Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应

    android有时候需要设置r g b分量的int值 如paint setARGB 255 127 255 212 就需要自己计算下分量的各个值 这里提供一个带有r g b分量的int型的颜色表 注意paint setAlpha 及pain
  • C++文件操作

    程序运行时产生的数据都属于临时数据 程序一旦运行结束都会被释放 通过 文件可以将数据持久化 C 中对文件操作需要包含头文件
  • windows服务器安全管理工具——IISCrypto

    查看服务器是否可以升为TLS1 2 网上有手动改注册表的方案 但这种方式万一误操作就不好了 所以还是建议使用软件修改 推荐下面这个软件 官方网站地址 https www nartac com Products IISCrypto 下载地址
  • cocos2dx 2.2.2 android 编译配置(不用cygwin)

    必备安装环境 java jdk安装以及环境变量 python运行环境 cocos2dx 2 2 2版本是通过python脚本创建的 脚本位置 cocos2d x 2 2 2 tools project creator create proj
  • MySQL的C/C++的API接口

    项目操作MySQL用的是现有的接口 是将MySQL语句封装在动态库里的 今天看了看最底层的情况 才发现操作MySQL不是用Qt 而是它自带的C API 之前没直接用过原生API 今天记录一下 代码连接数据库用的函数是MyConnection
  • 基于深度极限学习机的回归预测方法Matlab实现——附代码

    目录 摘要 极限学习机 变分自编码器 深度极限学习机 本文代码分享 摘要 本文使用深度极限学习进行数据回归预测 极限学习机 ELM 是当前一类非常热门的机器学习算法 被用来训练单隐层前馈神经网络 SLFN 本篇博文尽量通俗易懂地对极限学习机
  • VS2015 出现 解决方案加载失败的问题:解决方案

    完美解决 请移步到大神博客 https blog csdn net qq 31806049 article details 79728377
  • CSS实现悬浮按钮

    其实就是一个返回上一页或者返回到顶部的按钮 效果图 方案一 css实现 主要是利用css画三角实现 html代码 div class el backtop div class btn div div css代码 el backtop hov
  • <使用Python自定义生成简易二维码>——《Python项目实战》

    目录 1 问题导引 2 实现步骤 1 查找并安装第三方库qrcode 2 编写代码并嵌入内置信息 3 使用扫码工具读取信息 后记 由于作者水平有限 文章难免存在谬误之处 敬请读者斧正 俚语成篇 恳望指教 By 作者 新晓 故知 我的CSDN
  • xpath,sax,DOM解析xml文件(基础)

    基础 XML解析器有二类 分别是DOM和SAX DOM DOM解析器在解析XML文档时 会把文档中的所有元素 按照其出现的层次关系 解析成一个个Node对象 节点 很方便对文档进行遍历 对文档curd也特别方便 xml文档比较大的时候 do