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,上手基本是分分钟的事情。

转载于:https://www.cnblogs.com/ZeroMZ/p/11407731.html

Java-XML解析第一篇主流开源类库解析XML相关推荐

  1. JAVA消息(第一篇)JMS 很重要!!!!包教包会!!不闹!!!下一篇-AMQP(wire-level protocol)

    如果看完:进入第二篇AMQP 首先大致讲一下,java 消息模块 消息,个人理解分为两种:1.同步消息(RPC调用) 2.异步消息(本篇讲解部分) 一.同步消息java提供了多种方案: 最新比较常用的 ...

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

    频道:商业, 科技, 社会 类型:文章 标签:创业, IT 原文标题:6 reasons why my VC funded startup did fail(查看原文推荐) 原文作者:Stephan ...

  3. Java队列学习第一篇之列介绍

    在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchronized(下文简称:sync)和 ...

  4. 漫漫java路:第一篇 误上贼船

    开场白:还是觉得有自我介绍一下的必要,以避免大家把我误认为高手了(其实只是一条可怜的菜青虫!). 本人大懒人一个,2004.7大学毕业(专业:化工).7月第一次参加工作,待遇还不错.可惜天有不测风云, ...

  5. 辛星Java动态规划教程第一篇:求斐波那切数列

    对于理解动态规划来说,最简单的题目还是求斐波那切数列的第i个值.很多资料都把它作为一个印子,以此来介绍动态规划的基本定义. 不过也有些书认为菲波那切数列过于简单,以致于不能让读者感受到动态规划的优美之 ...

  6. IT创业失败案例解析 - 第一篇(转)

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

  7. esp8266解析php,ESP8266 Bootloader开源代码解析之rboot(一)

    前言 在非Linux的嵌入式开发中,自己手写Bootloader是很正常的事.因为可以定制自己想要的功能.比如定制自己的Bootloader通信接口(UART.I2C.SPI),通信协议,甚至更高级的 ...

  8. Java并发编程|第二篇:线程生命周期

    文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...

  9. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  10. Java解析xml文件dom4j篇(基于xml配置文件完成Excel数据的导入、导出功能完整实现)

    DOM4J解析XML文件 dom4j是一个Java的XML API,是jdom的升级产品,用来读写XML文件.另外对比其他API读写XML文件,dom4j是一个十分优秀的JavaXML API,具有性 ...

最新文章

  1. 阿里、腾讯、美团、小米……各公司月饼大PK,看完简直想哭泣!
  2. mysql事务实现数据更新_MySql事务select for update及数据的一致性处理讲解
  3. 为什么在使用get时,Properties对象总是忽略默认值?
  4. ADO.NET知识要点
  5. 如何查看CRM WebUI,C4C和Hybris里的页面技术信息
  6. Javascript图像处理——图像形态学
  7. C语言自增自减运算辨析
  8. 学习zookeeper基础知识
  9. python能学到什么-学习python三个月能学到什么?
  10. [转载] OpenCV-Python图像位与运算bitwise_and函数详解
  11. Pouch Container与Kubernetes相比效率如何?
  12. 如何写好一篇技术型文档?
  13. js实现复制input隐藏域的取巧做法
  14. 仿拼多多砍价功能玩法解说
  15. 微命令、微指令、微操作
  16. 星瞳科技 OpenMV 的使用
  17. 解决 Python 报错SyntaxError: Missing parentheses in call to 'print'
  18. Graphql是什么
  19. USB之Cyusb3014芯片原理之三GPIF原理(十一) 2022-03-08
  20. Qt信号和槽函数连接不成功原因

热门文章

  1. 编译OpenJDK8-u332:/bin/sh: 1: [: -a: unexpected operator/line 0: [: too many arguments
  2. 转载:相同版本的JVM和Java应用,在 x86 和AArch64 平台性能相差30%
  3. 略谈永中OFFICE的语言国际化
  4. gsettings set org.gnome.desktop.interface scaling-factor 2无效果
  5. NV21转YUV420SP的代码
  6. 一个开发人员,遇到问题一句“加载出错“就完事了?
  7. 开源的东西,只是用来参考学习,要商用路途遥远
  8. LINUX使用sed,字串中包含特殊字符怎么办?
  9. 讨论:寺庙和尚义工不宜说感谢,可以祝福
  10. 化学能推进永远无法实现外星旅行