成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

推薦幾款Xml解析工具,超好用!

開源
目前許多開源項(xiàng)目中大量采用 DOM4J,例如 Hibernate 框架中就用到 DOM4J 來讀取 XML 配置文件,連 Sun 的 JAXM 也在用 DOM4J。

01、簡(jiǎn)介

XML,一種可擴(kuò)展標(biāo)記語言,通常被開發(fā)人員用來傳輸和存儲(chǔ)數(shù)據(jù),定義也比較簡(jiǎn)單,通常如下方式開頭,用來表述文檔的一些信息。

<?xml version="1.0" encoding="UTF-8"?>

例如下面這個(gè)簡(jiǎn)單的文檔。

<?xml version="1.0" encoding="UTF-8"?>
<site>
  <name>博客網(wǎng)站</name>
  <url>https://www.pzblog.cn</url>
  <desc>技術(shù)學(xué)習(xí)網(wǎng)站</desc>
</site>

其中site、name、url、desc表示標(biāo)簽名稱,內(nèi)容表示標(biāo)簽對(duì)應(yīng)的值。

因 XML 的平臺(tái)無關(guān)性、語言無關(guān)性、系統(tǒng)無關(guān)性等特點(diǎn),給系統(tǒng)之間的數(shù)據(jù)傳輸帶來了極大的便利,廣受開發(fā)者歡迎。

事實(shí)上,在 1996 年誕生之后,XML 逐漸成為了一種通用的數(shù)據(jù)交換格式。

不同的編程語言,解析 XML 的邏輯基本都是一樣的,只不過實(shí)現(xiàn)的語法稍有不同。

今天我們就一起來學(xué)習(xí)一下,采用 Java 編程語言來解析 XML,有哪些方法以及對(duì)應(yīng)的優(yōu)缺點(diǎn)。

經(jīng)過整理,通過 Java 程序解析 XML 文件,目前比較主流的有以下四種方式:

  • DOM 解析
  • SAX 解析
  • JDOM 解析
  • DOM4J  解析

下面我們以如下的 XML 文件為例,分別介紹每種方式的解析實(shí)現(xiàn)。

<?xml version="1.0" encoding="utf-8" ?>
<class>
    <student id="1">
        <name>張三</name>
        <gender>男</gender>
        <age>26</age>
    </student>
    <student id="2">
        <name>里斯</name>
        <gender>男</gender>
        <age>36</age>
    </student>
 <student id="3">
        <name>王五</name>
        <gender>女</gender>
        <age>24</age>
    </student>
</class>

02、、DOM 解析

DOM 的全稱是:Document Object Model,是 Java 中最早支持的一種 XML 解析方式,可以不用依賴任何第三方包,通過 JDK 提供的 w3c 包里面的 api,即可實(shí)現(xiàn)快速解析,代碼編程簡(jiǎn)單。

DOM 解析 XML 文檔的時(shí)候,會(huì)在內(nèi)存中加載整個(gè)文檔來構(gòu)造層次結(jié)構(gòu),因此優(yōu)勢(shì)比較突出:

  • 1.能快速遍歷 XML 中任意節(jié)點(diǎn)數(shù)據(jù),同時(shí)允許應(yīng)用程序?qū)?shù)據(jù)和結(jié)構(gòu)做出更改
  • 2.可以在任何時(shí)候在樹中上下導(dǎo)航,獲取和操作任意部分的數(shù)據(jù)

當(dāng)然也有缺點(diǎn):

  • 加載小的 XML 文檔問題不大,加載大的 XML 文檔,內(nèi)存消耗會(huì)很大,有內(nèi)存溢出的風(fēng)險(xiǎn)

總的來說,DOM 解析方式,對(duì)于數(shù)據(jù)量比較小的 XML 文檔,基本夠用。

實(shí)現(xiàn)過程如下:

import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;

public class DomDemo {
    
