Java 解析XML的几种方式:DOM、SAX、JDOM和DOM4J。
归纳总结Java解析XML主要有四中方式,分别是DOM、SAX、JDOM和DOM4J。其中DOM和SAX是官方包自带,另外两个JDOM和DOM4J是第三方包。
一、此篇测试代码用到的XML情况 。
1、XML内容展示
1 <?xml version="1.0" encoding="UTF-8"?>
2 <class>
3 <people>
4 <name>Jack</name>
5 <age>19</age>
6 <sex>male</sex>
7 <job>student</job>
8 </people>
9 <people>
10 <name>Merry</name>
11 <age>26</age>
12 <sex>female</sex>
13 <job>teacher</job>
14 </people>
15 </class>
2、所在项目位置

二、几种方式
1、DOM方式
代码及运行结果,已省略类名及main函数代码。
1 import org.w3c.dom.Document;
2 import org.w3c.dom.Element;
3 import org.w3c.dom.Node;
4 import org.w3c.dom.NodeList;
5 import org.xml.sax.SAXException;
6 import javax.xml.parsers.DocumentBuilder;
7 import javax.xml.parsers.DocumentBuilderFactory;
8 import javax.xml.parsers.ParserConfigurationException;
9 import java.io.File;
10 import java.io.IOException;
11 /**
12 * Create by 摩诘 on 2020/4/5 02:00
13 */
14 try {
15 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
16 DocumentBuilder builder = factory.newDocumentBuilder();
17 String path = HelloWorld.class.getClassLoader().getResource("config/peoples.xml").getPath();
18 File file = new File(path);
19 Document document = builder.parse(file);
20 // 获取节点People集合
21 NodeList nodeList = document.getElementsByTagName("people");
22 for (int i = 0; i < nodeList.getLength(); i++) {
23 // Element element=(Element) nodeList.item(i);
24 // NodeList childNodes=element.getChildNodes();
25 Node node = nodeList.item(i);
26 NodeList childNodes = node.getChildNodes();
27 for (int j = 0; j < childNodes.getLength(); j++) {
28 Node childNode = childNodes.item(j);
29 if (childNode.getNodeType() == Node.ELEMENT_NODE) {
30 // 获取节点名称
31 // 获取对应节点包含的值
32 System.out.println(childNode.getNodeName() + ":" + childNode.getFirstChild().getNodeValue());
33 }
34 }
35 System.out.println("************************");
36 }
37 } catch (ParserConfigurationException ex) {
38 //ex.printStackTrace();
39 System.out.println("Error : " + ex.toString());
40 } catch (IOException ex) {
41 //ex.printStackTrace();
42 System.out.println("Error : " + ex.toString());
43 } catch (SAXException ex) {
44 //ex.printStackTrace();
45 System.out.println("Error : " + ex.toString());
46 }

