Java解析XML文件(DOM4J解析xml文件)

news2024/10/6 4:09:56

内容重点1:DOM4J创建、解析、修改XML文件

内容重点2:DOM4J模拟解析web.xml配置文件,实现实例化servlet

1、什么是xml

Xml(Extensible Markup  Language) 一种扩展性标示语言,出现的意义其实与JSON字符串的意义相似,是新一代的数据交换标准。

优势:一种结构化文档和通用且适应性强的格式,它不仅仅适用于web,而且可以被用于任何的地方。

本案例介绍DOM4J如何解析xml配置文件

2、常见的xml解析工具

DOM4J是所有xml解析中综合性能最优的产品。是一个简单、灵活的开放源代码的库,具有性能优异、功能强大和极易使用的特点。

JDOMDOM:基于树模型,在运行的时候会将xml文件中的所有内容都加入到内存中,对内存的消耗大。适用于小文档。当文档超过15M左右的时候会出现内存溢出。

SAX解析:基于事件驱动,表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

3、通过DOM4J解析XML文件

3.1、创建一个标准的1.xml文件

在你自己系统中的任意地方创建一个1.xml文件,配置如下内容,xml格式是自定的,我使用的xml是具有代表性的一种格式,用于学习足够使用。

<?xml version="1.0" encoding="UTF-8"?>
<students>
  <student id="1001" name="十一郎">安徽合肥1</student>
  <student id="1002" name="十二郎">安徽合肥2</student>
  <student id="1003" name="十三郎">安徽合肥3</student>
  <student id="1004" name="十四郎">安徽合肥4</student>
</students>

3.2、下载DOM4J的包

下载地址:dom4j

说明:此处可以根据自己的JDK版本下载对应的dom4j版本。我用的是JDK1.8所以下载

所以下载dom4j-2.1.4版本。

3.3、在工程中引入DOM4J的jar包

 3.4、读取特定的xml中的内容

getName():得到当前的元素名称

getText():得到元素中间的内容

attributeValue("sex"):得到元素对应的属性的值

【解析代码】

package com.it.test;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestXMLParse {
	public static void main(String[] args) throws DocumentException {
		//创建核心解析器
	   SAXReader reader=new SAXReader();
	   File file=new File("C://aa//1.xml");
	   Document doc=reader.read(file);
	   //得到xml的跟节点-既students
	   Element root= doc.getRootElement();
	   //通过根节点得到所有子节点-既所有student
	   List<Element> elements= root.elements();
	   //遍历得到所有的自己点的属性和值
	   for (Element eles:elements) {
		   //attributeValue:得到指定属性的值
		   System.out.print("id的值=>"+eles.attributeValue("id"));
		   System.out.print(",name的值=>"+eles.attributeValue("name"));
		   //得到节点中间的值
		   System.out.println(",地址=>"+eles.getTextTrim());
	   }
	}
}

【结果输出】

 4、将结果写入XML文件中

本案例中,我们创建一个集合,在集合中添加Student对象,模拟从数据库中查询数据。

4.1、写入后样式

students:为根元素

student:为子元素

id,name,sex,age,pwd:为元素属性

 4.2、导入lomok工具包

4.3、创建Student对象

创建对象,并设置set和get方法及构造器,案例中采用lomok注解生成,也可以手动添加。

@Setter //生成set方法
@Getter //生成get方法
@AllArgsConstructor //生成有参数构造器
@NoArgsConstructor  //生成无参数构造器
public class Student {
	private String stu_id;
	private String stu_name;
	private String stu_sex;
	private String stu_age;
	private String stu_addr;
	private String stu_pwd;
}

4.4、将集合写入到XML文件中

package com.it.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import com.it.bean.Student;
public class TestWriterXML {
	public static void main(String[] args) throws IOException {
		//创建集合模拟数据库查询数据
		List<Student> list=new ArrayList<>();
		Student stu1=new Student("1001","陈平安","男","15","东宝瓶洲泥瓶巷","1001");
		Student stu2=new Student("1002","王煊","男","25","旧星","1002");
		Student stu3=new Student("1003","萧炎","男","35","乌坦城萧家","1003");
		list.add(stu1);
		list.add(stu2);
		list.add(stu3);
		//创建Document对象-DOM4J写入XML中需要将list转化成Document
	    Document  doc=DocumentHelper.createDocument();
	    //向Document对象中添加根节点-XML最外层的元素节点
	    Element root= doc.addElement("students");
	    //向Document对象中添加数
	    for (int i = 0; i <list.size(); i++) {
	    	root.addElement("student")
	    	.addAttribute("id", list.get(i).getStu_id())
	    	.addAttribute("name", list.get(i).getStu_name())
	    	.addAttribute("sex", list.get(i).getStu_sex())
	    	.addAttribute("age", list.get(i).getStu_age())
	    	.addAttribute("pwd", list.get(i).getStu_pwd())
	    	.addText(list.get(i).getStu_addr());
	    }
	    //在C盘中创建目录xmlfile-此处可以自定义地址
	    File file=new File("C://xmlfile");
	    if(!file.exists()){//如果目录不存在,就创建目录
		   file.mkdir();
	    }
	    //将内容写入到C://xmlfile目录中的test.xml文件中
	    OutputStream out=new FileOutputStream(file+"//"+"test.xml");
	    //设置写入的格式,createPrettyPrint表示写入的时候换行
	    OutputFormat format=OutputFormat.createPrettyPrint();
	    //设置编码集为UTF-8,中文也可以使用GBK
	    format.setEncoding("UTF-8");
	    //通过XMLWriter将内容写入到xml中
	    XMLWriter writer=new XMLWriter(out, format);
	    writer.write(doc);//写入
	    writer.flush();//关闭资源前刷新
	    writer.close();//关闭资源
	    out.close();//关闭输出流

	}
}

5、修改XML中指定的参数

案例说明:本案例中将id1003人的姓名修改成萧炎-斗破苍穹

5.1、编码实现

package com.it.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class TestUpdXML {
	public static void main(String[] args) throws IOException, DocumentException {
		//创建核心解析器
	    SAXReader reader=new SAXReader();
	    File file=new File("C://xmlfile//test.xml");
	    Document doc=reader.read(file);
	   
	    //得到xml的跟节点
	    Element root= doc.getRootElement();
	    //通过跟节点得到子节点
	    List<Element> elements= root.elements();
	    //遍历得到所有的自己点的属性和值
	    for (Element eles:elements) {
		   if(eles.attributeValue("id").equals("1003")){
			  Attribute attr= eles.attribute("name");
			  attr.setValue("萧炎-斗破苍穹");
			  break;
		   }
		   //修改地址,地址在元素中间,修改方式如下
		   //eles.setText("");
        }
	    //内容修改后,需要将内容重写写入到xml文件中
	    OutputStream out=new FileOutputStream(file);
	   
	    OutputFormat format=OutputFormat.createPrettyPrint();
	    format.setEncoding("UTF-8");
	   
	    XMLWriter writer=new XMLWriter(out, format);
	    writer.write(doc);
	    writer.flush();
	    writer.close();
	    out.close();
	}
}

5.2、修改结果

 6、DOM4J解析web.xml文件实例化Servlet

原理分析:我们解析用户在地址栏中输入的地址信息如add.do,用这个地址去web.xml文件中通过DOM4J技术,解析判断add.do对应的是哪个url-pattern,找到后获取对应的servlet-name。在用这个servlet-name去找到对应额servlet-class。使用类的全限定实现servlet的实例化。

特殊说明:在web.xml中,Servlet的配置文件url-pattern可以写一个也可以写多个,在解析的时候需要考虑到单个或多个的情况。

6.1、创建类模拟servlet

包名:com.it.servlet

public class AddServlet {
	public AddServlet(){
		System.out.println("===========AddServlet被实例化==========");
	}
}

6.2、创建测试使用的web.xml配置文件

将需要解析的web.xml配置文件放在工程的src目录下,案例中使用的Eclipse开发工具,如果使用maven工程或者idea工程,可以将配置放置在resources目录中都可以。

