Java-XML解析第一篇主流开源类库解析XML
1、流行的XML解析框架
1》底层解析方式:存在编码复杂性、难扩展、难复用....。想了解底层解析方式请参考:浅谈 Java XML 底层解析方式
2》Dom4j:基于 JAXP 解析方式,性能优异、功能强大、极易使用的优秀框架。
3》Jdom:本质也是基于 JAXP 但包结构被重新组织, API 大量使用了 Collections 类,在性能上被 dm4j 压了好几个档次。
4》XStream:基于 xmlpull 的 OXMapping 技术,更加倾向于将 XML 解析后映射为 Java 世界中的对象。
2、建立一个简单的demo.xml文件,用于提供给各种方式解析
<?xml version="1.0"?>
<classGrid>
<classGridlb>
<class_id>320170105000009363</class_id>
<class_number>0301</class_number>
<adviser>018574</adviser>
<studentGrid>
<studentGridlb>
<stu_id>030101</stu_id>
<stu_name>齐天</stu_name>
<stu_age>9</stu_age>
<stu_birthday>2008-11-07</stu_birthday>
</studentGridlb>
<studentGridlb>
<stu_id>030102</stu_id>
<stu_name>张惠</stu_name>
<stu_age>10</stu_age>
<stu_birthday>2009-04-08</stu_birthday>
</studentGridlb>
<studentGridlb>
<stu_id>030103</stu_id>
<stu_name>龙五</stu_name>
<stu_age>9</stu_age>
<stu_birthday>2008-11-01</stu_birthday>
</studentGridlb>
</studentGrid>
</classGridlb>
<classGridlb>
<class_id>420170105000007363</class_id>
<class_number>0302</class_number>
<adviser>018577</adviser>
<studentGrid>
<studentGridlb>
<stu_id>030201</stu_id>
<stu_name>马宝</stu_name>
<stu_age>10</stu_age>
<stu_birthday>2009-09-02</stu_birthday>
</studentGridlb>
</studentGrid>
</classGridlb>
</classGrid>
3、Dom4j、Jdom、Xstream不同的解析方式
1》Dom4j方式,性能好,API灵活,支持对 XML 文档的增删改查动作,毕竟是以树模型加载到内存中进行的操作。有可能成为将来的主流。项目结构如下:

pom.xml
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
<exclusions>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
</exclusions>
</dependency>
剔除 xml-apis 的用意 JDK 中已经有对应的类。
App.java
package com.lfy.cn.javaXmlPasareTest; import java.io.File;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; /**
*
*
*/
public class App
{
public static void main( String[] args ) throws DocumentException, ParseException{
String path = System.getProperty("user.dir")+"\\src\\demo.xml";
SAXReader reader = new SAXReader();
Document document = reader.read(new File(path)); List<StudentGridlb> studentGridlbList = new ArrayList<>();
StudentGridlb studentGridlbVo;
for (Object classGridlb : document.getRootElement().elements("classGridlb")) {
Element classGridlbEle = (Element) classGridlb;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
for (Object studentGridlb : classGridlbEle.element("studentGrid").elements("studentGridlb")) {
Element studentGridlbEle = (Element) studentGridlb; studentGridlbVo = new StudentGridlb();
studentGridlbVo.setStu_id(studentGridlbEle.elementTextTrim("stu_id"));
studentGridlbVo.setStu_age(Integer.parseInt(studentGridlbEle.elementTextTrim("stu_age")));
studentGridlbVo.setStu_name(studentGridlbEle.elementTextTrim("stu_name"));
studentGridlbVo.setStu_birthday(format.parse(studentGridlbEle.elementTextTrim("stu_birthday")));
studentGridlbList.add(studentGridlbVo);
}
}
System.out.println(studentGridlbList);
}
}
运行结果:

