Java 四种解析 XML 的特点

1、DOM 解析:

形成了树结构,有助于更好的理解、掌握,且代码容易编写。

解析过程中,树结构保存在内存中,方便修改。

2、SAX 解析:

采用事件驱动模式,对内存耗费比较小。

适用于只处理 XML 文件中的数据时

3、JDOM 解析:

仅使用具体类,而不使用接口。

API 大量使用了 Collections 类。

4、DOM4J 解析:

JDOM 的一种智能分支,它合并了许多超出基本 XML 文档 表示的功能。

它使用接口和抽象基本类方法。 具有性能优异、灵活性好、功能强大和极端易用的特点。

是一个开放源码的文件

代码:

先准备一个book.xml文件放到src目录下:

<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001">
<name>三国演义</name>
<author>罗贯中</author>
<price>98.5</price>
</book>
<book id="1002">
<name>水浒传</name>
<author>施耐庵</author>
<price>89.7</price>
</book>
<book id="1003">
<name>西游记</name>
<author>吴承恩</author>
<price>99.9</price>
</book>
<book id="1004">
<name>红楼梦</name>
<author>曹雪芹</author>
<price>77.7</price>
</book>
</books>

1、DOM 解析:

package com.xzlf.xml;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /**
* DOM 解析 XML
* @author xzlf
*
*/
public class DOMParseTest {
public static void main(String[] args) throws Exception {
// 1、创建 DocumentBuilderFactory 工厂对象
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
// 2、通过工厂对象创建 DocumentBuilder 对象
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// 3、通过 DocumentBuilder 的 parse (...) 方法得到Document对象
Document doc = docBuilder.parse("src/book.xml"); // 4、获取节点列表
NodeList bookList = doc.getElementsByTagName("book");
System.out.println(bookList.getLength());
// 遍历节点属性
for (int i = 0; i < bookList.getLength(); i++) {
// 获取每个节点的属性和值
Node item = bookList.item(i);
// 获取属性集合
NamedNodeMap attributes = item.getAttributes();
// 遍历属性集合
for (int j = 0; j < attributes.getLength(); j++) {
Node id = attributes.item(j);
System.out.println(id.getNodeName() + "--" + id.getNodeValue());
}
}
// 遍历子节点
System.out.println("====================");
for (int i = 0; i < bookList.getLength(); i++) {
Node item = bookList.item(i);
NodeList childNodes = item.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node child = childNodes.item(j);
if(child.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(child.getNodeName() + "--" + child.getTextContent());
} } }
}
}

运行:



2、SAX 解析:

