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 被设计用来描述数 ...
随机推荐
- Java中如何调用静态方法
Java中如何调用静态方法: 1.如果想要调用的静态方法在本类中,可直接使用方法名调用 2.调用其他类的静态方法,可使用类名.方法名调用 关于静态方法能被什么调用 1.实例方法 2.静态发放
- 怎么获取WebAPI项目中图片在服务端的路径
1.这是我的项目结构. 2.路径格式为:[http://服务器域名/文件夹/文件.扩展名] 测试:假如我要获取到[logo_icon.jpg]这张图.在浏览器的地址栏中输入上面那个格式的路径. 3.可 ...
- 1066 Root of AVL Tree (25分)(AVL树的实现)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- iOS, Xcode11,项目提示第三方库报错无法运行 bundle format unrecognized, invalid, or unsuitable
检查你有没有把静态库和动态库配置错误!! 下图处是配置动态库的地方! 对于动态库和静态库都有使用的时候,注意把静态库设置成“Do not Embeded”
- Shell:Day08.笔记
函数:写一个代码块,用来重复调用的: 1.函数的写法格式 2.参数,在函数名后面直接加,即可:如果在外面 abc(){ 函数体 $@ } abc 1 2 3 4 5 :wq a.s ...
- 【Linux】系统管理
软件包管理 一 软件包分类 源码包: .tar.gz .tar.bz2 二进制包: .rpm 二 二进制包安装 (一) rpm命令手动管理二进制包 (挂载光盘) 1 包名-版本号-发布次数-适合lin ...
- 家庭记账本app进度之下拉框和数字转轮的相关应用
这次主要是悬系的下拉框Spinner和数字转轮NumberPicker的使用.先分析相关的用到的知识点. 在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子 ...
- 家庭版记账本app进度之对于按钮的点击事件以及线性布局以及(alertdialog)等相关内容的应用测试
通过线性布局,制作出连个按钮还有文本输入框以及嘴上放的标题文本进行信息的相关显示,完后最后的信息的输入,之后在屏幕的的下方进行显示 当点击第一个按钮的时候,在下方就会简单的出现你自己刚刚输入的相关信息 ...
- Dos 命令启动网卡
禁用网卡: netsh interface set interface "本地连接" disabled 启用网卡 : netsh interface set interface & ...
- python3(三十四)unitTest
""" 单元测试 """ __author__on__ = 'shaozhiqi 2019/9/23' class Dict(dict): ...