2》Jdom,基于树处理 XML,需要将树加载到内存中,所以解析大文件对内存的要求比较高。支持对 XML 文档的增删改查动作,毕竟是以树模型加载到内存中进行的操作。解析速度还可以。
pom.xml
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
JdomTest.java
package com.lfy.cn.javaXmlPasareTest; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List; import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter; /**
*
*
*/
public class JdomTest
{
public static void main( String[] args ) throws ParseException, FileNotFoundException, IOException, JDOMException{ String path = System.getProperty("user.dir")+"\\src\\demo.xml"; SAXBuilder jdomsaxBuilder = new SAXBuilder(false);
Document doc = jdomsaxBuilder.build(path);
Element rootElement = doc.getRootElement(); List<StudentGridlb> studentGridlbList = new ArrayList<>();
StudentGridlb studentGridlb;
for (Object classGridlb : rootElement.getChildren("classGridlb")) {
Element classGridlbEle = (Element) classGridlb;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
for (Object studentGrid : classGridlbEle.getChild("studentGrid").getChildren("studentGridlb")) {
Element studentGridEle = (Element) studentGrid;
studentGridlb = new StudentGridlb();
studentGridlb.setStu_id(studentGridEle.getChildTextTrim("stu_id"));
studentGridlb.setStu_age(Integer.parseInt(studentGridEle.getChildTextTrim("stu_age")));
studentGridlb.setStu_name(studentGridEle.getChildTextTrim("stu_name"));
studentGridlb.setStu_birthday(format.parse(studentGridEle.getChildTextTrim("stu_birthday")));
studentGridlbList.add(studentGridlb);
}
}
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, new FileOutputStream(path));
System.out.println(studentGridlbList);
}
}
3》Xstream:基于注解不需要其它辅助类或映射文件 的OXMapping 技术。可以将 JavaBean 序列化为 XML,或将 XML 反序列化为 JavaBean,使得XML序列化不再繁琐。也可以将 JavaBean 序列化成 Json 或反序列化,使用非常方便。没有映射文件而且底层使用 xmlpull 推模型解析 XML,高性能、低内存占用,结合简洁明了的 API,上手基本是分分钟的事情。
Java-XML解析第一篇主流开源类库解析XML的更多相关文章
- 浅谈 Java 主流开源类库解析 XML
在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...
- XML基础<第一篇>
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- Service Mesh 及其主流开源实现解析(转)
什么是 Service mesh Service Mesh 直译过来是 服务网格,目的是解决系统架构微服务化后的服务间通信和治理问题.服务网格由 sidecar 节点组成.在介绍 service me ...
- IT创业失败案例解析 - 第一篇
创业启示录:创业失败报告这个系列包括30多家创业公司的失败案例分析.本文就有由其中一家IT创业公司的CTO所撰写.还是那句老话,成功的故事固然非常鼓舞人心,但我们也可以从失败故事中学到很多. 以下是译 ...
- 从零开始搭建Java开发环境第一篇:Java工程师必备软件大合集
1.JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 目前主流的JDK版 ...
- Apktool源码解析——第一篇
著名的apktool是android逆向界用的最普遍的一个工具,这个项目的原始地址在这里http://code.google.com/p/android-apktool/,但是你们都懂的在天朝谷歌是无 ...
- Spring源码解析 | 第一篇 :IntelliJ IDEA2019.3编译Spring5.3.x源码
前言 工欲善其事必先利其器.学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境.这样方便我们在本地环境添加注释.断点追踪.查看类或接口的继承关系等等,更加高效的学习Spring源码.个 ...
- tornado解析 第一篇
一.tornado介绍 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 we ...
- java 线程池第一篇 之 ThreadPoolExcutor
一:什么是线程池? java 线程池是将大量的线程集中管理的类,包括对线程的创建,资源的管理,线程生命周期的管理.当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程.减少系统资源的 ...
随机推荐
- Docker 内pip安装package报错: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'
说来奇幻(对本菜来说, 经常遇到堪称奇幻的问题) 之前在docker里面各种安装都没问题, 也不知道什么引起的, 昨天晚上调试的时候卸载了一个包的版本,然后就安不上了. 宿主机安装依然各种流畅,唯独d ...
- 16 | “order by”是怎么工作的? 学习记录
<MySQL实战45讲>16 | “order by”是怎么工作的? 学习记录http://naotu.baidu.com/file/0be0e0acdf751def1c0ce66215e ...
- ztree 获取CheckBox选中节点时,不获取选中上级父节点
//将第三个参数改为false,表示不去勾选父节点下的所有子节点 zTreeObj.checkNode(node, true, false); setting.check.chkboxType = { ...
- Sublime3 配置node.js 环境 The process "node.exe" not found
配置中文显示调试结果 [下载地址](https://github.com/tanepiper/SublimeText-Nodejs) 1. 到上述地址下载压缩文件 2.将文件解压到sublime的插件 ...
- 失控的未来交通工具 (LOJ 508,带权并查集,数论)
LOJ 508 失控的未来交通工具 (带权并查集 + 数论) $ solution: $ 很综合的一道难题.看了让人不知所措,数据范围又大,题目描述又不清晰.只能说明这道题有很多性质,或者很多优化. ...
- hbase完全分布式搭建
1.解压缩hbase的软件包,使用命令: tar -zxvf hbase-1.3.0-bin.tar.gz 2.进入hbase的配置目录,在hbase-env.sh文件里面加入java环境变量.即: ...
- import Vue form 'vue' 解释
- webstorm 点击右上角运行run 启动vue项目
点击右上角框 -> 编辑结构 点击加号 新增一个npm项目 前提:node环境已经安装完成,npm包管理器 1.进行定位到项目的路径2.安装依赖包,npm install3.启动服务,npm r ...
- STM32内部硬核的认识
STM32内部含有硬核,对于一些协议(例如:UART,SPI,IIC,CRC等)我们只要调用硬核就可以了,同时我们也可以自己写通信协议. 这些硬核最终肯定是要有引脚输出的,这就是为什么STM32的引脚 ...
- (3.2)狄泰软件学院C++课程学习剖析三
对课程前面40课的详细回顾分析(一) 0. int main() { // ① Array t(3,3); //普通模式 // ② Array *t=new Array(3,3); //指针方式 // ...