package com.xzlf.xml;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* Sax 解析 xml
* @author xzlf
*
*/
public class SAXParseTest {
public static void main(String[] args) throws Exception {
// 1、创建 SAXParserFactory 的对象
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
// 2、创建 SAXParser 对象 (解析器)
SAXParser parser = saxFactory.newSAXParser();
// 3、创建一个 DefaultHandler 的子类
BookHandler handler = new BookHandler();
// 4、调用 parse 方法
parser.parse("src/book.xml", handler);
}
} class BookHandler extends DefaultHandler{
/*开始解析 xml 文档时调用*/
@Override
public void startDocument() throws SAXException {
System.out.println("BookHandler.startDocument()");
} /*解析 xml 文档结束时调用*/
@Override
public void endDocument() throws SAXException {
System.out.println("==========解析文档结束==========");
} /*开始解析文档中节点时调用*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("开始解析元素-->" + qName );
if("book".equals(qName)) {
System.out.println(attributes.getLength());
for (int i = 0; i < attributes.getLength(); i++) {
String attName = attributes.getQName(i);//属性名称
String attValue = attributes.getValue(i);//属性值
System.out.println("属性名称:" + attName + "属性值:" + attValue);
}
}
} /*解析文档中节点结束时调用*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("解析元素-->" + qName + "结束" );
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
String values = new String(ch, start, length);
if(!"".equals(values.trim()))
System.out.println(values);
}
}

运行:



3、JDOM 解析:

package com.xzlf.xml;

import java.io.File;
import java.util.List; import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder; /**
* JDOM 解析 xml
* 需要导包:http://www.jdom.org/downloads/index.html
* @author xzlf
*
*/
public class JDOMParseTest {
public static void main(String[] args) throws Exception{
// 1、创建一个 SAXBuilder 对象
SAXBuilder sb = new SAXBuilder();
// 2、调用 build 方法,得到 Document 对象(通过 IO 流)
Document doc = sb.build(new File("src/book.xml"));
// 3、获取根节点
Element rootEle = doc.getRootElement();//books
// 4、获取根节点的直接子节点的集合
List<Element> children = rootEle.getChildren();
// 5、遍历集合
for (int i = 0; i < children.size(); i++) {
Element ele = children.get(i);
// 得到属性集合
List<Attribute> attributes = ele.getAttributes();
// 遍历属性的集合得到每一个属性
for (Attribute attr : attributes) {
System.out.println(attr.getName() + "-->" + attr.getValue());
}
}
// 获取每一个子节点
System.out.println("===========子节点==============");
for (int i = 0; i < children.size(); i++) {
Element book = children.get(i);
List<Element> ele = book.getChildren();
for (Element e : ele) {
System.out.print(e.getName() + "-->" + e.getValue() + "\t");
}
System.out.println();
} }
}

运行:



4、DOM4J 解析:

package com.xzlf.xml;

import java.io.File;
import java.util.Iterator; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; /**
* DOM4J 解析 XML
* 需要导包:https://dom4j.github.io/#looping
* @author xzlf
*
*/
public class DOM4JParseTest {
public static void main(String[] args) throws DocumentException {
// 1、创建 SAXReader 对象
SAXReader reader = new SAXReader();
// 2、调用 read 方法
Document doc = reader.read(new File("src/book.xml"));
// 3、获取根元素
Element root = doc.getRootElement();//books
// 4、通过迭代器遍历直接节点
for(Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
Element book = iterator.next();
System.out.println(book.getName());
//得到book的属性
for (Iterator<Attribute> iter = book.attributeIterator(); iter.hasNext();) {
Attribute attr = iter.next();
System.out.println("\t" + attr.getName() + "-->" + attr.getValue());
}
}
// 遍历每一个 book 元素
for (Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
Element book = iterator.next();
//得到每一个子元素
for (Iterator<Element> iter = book.elementIterator(); iter.hasNext();) {
Element ele = iter.next();
System.out.println(ele.getName() + "-->" + ele.getText());
}
} }
}

运行:

Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J的更多相关文章

  1. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  2. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

  3. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  4. Java解析xml文件遇到特殊符号&会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  5. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  6. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

  7. java解析xml的几种方式

    java解析xml的几种方式 DOM DOM的全称是Document ObjectModel,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称D ...

  8. JAVA解析XML之SAX方式

    JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...

  9. XML基础+Java解析XML +几种解析方式的性能比较

    XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...

随机推荐

  1. Mysql性能优化:为什么你的count(*)这么慢?

    导读 在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了 sql 中的count函数. 但是随着记录越来越多,查询的速度会越来越慢,为什么会这样呢?M ...

  2. iOS 优化实例

    一.接口请求优化 在工程项目中,多个一级界面包含状态,如:服务入口的动态配置,未读消息数量,图片文字等,因此产品设计要每次切换 tab 时都请求数据,及时的更新页面状态.在实际开发中,频繁的调用接口, ...

  3. intelliJ IDEA 教育版下载教程

    ​声明:本教程针对的是在校本科大学生及以上学历学生群体,因为申请账号需要学校的邮箱来进行验证,所以"社会人士"为了对的起"社会"这两个字,还是花点钱买个正版吧! ...

  4. java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是:         1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...

  5. A 密码锁

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,128m 问题描述 何老板有一把奇特的密码锁.密码锁上有n个数字(范围0到9)排成一排.密码锁上有两个按钮:每按一次1号按钮, ...

  6. SQL Server 创建链接服务器的脚本,自定义链路服务器的简短名称

    USE [master]GO /****** Object:  LinkedServer [SQL01]    Script Date: 2020/4/9 11:51:17 ******/EXEC m ...

  7. .gitattributes

    .gitattributes文件是一个文本文件,文件中的一行定义一个路径的若干属性.以行为单位设置一个路径下所有文件的属性,格式如下: 要匹配的文件模式 属性1 属性2 GRLF和LF CRLF,LF ...

  8. 1005 Spell It Right (20 分)

    Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output e ...

  9. 混合app禁止切换输入法英文键盘方案

    前言 在此介绍的是h5的部分,非原生,原生可以直接属性禁止. 需求 禁止中文出现在input中.(如果你认为不显示出来中文,那么请往下看) 效果:只显示英文键盘. 遇到的问题 1.在三星低版本上会出现 ...

  10. Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除

    在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...