2、SAX方式
运行效率和内存使用方面最优的是SAX,但是由于SAX是基于事件的方式,所以SAX无法在编写XML的过程中对已编写内容进行修改,但对于不用进行频繁修改的需求,还是应该选择使用SAX。测试代码主要使用到两个类,一个主函数类HelloWorld,一个SAXHandler继承DefaultHandler并重写方法。
1 import org.xml.sax.helpers.DefaultHandler;
2 import javax.xml.parsers.SAXParser;
3 import javax.xml.parsers.SAXParserFactory;
4 /**
5 * Create by 摩诘 on 2020/4/5 17:30
6 */
7 public class HelloWorld {
8 public static void main(String[] args) throws Exception{
9 SAXParserFactory factory=SAXParserFactory.newInstance();
10 SAXParser saxParser=factory.newSAXParser();
11 DefaultHandler handel=new SAXHandler();
12 saxParser.parse("src/config/peoples.xml",handel);
13 }
14 }
1 import org.xml.sax.Attributes;
2 import org.xml.sax.SAXException;
3 import org.xml.sax.helpers.DefaultHandler;
4 /**
5 * Create by 摩诘 on 2020/4/5 17:30
6 */
7 public class SAXHandler extends DefaultHandler {
8 @Override
9 public void startDocument() throws SAXException {
10 super.startDocument();
11 System.out.println("XML解析开始");
12 }
13
14 @Override
15 public void endDocument() throws SAXException {
16 super.endDocument();
17 System.out.println("XML解析结束");
18 }
19
20 @Override
21 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
22 super.startElement(uri, localName, qName, attributes);
23 if(qName.equals("people")){
24 System.out.println("*************开始遍历poople*************");
25 }else if(!qName.equals("people")&&!qName.equals("class")){
26 System.out.println("节点名称:"+qName);
27 }
28 }
29
30 @Override
31 public void endElement(String uri, String localName, String qName) throws SAXException {
32 super.endElement(uri, localName, qName);
33 if(qName.equals("people")){
34 System.out.println(qName+"遍历结束");
35 System.out.println("************结束遍历people**************");
36 }
37 }
38
39 @Override
40 public void characters(char[] ch, int start, int length) throws SAXException {
41 super.characters(ch, start, length);
42 String value=new String(ch,start,length).trim();
43 if(!value.equals("")){
44 System.out.println(value);
45 }
46 }
47 }
3、JDOM方式
这种方式为三方包,包地址:https://mvnrepository.com/search?q=jdom,通过构建maven项目引用,maven安装与配置:https://blog.csdn.net/github_37759996/article/details/90748461,创建maven Java程序:https://blog.csdn.net/YF_Li123/article/details/79953731?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1,上代码。
1 import org.jdom2.Document;
2 import org.jdom2.Element;
3 import org.jdom2.input.SAXBuilder;
4 import org.jdom2.JDOMException;
5 import java.io.*;
6 import java.util.List;
7
8 /**
9 * Create by 摩诘 on 2020/5/2 21:38
10 */
11 public class HelloWorld {
12 public static void main(String[] args) {
13 SAXBuilder saxBuilder=new SAXBuilder();
14 InputStream in;
15 try{
16 in=new FileInputStream(new File("src\\config\\peoples.xml"));
17 Document document=saxBuilder.build(in);
18 Element rootElement=document.getRootElement();
19 List<Element> peopleList=rootElement.getChildren();
20 for (Element people:peopleList){
21 List<Element> childernList=people.getChildren();
22 for (Element childern:childernList){
23 System.out.println("2");
24 System.out.println(childern.getName()+":"+childern.getValue());
25 }
26 }
27 }catch(FileNotFoundException e){
28 e.printStackTrace();
29 }catch(JDOMException e){
30 e.printStackTrace();
31 }catch(IOException e){
32 e.printStackTrace();
33 }
34 }
35 }

