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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM