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】安装镜像报错warning: /var/cache/yum/x86_64/7/extras/packages/epel-release-7-11.noarch.rpm: Header
这个的解决方法就是加上这个就可以了
- Qt编写可视化大屏电子看板系统25-模块3设备监控
一.前言 设备监控主要用来实时监测制造零件等使用的设备的工作运行状态,每个设备都有对应的需要.分组名称.分组编号.设备名称.文字1.文字2.工作状态(1-开机 2-待机 3-维护 4-空),不同的工作 ...
- KMS for Office 2021
I. 镜像下载 官方镜像下载地址: Office 2021 专业增强版: https://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6 ...
- python-nmap实现python利用nmap扫描分析
目录 前言 python-nmap的基本使用 PortScanner扫描 PortScannerAsync异步扫描 python-nmap的源码分析 前言 Nmap是一个非常用的网络/端口扫描工具,如 ...
- UML之发现用例
用例是最简单的UML元素,用例图是最简单的UML图,但它也可能是UML中最有用的元素之一.尽管我们用包将工作分解为工作包.团队任务或单项任务,也就是说包是组织UML中的各种图及元素的工具.但是用例图可 ...
- Python在多个Excel文件中找出缺失数据行数多的文件
本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件内.某一列数据的特征,对其加以筛选,并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法. ...
- Solution -「CF 808E」Selling Souvenirs
\(\mathscr{Description}\) Link. 01 背包. 物品种类 \(n\le10^5\),背包容量 \(m\le3\times10^5\),单个物品体积 \(w\i ...
- Storm基本概念
storm简介 场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索场景中的例子,当一个卖家发布了一条宝 ...
- Docker网络:Docker0、容器互联技术--link、自定义网络、实战部署Redis集群
一.Docker网络 ● --理解Docker0 在干净的Linux环境上安装docker(将docker 的所有镜像.容器先删除,干干净净!)实验: 1.查看本地网络信息 ip addr 可见有三个 ...
- APSI - 1
最近在看[Labeled PSI from Homomorphic Encryption with Reduced Computation and Communication]的论文,看完后头大,现结 ...