其中add.do是真是存在的,upd.do和delete.do是不存在的,仅作为模拟数据使用。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>AddServlet</servlet-name>
    <servlet-class>com.it.servlet.AddServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AddServlet</servlet-name>
    <url-pattern>/add.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>UpdServlet</servlet-name>
    <servlet-class>com.it.servlet.UpdServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UpdServlet</servlet-name>
    <url-pattern>/upd.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>DeleteServlet</servlet-name>
    <servlet-class>com.it.servlet.DeleteServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DeleteServlet</servlet-name>
    <url-pattern>/delete.do</url-pattern>
  </servlet-mapping>
  
</web-app>

6.3、解析web.xml-只有一个url-pattern的解析方式

说明1System.getProperty("user.dir")获取运行项目的路径

【测试代码】

package com.it.test;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class TestParseWebXML {
	public static void main(String[] args) throws Exception{
		 String url="/add.do";
		   SAXReader reader=new SAXReader();
		   File file=new File(System.getProperty("user.dir")+"//src//web.xml");
	       Document doc=reader.read(file);
		   //得到xml的跟节点
		   Element root= doc.getRootElement();
		   //通过跟节点得到子节点
		   List<Element> elements= root.elements();
		   String servletName="";
		   //寻找第一个参数:通过url找到对应的servlet-name的值
		   for (Element eles:elements) {
			  //判断进入servlet-mapping元素中,此时web.xml有多个servlet-mapping
			  if(eles.getName().equals("servlet-mapping")){
				  //判断servlet-mapping中的url-pattern的值url参数相等
				  if(eles.elementText("url-pattern").equals(url)){
					  //如果条件满足,就获取对应的servlet-name的值
					  servletName=eles.elementText("servlet-name");
				  }
			  }
		   }
		 //寻找第二个参数:通过servlet-name找到对应的servlet-class的值
		   String servletClass="";
		   for (Element eles:elements) {
				  //先进入到servlet元素中,此时有多个servlet元素
				  if(eles.getName().equals("servlet")){
					  //判断servlet-name是否与上面的servletName相等
					  if(eles.elementText("servlet-name").equals(servletName)){
						  //如果条件满足,获取servlet-class的值
						  servletClass=eles.elementText("servlet-class");
					  }
				  }
			   }
		   //通过servletClass的全限定类名实现类的实例化
		   Class.forName(servletClass).newInstance();
	}
}

【测试结果】

6.4、解析web.xml-有多个url-pattern的解析方式

【对应的servlet-mapping配置】

<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/add.do</url-pattern>
<url-pattern>/add1.do</url-pattern>
<url-pattern>/add2.do</url-pattern>
<url-pattern>/add3.do</url-pattern>
  </servlet-mapping>

6.5、具体解析方式

说明1:我们此时设置url的值为add2.do

【代码测试】

package com.it.test;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * dom4j,模拟解析web.xml配置文件。
 * @author Administrator
 *
 */
public class TestParseWebXML {
	public static void main(String[] args) throws Exception{
		 String url="/add2.do";
		   SAXReader reader=new SAXReader();
		   File file=new File(System.getProperty("user.dir")+"//src//web.xml");
	       Document doc=reader.read(file);
		   //得到xml的跟节点
		   Element root= doc.getRootElement();
		   //通过跟节点得到子节点
		   List<Element> elements= root.elements();
		   String servletName="";
		   //寻找第一个参数:通过url找到对应的servlet-name的值
	       for (Element eles:elements) {
				if(eles.getName().equals("servlet-mapping")){
					//得到当前的servlet-mapping元素下的子元素(serlvet-name,url-pattern)
					List<Element> urlpattern=eles.elements();
                     用来遍历一个servlet-mapping中的多个url-pattern
					for (Element e:urlpattern) {
						if(e.getName().equals("url-pattern")){
							if(e.getText().equals(url)){//第一次/add.do;第二次/add1.do....
								servletName=eles.elementText("servlet-name");
							}
						}
					}
				}
		   }
		   //寻找第一个参数:通过servlet-name找到对应的servlet-class的值
		   String servletClass="";
		   for (Element eles:elements) {
				  //先进入到servlet元素中,此时有多个servlet元素
				  if(eles.getName().equals("servlet")){
					  //判断servlet-name是否与上面的servletName相等
					  if(eles.elementText("servlet-name").equals(servletName)){
						  //如果条件满足,获取servlet-class的值
						  servletClass=eles.elementText("servlet-class");
					  }
				  }
			   }
		   //通过servletClass的全限定类名实现类的实例化
		   Class.forName(servletClass).newInstance();
	}
}