    public static void main(String[] args) {
        // 1.獲取xml文件流
        InputStream inputStream = DomDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.創(chuàng)建DocumentBuilderFactory對(duì)象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 3.創(chuàng)建DocumentBuilder對(duì)象
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse(inputStream);
            NodeList stdList = d.getElementsByTagName("student");
            for (int i = 0; i <stdList.getLength() ; i++) {
                Node std = stdList.item(i);
                // 遍歷標(biāo)簽屬性
                NamedNodeMap attrs = std.getAttributes();
                for(int j=0; j< attrs.getLength(); j++){
                    Node attr = attrs.item(j);
                    System.out.println(attr.getNodeName()+":"+attr.getNodeValue());
                }
                // 遍歷標(biāo)簽子節(jié)點(diǎn)
                NodeList childNodes = std.getChildNodes();
                for (int k = 0; k <childNodes.getLength() ; k++) {
                    if (childNodes.item(k).getNodeType()== Node.ELEMENT_NODE) {
                        System.out.println(childNodes.item(k).getNodeName() + ":" + childNodes.item(k).getTextContent());
                    }
                }
                System.out.println("==============");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運(yùn)行結(jié)果如下:

id:1
name:張三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

03、SAX 解析

SAX 的全稱是:Simple API for XML,也是 JDK 提供的另一種 XML 解析方式。

相比于 DOM,SAX 每次解析只在內(nèi)存中加載 XML 文件的一小部分,即使針對(duì)較大的 XML 文件,它也不需要占用太多的內(nèi)存,也不會(huì)存在內(nèi)存溢出的問題。

優(yōu)點(diǎn)如下:

  • 采用事件驅(qū)動(dòng)模式一段一段的來解析數(shù)據(jù),占用內(nèi)存小
  • 只在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),不需要保存在內(nèi)存中
  • 效率和性能較高,能解析大于系統(tǒng)內(nèi)存的文檔

當(dāng)然也有缺點(diǎn):

  • 與 DOM 解析器相比,使用 SAX 解析器讀取 XML 文件時(shí),解析邏輯比較復(fù)雜
  • 同時(shí)無法定位文檔層次,很難同時(shí)訪問同一文檔的不同部分?jǐn)?shù)據(jù),不支持 XPath

