[Java开发之路](12)JDOM和DOM4J解析XML文档

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:
1. JDOM解析XML文档

1.1 简介

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。

JDOM帮助文档 :  http://www.jdom.org/docs/apidocs/

Jar包下载地址: 点击打开链接

1.2 解析步骤

(1)创建SAXBuilder对象
 
  
SAXBuilder saxBuilder = new SAXBuilder();
(2)创建输入流对象并将XML文档加载到输入流中
 
  
FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml");
(3)通过saxBuilder对象的build方法将输入流加载到saxBuilder中(注意:Document 所引用的包是org.jdom2.Document;)
 
  
Document document = saxBuilder.build(inputStream);
(4)通过document对象获取XML文档的根节点
 
  
Element rootElement = document.getRootElement();
(5)根据根节点获取根节点下的子节点集合
 
  
List<Element> bookList = rootElement.getChildren();
(6)根据节点获取属性节点集合
 
  
List<Attribute> attrList = book.getAttributes();
(7)根据节点(元素节点或者属性节点)获取节点名称和节点值
 
  
// 属性名称
node.getName();
// 属性值
node.getValue();
1.3 主要方法

(1) 返回文档的根节点
public Element getRootElement()
 
 
// document为Document对象
Element rootElement = document.getRootElement();
(2) 返回节点的所有子节点的集合
public java.util.List<Element> getChildren()
 
 
// rootElement为Element对象
List<Element> bookList = rootElement.getChildren();
(3) 返回节点的所有属性节点的集合
public java.util.List<Attribute> getAttributes()
 
  
// book为Element对象
List<Attribute> attrList = book.getAttributes()
(4)根据子节点的名称返回节点的子节点
public Element getChild(java.lang.String cname)
 
  
Element titleElement = book.getChild("title");
(5)返回节点的名称
public java.lang.String getName()
 
  
// titleElement为title节点
titleElement.getName();
(6)返回节点值
public java.lang.String getValue()、
 
  
titleElement.getValue()
DOM方式getNodeValue() 对于元素节点时返回null。不同于DOM方式,JDOM无论是属性节点还是元素节点都会返回节点对应的文本值。
 
  
<author>Scott Meyers</author>
对于这个节点来说,DOM的getNodeValue()返回null,JDOM的getValue()返回"Scott Meyers"。

1.3 具体实例

 
  
package com.qunar.xml;
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
 
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
 