【测试结果】

 7、源码下载

https://download.csdn.net/download/tangshiyilang/87928643

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么加密共享文件夹?局域网共享文件夹加密方法

相信很多企业都在使用局域网共享文件夹&#xff0c;它可以很方便地实现各部门之间的沟通协作。但是由于使用人员众多&#xff0c;数据安全非常难以得到保障。那么我们该怎么加密局域网共享文件夹呢&#xff1f; 共享文件夹加密 首先&#xff0c;我们先来了解一下共享文件夹加密…

某农业大学数据结构A-第13周作业

1.拓扑排序 【问题描述】 拓扑排序的流程如下&#xff1a; 1. 在有向图中选一个没有前驱的顶点并且输出之&#xff1b; 2. 从图中删除该顶点和所有以它为尾的弧。 重复上述两步&#xff0c;直至全部顶点均已输出&#xff0c;或者当前图中不存在无前驱的顶点为止。后一种情况则…

渲染模式差异和选择

传统服务端渲染 在过去传统开发中&#xff0c;页面渲染任务是由服务端完成的&#xff0c;服务器负责获取数据&#xff0c;拼装页面&#xff0c;客户端仅负责内容显示&#xff0c;使用这种方式的典型技术有 JSP、PHP、ASP.NET 等等。 客户端渲染 CSR Vue.js、React 这类框架之…

专访蘑菇物联沈国辉:做工业AI时代的推动者

在中国制造迈向高质量发展的进程中&#xff0c;数智化转型会成为破局之道。在这其中&#xff0c;蘑菇物联除了是一个本分的答题者&#xff0c;还是一个善于发现问题的贡献者。 作者|思杭 编辑|皮爷 出品|产业家 从广州造纸厂到广州造船厂&#xff0c;从第一橡胶厂到电池厂&a…

利用R语言通过百度地图API进行批量地理编码

利用R语言通过百度地图API进行批量地理编码 当您有大量的地点名称需要在地图上来呈现时&#xff0c;首先要在在线地图上找到该地址的坐标&#xff0c;通常是指经纬度&#xff0c;如果能够用代码来实现&#xff0c;便少了许多费时费力的体力活儿&#xff0c;以下将详细介绍地理…

数据结构的一些总结---利用Python实现

大家好&#xff0c;我是北山啦&#xff0c;本文简单介绍Python数据结构的相关内容&#xff0c;简单就是很简单的那种 文章目录 查找线性查找 O(n)二分查找(Binary Search) O(logn) 排序排序Low B三人组冒泡排序选择排序插入排序 排序NB三人组快速排序归并排序 数据结构栈和队列…

[Day 3 of 17]Building a document scanner in OpenCV

a computer vision-powered document scanner 计算机视觉驱动的文档扫描仪&#xff0c;三个步骤&#xff1a; 边缘检测edges通过边缘&#xff0c;找到代表待扫描纸张的轮廓contour应用透视转换(a perspective transform)获得文档自上而下的视图 How to Build a Kick-Ass Mob…

录音转文字的方法有哪些?这三个录音转文字的方法有哪些

你是否曾经遇到过这样的场景&#xff1a;在开会或者采访时&#xff0c;需要记录重要信息&#xff0c;但是手写记录或打字速度跟不上对话节奏&#xff0c;甚至难以记录所有细节。此时&#xff0c;录音转文字软件就派上用场了。然而&#xff0c;市场上有太多种选择&#xff0c;到…

【Vue3 生态】Vue Router 路由知识概览