實(shí)現(xiàn)過程如下:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public class SAXDemo {

    public static void main(String[] args) throws Exception {
        // 1.獲取xml文件流
        InputStream inputStream = SAXDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.獲取SAXParserFactory實(shí)例
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 3.獲取SAXparser實(shí)例
        SAXParser saxParser = factory.newSAXParser();
        // 4.創(chuàng)建Handel對(duì)象
        SAXDemoHandel handel = new SAXDemoHandel();
        // 5.解析XML文件
        saxParser.parse(inputStream, handel);
        // 6.獲取讀取結(jié)果
        List<Map<String, String>> students = handel.getStudents();
        for (Map<String, String> student : students) {
            System.out.println(student.toString());
        }
    }
}
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SAXDemoHandel extends DefaultHandler {

    private String value;

    private Map<String, String> student;

    private List<Map<String, String>> students = new ArrayList<>();

    public List<Map<String, String>> getStudents() {
        return students;
    }

    /**
     * xml 解析開始
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("xml 解析開始");
    }

    /**
     * xml 解析結(jié)束
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("xml 解析結(jié)束");
    }

    /**
     * 解析 XML 元素開始
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        System.out.println("開始遍歷節(jié)點(diǎn):" +  qName);

        if (qName.equals("student")){
            student = new HashMap<>();
            for(int i=0; i<attributes.getLength();i++){
                student.put(attributes.getQName(i), attributes.getValue(i));
            }
        }
    }

    /**
     * 解析 XML 元素結(jié)束
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        System.out.println("節(jié)點(diǎn)遍歷結(jié)束:" +  qName);

        if(qName.equals("student")){
            students.add(student);
            student = null;
        } else if(qName.equals("name") || qName.equals("gender") || qName.equals("age")){
            student.put(qName, value);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);

        // 獲取節(jié)點(diǎn)值數(shù)組
        value = new String(ch,start,length).trim();
        if (!value.equals("")) {
            System.out.println(value);
        }
    }
}

運(yùn)行結(jié)果如下:

{gender=男, name=張三, id=1}
{gender=男, name=里斯, id=2}
{gender=女, name=王五, id=3}

04、JDOM 解析

JDOM 是 Java 生態(tài)中一個(gè)非常優(yōu)秀的 XML 開源文檔解析庫,你可以把它看成是 DOM 及 SAX 的結(jié)合版,同時(shí)在設(shè)計(jì)上彌補(bǔ)了 DOM 及 SAX 在實(shí)際應(yīng)用當(dāng)中的不足之處。

優(yōu)點(diǎn)如下:

  • 基于樹的模型處理 XML 文件,數(shù)據(jù)會(huì)加載在內(nèi)存中
  • 沒有向下兼容的限制,因此比 DOM 簡(jiǎn)單
  • 速度快,缺陷少
  • 具有 SAX 的解析特征
  • API 比 DOM 更容易理解

當(dāng)然也有缺點(diǎn):

  • 能處理大于內(nèi)存的 XML 文檔
  • 不支持與 DOM 中相應(yīng)遍歷包

總體來講,JDOM 對(duì)于大多數(shù)需要使用 XML 應(yīng)用程序來說還是非常實(shí)用的。

實(shí)現(xiàn)過程如下:

<!--jdom -->
<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>1.1.3</version>
</dependency>
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import java.io.InputStream;
import java.util.List;


public class JdomDemo {

    public static void main(String[] args) throws Exception {
        // 1.獲取xml文件流
        InputStream inputStream = JdomDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.創(chuàng)建SAXBuilder對(duì)象
        SAXBuilder saxBuilder = new SAXBuilder();
        // 3.將輸入流加載到build中
        Document document = saxBuilder.build(inputStream);
        // 4.獲取根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        // 5.獲取子節(jié)點(diǎn)
        List<Element> children = rootElement.getChildren();
        for (Element child : children) {
            List<Attribute> attributes = child.getAttributes();
            // 遍歷標(biāo)簽屬性
            for (Attribute attr : attributes) {
                System.out.println(attr.getName()+":"+attr.getValue());
            }
            // 遍歷標(biāo)簽子節(jié)點(diǎn)
            List<Element> childrenList = child.getChildren();
            for (Element  o: childrenList) {
                System.out.println(o.getName() + ":" + o.getValue());
            }
            System.out.println("==============");
        }
    }
}

運(yùn)行結(jié)果如下:

id:1
name:張三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

05、DOM4J 解析

DOM4J 也是 Java 生態(tài)中一款非常非常優(yōu)秀的 XML 開源文檔解析庫,是 JDOM 的升級(jí)品。

最初,它是 JDOM 的一種分支,后來合并了許多超出基本 XML 文檔表示的功能,最后單獨(dú)作為一工具對(duì)外發(fā)布。

優(yōu)點(diǎn)如下:

  • 性能優(yōu)異,功能強(qiáng)大,極端易使用
  • 開發(fā)簡(jiǎn)便,同時(shí)也提供了一些提高性能的代替方法
  • 支持 XPath

唯一的缺點(diǎn):

  • API 過于復(fù)雜

實(shí)現(xiàn)過程如下:

<!-- dom4j -->
 <dependency>
     <groupId>dom4j</groupId>
     <artifactId>dom4j</artifactId>
     <version>1.6.1</version>
</dependency>
public class Dom4jDemo {

    public static void main(String[] args) throws Exception {
        // 1.獲取xml文件流
        InputStream inputStream = Dom4jDemo.class.getClassLoader().getResourceAsStream("demo.xml");
        // 2.創(chuàng)建Reader對(duì)象
        SAXReader reader = new SAXReader();
        // 3.加載xml
        Document document = reader.read(inputStream);
        // 4.獲取根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        // 5.遍歷元素
        Iterator iterator = rootElement.elementIterator();
        while (iterator.hasNext()){
            Element stu = (Element) iterator.next();
            // 遍歷標(biāo)簽屬性
            List<Attribute> attributes = stu.attributes();
            for (Attribute attribute : attributes) {
                System.out.println(attribute.getName() + ":" + attribute.getValue());
            }

            // 遍歷標(biāo)簽子節(jié)點(diǎn)
            Iterator iterator1 = stu.elementIterator();
            while (iterator1.hasNext()){
                Element stuChild = (Element) iterator1.next();
                System.out.println(stuChild.getName()+":"+stuChild.getStringValue());
            }
            System.out.println("==============");
        }
    }
}

運(yùn)行結(jié)果如下:

id:1
name:張三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============

06、小結(jié)

最后總結(jié)一下,目前許多開源項(xiàng)目中大量采用 DOM4J,例如 Hibernate 框架中就用到 DOM4J 來讀取 XML 配置文件,連 Sun 的 JAXM 也在用 DOM4J。

因此對(duì)于需要使用 XML 解析工具,如果項(xiàng)目中沒有什么包袱,首選 DOM4J。

對(duì)于一些已經(jīng)在項(xiàng)目中用到的 XML 解析工具,如果不考慮移植性問題,也可以改成 DOM4J 來實(shí)現(xiàn),當(dāng)然具體問題具體分析,如果遷移成本很高,以前的工具依然能正常運(yùn)行,也沒必要進(jìn)行遷移??傊褪?,適合的才是最好的,是否值得遷移,需要評(píng)估資源成本和時(shí)間以及必要性。

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2020-08-12 09:35:23

Docker工具開源

2020-11-12 10:00:56

Kubernetes工具Linux

2015-07-30 11:29:07

Web程序員CSS工具

2020-11-26 15:17:24

SQL數(shù)據(jù)庫工具

2021-07-16 16:47:40

命令行工具開源

2021-03-12 14:52:18

插件VS Code工具

2021-04-01 10:22:42

工具Linux文件

2021-03-15 14:09:49

電腦軟件安全

2021-04-11 09:51:25

Redis可視化工具

2010-06-28 13:27:51

常用UML建模工具

2021-11-26 10:36:36

瀏覽器插件谷歌

2014-04-09 10:51:56

iOS開發(fā)常用工具

2019-12-16 15:16:29

工具代碼開發(fā)

2010-07-14 13:57:30

Perl開發(fā)工具

2020-07-16 14:20:12

Docker管理工具Linux

2022-08-09 07:32:03

MySQLWindowsLinux

2020-02-24 19:40:22

WindowsSSH客戶端

2017-10-16 15:49:31

Linux閱讀器電子書

2023-08-05 14:13:53

項(xiàng)目管理工具

2019-12-23 14:17:46

數(shù)據(jù)可視化工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 日本亚洲欧美 | 久久精品国产亚洲夜色av网站 | 成人国产精品色哟哟 | 亚洲一区在线播放 | 亚洲欧美成人在线 | 国产999精品久久久久久 | 天天干精品 | 免费黄色的网站 | 久久久免费电影 | 国产精品日韩 | 一区二区久久 | 国产欧美日韩一区二区三区在线 | 亚洲欧美在线视频 | 在线免费观看色 | 中文字幕免费在线观看 | 国产精品久久国产精品99 gif | 国产视频线观看永久免费 | 蜜桃特黄a∨片免费观看 | 久久黄色精品视频 | 国产japanhdxxxx麻豆 | 一级毛片大全免费播放 | 激情欧美一区二区三区中文字幕 | 国产一区二区欧美 | 一区二区三区在线 | 九九热这里 | 大香网伊人 | 欧美一区二区三区在线 | 好姑娘影视在线观看高清 | 欧美又大粗又爽又黄大片视频 | 午夜视频网 | 色综合久久久久 | 日日摸夜夜添夜夜添精品视频 | 午夜小影院 | 国产高清自拍视频在线观看 | 性高朝久久久久久久3小时 av一区二区三区四区 | 自拍视频网站 | 日韩视频在线免费观看 | 亚洲精品一区国产精品 | 嫩草网 | 亚洲国产精品视频 |