Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J
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的更多相关文章
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- Java解析xml文件遇到特殊符号&会出现异常的解决方案
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...
- 解析xml文件的四种方式
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
- java解析xml的几种方式
java解析xml的几种方式 DOM DOM的全称是Document ObjectModel,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称D ...
- JAVA解析XML之SAX方式
JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...
- XML基础+Java解析XML +几种解析方式的性能比较
XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...
随机推荐
- SpringCloud服务的注册发现--------consul实现服务与发现
1,consul也可以替代Eureka实现注册和发现的功能,即注册中心. 之前在linux环境通过consul + upsync + nginx 实现nginx 的动态负载均衡 https://www ...
- SpringCloud服务的注册发现--------zookeeper实现服务与发现 + Ribbon实现客户端负载均衡
1,Eureka 闭源了,但是我们可以通过zookeeper实现注册中心的功能. zookeeper 是一个分布式协调工具,可以实现服务的注册和发现,配置中心,注册中心,消息中间件的功能 2,工具准备 ...
- C 最大公约数&最小公倍数
1.最大公约数 链接 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数.几个自然数公有的约数,叫做这几个自然数的公约数.公约数中最大的一个公约数,称为这几个自然数的最大公约数. 1 ...
- 面试官:ThreadLocal的应用场景和注意事项有哪些?
前言 ThreadLocal主要有如下2个作用 保证线程安全 在线程级别传递变量 保证线程安全 最近一个小伙伴把项目中封装的日期工具类用在多线程环境下居然出了问题,来看看怎么回事吧 日期转换的一个工具 ...
- 面向对象编程基础(java)
面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...
- Django-FileField与ImageField
1: 在views中用户表添加:class userinfo: avatar = models.FileField(upload_to='avatars/', default="/avata ...
- 看完这篇Exception 和 Error,和面试官扯皮就没问题了
在 Java 中的基本理念是 结构不佳的代码不能运行,发现错误的理想时期是在编译期间,因为你不用运行程序,只是凭借着对 Java 基本理念的理解就能发现问题.但是编译期并不能找出所有的问题,有一些 N ...
- python基础知识 目录 简介
1.1编程语言介绍与分类 什么是编程语言? 本质:与人类语言一样.沟通 电流+一堆硬件 高电压1 低电压0 高电压1 低电压0 高电压1 低电压0 8 晶体管 010101010101 play so ...
- SpringBoot 使用 JSR303 自定义校验注解
JSR303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator,有了它,我们可以在实体类的字段上标注不同的注解实现对数 ...
- 在操作Git Bash时出现的问题
参考博客:https://blog.csdn.net/weixin_44394753/article/details/91410463 1.问题1 $ git remote add origin gi ...