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的更多相关文章

  1. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

  2. XML基础<第一篇>

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  3. Service Mesh 及其主流开源实现解析(转)

    什么是 Service mesh Service Mesh 直译过来是 服务网格,目的是解决系统架构微服务化后的服务间通信和治理问题.服务网格由 sidecar 节点组成.在介绍 service me ...

  4. IT创业失败案例解析 - 第一篇

    创业启示录:创业失败报告这个系列包括30多家创业公司的失败案例分析.本文就有由其中一家IT创业公司的CTO所撰写.还是那句老话,成功的故事固然非常鼓舞人心,但我们也可以从失败故事中学到很多. 以下是译 ...

  5. 从零开始搭建Java开发环境第一篇:Java工程师必备软件大合集

    1.JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 目前主流的JDK版 ...

  6. Apktool源码解析——第一篇

    著名的apktool是android逆向界用的最普遍的一个工具,这个项目的原始地址在这里http://code.google.com/p/android-apktool/,但是你们都懂的在天朝谷歌是无 ...

  7. Spring源码解析 | 第一篇 :IntelliJ IDEA2019.3编译Spring5.3.x源码

    前言 工欲善其事必先利其器.学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境.这样方便我们在本地环境添加注释.断点追踪.查看类或接口的继承关系等等,更加高效的学习Spring源码.个 ...

  8. tornado解析 第一篇

    一.tornado介绍 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 we ...

  9. java 线程池第一篇 之 ThreadPoolExcutor

    一:什么是线程池? java 线程池是将大量的线程集中管理的类,包括对线程的创建,资源的管理,线程生命周期的管理.当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程.减少系统资源的 ...

随机推荐

  1. RAC heartbeat 心跳机制

    世界上最遥远的距离,不是生与死.而是我们同一个集群的两个节点,你却听不到我的心跳. 必要性:维持集群的⼀致性RAC⼼跳机制 – 集群⼼跳基本机制:1.确定节点和节点间的连通性,达到彼此了解2.⽤共享的 ...

  2. vue开发移动端总结

    1.app.vue组件中,外层只能有一个div块,不能多个并列在一起. 正确: 错误: 2.main.js文件 3. app.vue文件 4. stroe.js 文件 5. router.js

  3. LeetCode--098--验证搜索二叉树(python)

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是二叉搜索树. ...

  4. C# 基础:DataTable操作、发邮件

    本文出自:https://www.cnblogs.com/2186009311CFF/p/6865909.html DataTable操作 据参数删除为0的列:包括遍历.删除.取值 public st ...

  5. 8,HashMap子类-LinkedHashMap

    在上一篇随笔中,分析了HashMap的源码,里面涉及到了3个钩子函数(afterNodeAccess(e),afterNodeInsertion(evict),afterNodeRemoval(nod ...

  6. mysql Alias操作符 语法

    mysql Alias操作符 语法 作用:为列名称和表名称指定别名 大理石构件 语法:SELECT column_name(s) FROM table_name AS alias_name mysql ...

  7. #1122 JSP动作元素

    JSP动作元素 与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用.JSP动作元素是用XML语法写成的. 利用JSP动作可以动态地插入文件.重用JavaBean组件.把用户重定向到另外的页面 ...

  8. 关于MonoBehaviour的单例通用规则

    长久以来,对于基于MonoBehaviour的单例总是心有梗结,总觉得用得很忐忑,今天,终于有时间思考和总结了下,理清了想通了.代码和注释如下: 其中GameLogic是我们自己的控制游戏生命周期的管 ...

  9. nginx + tomcat + memcached 做负载均衡及session同步

    1.nginx配置 # For more information on configuration, see: # * Official English Documentation: http://n ...

  10. history历史记录在AJAX下出现异常跳转 [解决]

    事情是这样的,在一个历史记录指针应该在[1, 2, 3, 4]的[3]位置的情况下,出现了历史记录指针指向了[4]的情况,而且是在正常后退事件发生之后,(据我所知)没有代码操作的情况发生的. 这是一个 ...