/**
* JDOM解析XML文档
* @author sjf0115
*
*/
public class JDOMXMLCode {
 
public static void main(String[] args) {
try {
// 创建SAXBuilder对象
SAXBuilder saxBuilder = new SAXBuilder();
// 创建输入流对象并将XML文档加载到输入流中
FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml");
// 通过saxBuilder对象的build方法将输入流加载到saxBuilder中
Document document = saxBuilder.build(inputStream);
// 通过document对象获取XML文档的根节点
Element rootElement = document.getRootElement();
// 根据根节点获取根节点下的子节点集合
List<Element> bookList = rootElement.getChildren();
// 遍历子节点
for (Element book : bookList) {
System.out.println("开始解析一本书...");
// 解析属性
List<Attribute> attrList = book.getAttributes();
for (Attribute attribute : attrList) {
// 属性名称
System.out.print("---" + attribute.getName() + ":");
// 属性值
System.out.println(attribute.getValue());
}//for
// 获取book节点下的子节点
List<Element> bookChildren = book.getChildren();
for (Element bookChild : bookChildren) {
// 节点名称
System.out.print("------" + bookChild.getName() + ":");
// 节点值
System.out.println(bookChild.getValue());
}//for
System.out.println("结束解析一本书...");
}//for
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


运行结果:

开始解析一本书...
---category:Java
------title:Java多线程编程核心技术
------author:高洪岩
------year:2015
------price:69.00
结束解析一本书...
开始解析一本书...
---category:C++
------title:Effective C++: 55 Specific Ways to Improve Your Programs and Designs
------author:Scott Meyers
------year:2006
------price:58.00
结束解析一本书...
开始解析一本书...
---category:Web
------title:Learning XML
------author:Erik T. Ray
------year:2016
------price:39.95
结束解析一本书...


2. DOM4J解析XML文档

2.1 简介

DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。 DOM4J 是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。如今可以看到越来越多的Java软件都在使用 DOM4J 来读写XML,特别值得一提的是连Sun的JAXM也在用 DOM4J 。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

Jar包下载地址:点击打开链接

2.2解析

(1)创建SAXReader对象
 
  
SAXReader saxReader = new SAXReader();
(2)通过SaxReader对象的read方法加载XML文档获取Document对象
 
  
Document document = saxReader.read(new File("D:\\bookstore.xml"));
(3)通过Document对象获取根节点
 
  
Element bookstore = document.getRootElement();
(4)通过Element对象的elementIterator方法获取迭代器
 
  
Iterator iterator = bookstore.elementIterator();
(5)遍历迭代器获取根节点的信息
 
  
while (iterator.hasNext()) {
// 获取下一个子节点
Element book = (Element)iterator.next();
}
(6)获取属性节点的属性名称和属性值
 
  
// 获取book的属性节点集合
List<Attribute> bookAttr = book.attributes();
// 遍历book属性节点
for (Attribute attribute : bookAttr) {
// 获取book的属性节点的属性名称以及属性值
System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue());
}//for
(7)获取元素节点的节点名称和对应的文本值
 
 
Iterator ite = book.elementIterator();
// 遍历book节点的子节点
while(ite.hasNext()){
// book节点的子节点
Element bookChild = (Element)ite.next();
System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue());
//System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText());
}//while

2.3 具体案例

 
  
package com.qunar.xml;
 
import java.io.File;
import java.util.Iterator;
import java.util.List;
 
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
public class DOM4JXMLCode {
 
public static void main(String[] args) {
try {
// 创建SAXReader对象
SAXReader saxReader = new SAXReader();
// 通过SaxReader对象的read方法加载XML文档获取Document对象
Document document = saxReader.read(new File("D:\\bookstore.xml"));
// 通过Document对象获取根节点
Element bookstore = document.getRootElement();
// 通过Element对象的elementIterator方法获取迭代器
Iterator iterator = bookstore.elementIterator();
// 遍历根节点的子节点
while (iterator.hasNext()) {
System.out.println("开始解析一本书...");
// 获取下一个元素节点
Element book = (Element)iterator.next();
// 获取book的属性节点集合
List<Attribute> bookAttr = book.attributes();
// 遍历book属性节点
for (Attribute attribute : bookAttr) {
// 获取book的属性节点的属性名称以及属性值
System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue());
}//for
Iterator ite = book.elementIterator();
// 遍历book节点的子节点
while(ite.hasNext()){
// book节点的子节点
Element bookChild = (Element)ite.next();
System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue());
//System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText());
}//while
System.out.println("结束解析一本书...");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
运行结果:

开始解析一本书...
name:category   value:Java
name:title   value:Java多线程编程核心技术
name:author   value:高洪岩
name:year   value:2015
name:price   value:69.00
结束解析一本书...
开始解析一本书...
name:category   value:C++
name:title   value:Effective C++: 55 Specific Ways to Improve Your Programs and Designs
name:author   value:Scott Meyers
name:year   value:2006
name:price   value:58.00
结束解析一本书...
开始解析一本书...
name:category   value:Web
name:title   value:Learning XML
name:author   value:Erik T. Ray
name:year   value:2016
name:price   value:39.95
结束解析一本书...







目录
相关文章
|
4天前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
43 15
|
20天前
|
人工智能 安全 IDE
一天成为Java开发高手:用飞算JavaAI实现十倍提效
“一天成为Java开发高手”曾被视为天方夜谭,但飞算JavaAI的出现改变了这一局面。这款AI开发助手通过智能引导、需求分析、自动化逻辑处理和完整代码工程生成,大幅简化了Java开发流程。它不仅帮助新手快速上手,还让资深开发者提高效率,减少调试时间。现在,参与“飞算JavaAI炫技赛”,展示你的开发实力,赢取丰厚奖品!
|
11天前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
|
12天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
20天前
|
人工智能 Java 数据处理
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
|
6天前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
46 29
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
150 2
|
2天前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
19 3
|
5天前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
14天前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多