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. 角色移动优化【Unity2D自学之路】

    自学unity2D独立游戏开发,第一篇自学笔记.在场景中添加角色,并给角色添加Rigidbody2D刚体组件.collection2D碰撞体组件,c#脚本组件控制人物移动和跳跃.c#脚本组件内容如下, ...

  2. Polya 定理相关题目

    参考知识链接   关于枚举旋转置换:   前两题都是枚举了 n 种旋转, 但这个可以优化到\(O(\sqrt{n})\) (这个其实是基本操作). 考虑到每个循环节的长度都是 n 的因数, 所以可以枚 ...

  3. 一文搞懂 ThreadLocal 原理

    当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的 ...

  4. iOS 13DarkMode暗黑模式

    iOS 13系统的iPhone 在设置-->显示与亮度 -->选择深色 即开启暗黑模式 1.暗黑模式关闭 1.1 APP开发未进行暗黑适配,出现顶部通知栏字体颜色无法改变始终为白色.可以全 ...

  5. java单元/集成测试中使用Testcontainers

    1.Testcontainers介绍: Testcontainers是一个Java库,它支持JUnit测试,提供公共数据库.SeleniumWeb浏览器或任何可以在Docker容器中运行的轻量级.一次 ...

  6. Python第三方包之PrettyTable

    Python第三方包之PrettyTable 可以让我们将数据用表格的方式展示出来 安装方式 pip install PrettyTable 测试是否安装成功 使用方法与对比 增加一条数据 先简单的看 ...

  7. php 安装教程

    php 安装教程 本文采用php7.0.1作为样例,进行安装. 系统环境: CentOS6.7. gcc 4.8.2 libzip 1.0.1 在安装之前,可以先更新CentOS系统. yum -y ...

  8. For,while,case,shell循环结构

                                                                For,while,case,shell循环结构 案例1:使用for循环结构 案 ...

  9. Vue的基本指令的使用1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 2017蓝桥杯杨辉三角(C++C组)

    题目: 杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要.第0行:           1第1行:          1 1第2行:         1 2 1第3行:        1 3 ...