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 被设计用来描述数 ...
随机推荐
- python之路 2020/2/18
这是第一篇随笔,记录今天的内容,我不知道什么是成功,因为我没有成功过,但是,我想成功一次! python 多练吧! 一.编程语言的分类 机器语言:01001010,高低电平,计算机懂的语言. 汇编语言 ...
- 《自拍教程52》Python_adb运行Shell脚本
Android作为一款Linux终端,肯定是支持.sh后缀的Shell脚本的运行的, 有时候测试环境准备或者长时间截取复杂的日志等,开发会给到一些Shell脚本. Shell脚本的执行的优势: 快捷高 ...
- 【NLP面试QA】激活函数与损失函数
目录 Sigmoid 函数的优缺点是什么 ReLU的优缺点 什么是交叉熵 为什么分类问题的损失函数为交叉熵而不能是 MSE? 多分类问题中,使用 sigmoid 和 softmax 作为最后一层激活函 ...
- windows10远程桌面,出现“出现身份验证错误 要求的函数不受支持...”等错误解决方法
windows家庭普通版,更新补丁后无法远程连接windows server2012,出现以下报错: 解决方法: 1.win + R打开运行,输入 regedit,回车进入注册表 2.找到以下路径 \ ...
- 403 Invalid CORS request 跨域问题解决
这里使用springMVC自带的CORS解决跨域问题 什么是跨域问题 1.请求地址与当前地址不相同 2.端口号不相同 技术有限端口号不同还未发现 3.二级域名不相同 出现这种问题如何解决有很多种方法, ...
- Excel决定吃什么
1.Excel填充 在第一列填充1到100 (1)下拉填充 (2)填充——自动填充——序列 2.第二列加权填上自己吃的午饭 3.vloopup函数(列查找) 几乎都使用精确匹配,该项的参数一定要选择为 ...
- 面试:给我说说你平时是如何优化MySQL的?
面试:给我说说你平时是如何优化MySQL的? 1.explain 在MySQL优化的时候.我们使用最多的是explain查看 SQL 的执行计划 类型 解释 type 连接类型.一个好的SQL语句至少 ...
- 如何编写优雅的异步代码 — CompletableFuture
前言 在我们的意识里,同步执行的程序都比较符合人们的思维方式,而异步的东西通常都不好处理.在异步计算的情况下,以回调表示的动作往往会分散在代码中,也可能相互嵌套在内部,如果需要处理其中一个步骤中可能发 ...
- 使用Putty + Xming 远程登录Linux显示图形化界面
一般我们远程登录linux 服务器,都是使用非加密的 telnet 或者加密的 ssh.这些登录方式有一个特点:只能登录字符界面,不能运行那些带有GUI界面的程序. 有时候为了学习或者工作的需要,我们 ...
- java对象clone
java克隆 为什么需要克隆 我们在很多时候需要使用一个对象去记录另外一个对象的当前状态,对象中可能会有很多属性,如果我们一个一个去设置,不仅不方便,而且效率很低,我们看一个初学者可能遇到的问题 cl ...