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