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 - 向远程主机部署服务
问题描述 通常,我们本地编写 docker-compose.yml 文件,然后运行测试.但是,我们需要在 arm64 环境中进行测试,无法在本地直接运行测试. 我们希望可以在本地编写,然后本地使用 d ...
- 【杂谈】Kafka的无锁设计
前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一.通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能.为了更好地理解 Kafka 的无锁 ...
- Qt开源作品4-网络调试助手
一.前言 网络调试助手和串口调试助手是一对的,用Qt开发项目与硬件通信绝大部分都是要么串口通信(RS232 RS485 Modbus等),要么就是网络通信(TCP UDP HTTP等),所以一旦涉及到 ...
- Python中导入模块的import命令的语法
- 百度高效研发实战训练营-Step3
.# 百度高效研发实战训练营-Step3 3.1 质量意识 关于本部分,将从以下几点进行介绍: 3.1.1 质量的基本概念 意识的树立,源于认识的提高. 首先介绍质量的基本概念,主要包括以下内容: 1 ...
- 架构-初识DDD
引言 继上一篇BFF的文章后,我又去网上学习了一下DDD(领域驱动设计),发现一篇不错的文章,参考并写了一些自己的理解分享在这里. DDD 是什么 领域驱动设计(Domain Driven Desig ...
- UE4命令行编译工程入门
注:本文同步发布于微信公众号:stringwu的互联网杂谈UE4命令行编译工程入门 0 背景 笔者是个UE4的小白,本文主要记录了一个小白是如何从零UE4的基础,一步步在命令行打出iOS的ipa包的尝 ...
- CSS JS 自适应菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- DVR4 pg walkthrough Intermediate window
nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A -sS 192.168.219.179 Starting Nmap 7.94SVN ( https://nmap ...
- 3090 cuda环境配置杂记
实验室新配了3090的电脑,cuda环境配置上出了些问题,百度很久才找到解决方法,因此记录下来. 主要参考:(6条消息) 服务器Linux环境配置cuda(非管理员)_@@Lynn的博客-CSDN博客 ...