前言 在 Web 前端开发中&#xff0c;路由是非常重要的一环&#xff0c;但是路由到底是什么呢&#xff1f; 从路由的用途上讲 路由是指随着浏览器地址栏的变化&#xff0c;展示给用户不同的页面。 从路由的实现原理上讲 路由是URL到函数的映射。它将 URL 和应用程序的不同部分…

低代码平台——提高研发效率的神器

一、前言 听起来像是一个噱头&#xff0c;但是低代码确实是一个能够快速提高研发效率的神器。 通过使用低代码平台&#xff0c;研发人员可以节省好几个月的时间&#xff0c;将前后端各种功能可视化以搭积木的形式快速完成。今天&#xff0c;我们将深入探讨低代码开发平台的特点…

两阶段目标检测指南:R-CNN、FPN、Mask R-CNN

动动发财的小手&#xff0c;点个赞吧&#xff01; Source[1] 多阶段&#xff08;Two-stage&#xff09;物体检测 计算机视觉中最基本和最广泛研究的挑战之一是目标检测。该任务旨在在给定图像中绘制多个对象边界框&#xff0c;这在包括自动驾驶在内的许多领域非常重要。通常&am…

一种看门狗复位电源的电路

如下是一个看门狗复位电源的电路&#xff1a; 满足掉电能被监测到&#xff0c;掉电后利用法拉电容保持后级模组继续工作一段时间。 看门狗可以关闭电源 320ms 20ms &#xff0c;对后级模组起到断电复位作用。 同时复位电源拉低的是VCC_4V 而非超级电容所在的VCC_4V_IN,并不会…

SpringBoot项目的事务实现

说明&#xff1a;当业务中的某个功能&#xff0c;需要多个操作组合执行才能完成时&#xff08;如删除部门&#xff0c;部门下的员工也需要同步删除时&#xff09;&#xff0c;为了保证数据的一致性&#xff0c;需要对这些组合操作添加事务。&#xff08;参考&#xff1a;http:/…

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法&#xff0c;通过记录读卡器或智能手机打开时的电源 LED&#xff0c;使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知&#xff0c;这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

一、elasticsearch的简介与安装

目录 一、Elasticsearch下载 二、安装 三、启动 四、安装可视化插件&#xff08;elasticsearch-head&#xff09; 1、下载地址 2、解压缩下载好的压缩文件 3、进入解压缩目录 五、解决跨域问题 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方…

端午节出行的小贴士——行之安,乐之逍

亲爱的朋友们&#xff0c; 随着端午节的到来&#xff0c;想必许多人已经开始期待那份出游的快乐与解脱。无论你是期待漫步在宁静的田野小径&#xff0c;还是在繁华的城市中探索&#xff0c;这篇文章都会给你一些实用的端午节出行建议&#xff0c;帮助你尽情享受旅程。 首先&a…

Airtest图像识别测试工具原理解读最佳实践 | 京东云技术团队

1 Airtest简介 Airtest是一个跨平台的、基于图像识别的UI自动化测试框架&#xff0c;适用于游戏和App&#xff0c;支持平台有Windows、Android和iOS。Airtest框架基于一种图形脚本语言Sikuli&#xff0c;引用该框架后&#xff0c;不再需要一行行的写代码&#xff0c;通过截取按…

如何利用数据化营销助力新零售企业发展?”

​“新零售”这个概念诞生至今已有5年&#xff0c;但对于其具体的定义&#xff0c;行业内仍然有许多争议。有人认为“新零售”是对传统零售模式的颠覆&#xff1b;也有人认为“新零售”就是将线上和线下相结合。不论如何&#xff0c;在这个不断变化的行业中&#xff0c;新零售企…

使用omp技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

智能数字资产管理系统,全面提升企业的管理效率

智能数字资产管理系统&#xff0c;能够为企业带来很多成果&#xff0c;提高企业管理效率。让程序简单化&#xff0c;提升组织生产率&#xff0c;可以帮助企业以更有效的方式企业实现目标。 研发背景 智能数字资产管理系统 系统功能 1.可以实现数字资产全生命周期的管理&#…