4、DOM4J
三方包,引用方式与JDOM方式类似。看代码
1 import org.dom4j.Attribute;
2 import org.dom4j.Document;
3 import org.dom4j.Element;
4 import org.dom4j.io.SAXReader;
5 import java.io.File;
6 import java.util.Iterator;
7 import java.util.List;
8 /**
9 * Create by 摩诘 on 2020/5/2 22:07
10 */
11 public class HelloWorld {
12 public static void main(String[] args) {
13 SAXReader reader = new SAXReader();
14 try{
15 Document document = reader.read(new File("src/config/peoples.xml"));
16 Element rootElement = document.getRootElement();
17 Iterator iterator = rootElement.elementIterator();
18 while (iterator.hasNext()){
19 Element stu = (Element) iterator.next();
20 List<Attribute> attributes = stu.attributes();
21 System.out.println("======获取属性值======");
22 for (Attribute attribute : attributes) {
23 System.out.println(attribute.getValue());
24 }
25 System.out.println("======遍历子节点======");
26 Iterator iterator1 = stu.elementIterator();
27 while (iterator1.hasNext()){
28 Element stuChild = (Element) iterator1.next();
29 System.out.println("节点名:"+stuChild.getName()+"---节点值:"+stuChild.getStringValue());
30 }
31 }
32 }catch (Exception e){
33 e.printStackTrace();
34 }
35 }
36 }
三、整理参考了以下链接文章
https://www.jb51.net/article/115316.htm
https://blog.csdn.net/m0_37499059/article/details/80505567
Java 解析XML的几种方式:DOM、SAX、JDOM和DOM4J。的更多相关文章
- java解析xml的几种方式
java解析xml的几种方式 DOM DOM的全称是Document ObjectModel,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称D ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
- JAVA解析xml的五种方式比较
1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ① ...
- java解析xml文件四种方式
1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 ...
- JAVA解析xml的四种方式比较
1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允 ...
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- 【Java】详解Java解析XML的四种方法
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...
- Java解析XML的四种方法详解 - 转载
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...
- 横向对比分析Python解析XML的四种方式
横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...
- 解析XML的几种方式:DOM、SAX、PULL
DOM解析 解析器读入整个文档,然后构建一个主流内存的树结构,然后代码就可以使用dom接口来操作这个树结构. 优点: 整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能. 通过树形结构存 ...
随机推荐
- docker-compose安装mongo
创建目录 [root@localhost tools]# mkdir -p /root/tools/mongo/{data,conf,init} 创建初始化用户脚本 [root@localhost m ...
- shell 获取进程号
# Shell最后运行的后台PID(后台运行的最后一个进程的进程ID号) $! # Shell本身的PID(即脚本运行的当前进程ID号 $$
- Unity 3D使用C#脚本实例
界面 结构 代码 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 usin ...
- Qt采集本地摄像头推流成rtsp/rtmp(可网页播放/支持嵌入式linux)
一.功能特点 支持各种本地视频文件和网络视频文件. 支持各种网络视频流,网络摄像头,协议包括rtsp.rtmp.http. 支持将本地摄像头设备推流,可指定分辨率和帧率等. 支持将本地桌面推流,可指定 ...
- AOP拦截日志
首先对于AOP切面编程,我也是刚学习,了解不深,这边先引用老张的博客,方便大家学习. 首先想一想,如果有这么一个需求,要记录整个项目的接口和调用情况,当然如果只是控制器的话,还是挺简单的,直接用一个过 ...
- 聊一聊 C#异步中的Overlapped是如何寻址的
一:背景 1. 讲故事 前段时间训练营里的一位朋友提了一个问题,我用ReadAsync做文件异步读取时,我知道在Win32层面会传 lpOverlapped 到内核层,那在内核层回头时,它是如何通过这 ...
- 零基础Windows Server搭建部署Word Press 博客系列教程(3):弱鸡变猛男之部署CDN加速和缓存加速
我们博客里面存在的各种媒体文件.压缩文件.脚本文件,这些文件可能很大而且不需要随时生成.如果我们的服务器带宽很小,访问我们网站的用户等待加载完成就需要很长时间,那么访问速度会很慢.因此我们需要通过第三 ...
- 一站式解决方案 :OFD电子证照生成
前言 证照的电子化是一个趋势:可以预计,未来几年内,绝大部分证照都会电子化.电子证照的种类越来越多,应用场景也复杂多样:这就给电子证照规范的制定.电子证照的生成提出了更高的要求.电子证照采用的格式有两 ...
- 支付宝分布式事务服务-DTS
分布式事务服务简介 注意:为向用户提供更加优质的服务,蚂蚁金融云已对中间件产品完成进一步升级改造,并计划于 2018 年 3 月 31 日下线本产品. 分布式事务服务(Distributed Tran ...
- 迁移polardb问题一
环境 polardb版本 <dependency> <groupId>com.aliyun</groupId> <artifactId>polardb- ...