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

小灰灰 2023-10-12 17:54 188阅读 0赞

#

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

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

1、什么是xml

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

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

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

2、常见的xml解析工具

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

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

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

3、通过DOM4J解析XML文件

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

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

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

3.2、下载DOM4J的包

下载地址:dom4j

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

所以下载dom4j-2.1.4版本。

81ca0a0df31845d8a28f7f38b32a4c2a.png

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

0b29b054ef71444b96f6c92f73fd5e09.png

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

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

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

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

【解析代码】

  1. package com.it.test;
  2. import java.io.File;
  3. import java.util.List;
  4. import org.dom4j.Document;
  5. import org.dom4j.DocumentException;
  6. import org.dom4j.Element;
  7. import org.dom4j.io.SAXReader;
  8. public class TestXMLParse {
  9. public static void main(String[] args) throws DocumentException {
  10. //创建核心解析器
  11. SAXReader reader=new SAXReader();
  12. File file=new File("C://aa//1.xml");
  13. Document doc=reader.read(file);
  14. //得到xml的跟节点-既students
  15. Element root= doc.getRootElement();
  16. //通过根节点得到所有子节点-既所有student
  17. List<Element> elements= root.elements();
  18. //遍历得到所有的自己点的属性和值
  19. for (Element eles:elements) {
  20. //attributeValue:得到指定属性的值
  21. System.out.print("id的值=>"+eles.attributeValue("id"));
  22. System.out.print(",name的值=>"+eles.attributeValue("name"));
  23. //得到节点中间的值
  24. System.out.println(",地址=>"+eles.getTextTrim());
  25. }
  26. }
  27. }

【结果输出】

597bc2c02ea6480d9e5424d64283eb9d.png

4、将结果写入XML文件中

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

4.1、写入后样式

students:为根元素

student:为子元素

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

81235accaa944ace9ab59cc5c3e7cef7.png

4.2、导入lomok工具包

e832764135d64f19bdffb6045ff5d231.png

4.3、创建Student对象

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

  1. @Setter //生成set方法
  2. @Getter //生成get方法
  3. @AllArgsConstructor //生成有参数构造器
  4. @NoArgsConstructor //生成无参数构造器
  5. public class Student {
  6. private String stu_id;
  7. private String stu_name;
  8. private String stu_sex;
  9. private String stu_age;
  10. private String stu_addr;
  11. private String stu_pwd;
  12. }

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

  1. package com.it.test;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentHelper;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.OutputFormat;
  12. import org.dom4j.io.XMLWriter;
  13. import com.it.bean.Student;
  14. public class TestWriterXML {
  15. public static void main(String[] args) throws IOException {
  16. //创建集合模拟数据库查询数据
  17. List<Student> list=new ArrayList<>();
  18. Student stu1=new Student("1001","陈平安","男","15","东宝瓶洲泥瓶巷","1001");
  19. Student stu2=new Student("1002","王煊","男","25","旧星","1002");
  20. Student stu3=new Student("1003","萧炎","男","35","乌坦城萧家","1003");
  21. list.add(stu1);
  22. list.add(stu2);
  23. list.add(stu3);
  24. //创建Document对象-DOM4J写入XML中需要将list转化成Document
  25. Document doc=DocumentHelper.createDocument();
  26. //向Document对象中添加根节点-XML最外层的元素节点
  27. Element root= doc.addElement("students");
  28. //向Document对象中添加数
  29. for (int i = 0; i <list.size(); i++) {
  30. root.addElement("student")
  31. .addAttribute("id", list.get(i).getStu_id())
  32. .addAttribute("name", list.get(i).getStu_name())
  33. .addAttribute("sex", list.get(i).getStu_sex())
  34. .addAttribute("age", list.get(i).getStu_age())
  35. .addAttribute("pwd", list.get(i).getStu_pwd())
  36. .addText(list.get(i).getStu_addr());
  37. }
  38. //在C盘中创建目录xmlfile-此处可以自定义地址
  39. File file=new File("C://xmlfile");
  40. if(!file.exists()){//如果目录不存在,就创建目录
  41. file.mkdir();
  42. }
  43. //将内容写入到C://xmlfile目录中的test.xml文件中
  44. OutputStream out=new FileOutputStream(file+"//"+"test.xml");
  45. //设置写入的格式,createPrettyPrint表示写入的时候换行
  46. OutputFormat format=OutputFormat.createPrettyPrint();
  47. //设置编码集为UTF-8,中文也可以使用GBK
  48. format.setEncoding("UTF-8");
  49. //通过XMLWriter将内容写入到xml中
  50. XMLWriter writer=new XMLWriter(out, format);
  51. writer.write(doc);//写入
  52. writer.flush();//关闭资源前刷新
  53. writer.close();//关闭资源
  54. out.close();//关闭输出流
  55. }
  56. }

5、修改XML中指定的参数

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

5.1、编码实现

  1. package com.it.test;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;
  6. import java.util.List;
  7. import org.dom4j.Attribute;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentException;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.OutputFormat;
  12. import org.dom4j.io.SAXReader;
  13. import org.dom4j.io.XMLWriter;
  14. public class TestUpdXML {
  15. public static void main(String[] args) throws IOException, DocumentException {
  16. //创建核心解析器
  17. SAXReader reader=new SAXReader();
  18. File file=new File("C://xmlfile//test.xml");
  19. Document doc=reader.read(file);
  20. //得到xml的跟节点
  21. Element root= doc.getRootElement();
  22. //通过跟节点得到子节点
  23. List<Element> elements= root.elements();
  24. //遍历得到所有的自己点的属性和值
  25. for (Element eles:elements) {
  26. if(eles.attributeValue("id").equals("1003")){
  27. Attribute attr= eles.attribute("name");
  28. attr.setValue("萧炎-斗破苍穹");
  29. break;
  30. }
  31. //修改地址,地址在元素中间,修改方式如下
  32. //eles.setText("");
  33. }
  34. //内容修改后,需要将内容重写写入到xml文件中
  35. OutputStream out=new FileOutputStream(file);
  36. OutputFormat format=OutputFormat.createPrettyPrint();
  37. format.setEncoding("UTF-8");
  38. XMLWriter writer=new XMLWriter(out, format);
  39. writer.write(doc);
  40. writer.flush();
  41. writer.close();
  42. out.close();
  43. }
  44. }

5.2、修改结果

414cfe72ef0c4efaa44d5865631364e1.png

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

  1. public class AddServlet {
  2. public AddServlet(){
  3. System.out.println("===========AddServlet被实例化==========");
  4. }
  5. }

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

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <welcome-file-list>
  4. <welcome-file>index.html</welcome-file>
  5. </welcome-file-list>
  6. <servlet>
  7. <servlet-name>AddServlet</servlet-name>
  8. <servlet-class>com.it.servlet.AddServlet</servlet-class>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>AddServlet</servlet-name>
  12. <url-pattern>/add.do</url-pattern>
  13. </servlet-mapping>
  14. <servlet>
  15. <servlet-name>UpdServlet</servlet-name>
  16. <servlet-class>com.it.servlet.UpdServlet</servlet-class>
  17. </servlet>
  18. <servlet-mapping>
  19. <servlet-name>UpdServlet</servlet-name>
  20. <url-pattern>/upd.do</url-pattern>
  21. </servlet-mapping>
  22. <servlet>
  23. <servlet-name>DeleteServlet</servlet-name>
  24. <servlet-class>com.it.servlet.DeleteServlet</servlet-class>
  25. </servlet>
  26. <servlet-mapping>
  27. <servlet-name>DeleteServlet</servlet-name>
  28. <url-pattern>/delete.do</url-pattern>
  29. </servlet-mapping>
  30. </web-app>

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

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

【测试代码】

  1. package com.it.test;
  2. import java.io.File;
  3. import java.util.List;
  4. import org.dom4j.Document;
  5. import org.dom4j.Element;
  6. import org.dom4j.io.SAXReader;
  7. public class TestParseWebXML {
  8. public static void main(String[] args) throws Exception{
  9. String url="/add.do";
  10. SAXReader reader=new SAXReader();
  11. File file=new File(System.getProperty("user.dir")+"//src//web.xml");
  12. Document doc=reader.read(file);
  13. //得到xml的跟节点
  14. Element root= doc.getRootElement();
  15. //通过跟节点得到子节点
  16. List<Element> elements= root.elements();
  17. String servletName="";
  18. //寻找第一个参数:通过url找到对应的servlet-name的值
  19. for (Element eles:elements) {
  20. //判断进入servlet-mapping元素中,此时web.xml有多个servlet-mapping
  21. if(eles.getName().equals("servlet-mapping")){
  22. //判断servlet-mapping中的url-pattern的值url参数相等
  23. if(eles.elementText("url-pattern").equals(url)){
  24. //如果条件满足,就获取对应的servlet-name的值
  25. servletName=eles.elementText("servlet-name");
  26. }
  27. }
  28. }
  29. //寻找第二个参数:通过servlet-name找到对应的servlet-class的值
  30. String servletClass="";
  31. for (Element eles:elements) {
  32. //先进入到servlet元素中,此时有多个servlet元素
  33. if(eles.getName().equals("servlet")){
  34. //判断servlet-name是否与上面的servletName相等
  35. if(eles.elementText("servlet-name").equals(servletName)){
  36. //如果条件满足,获取servlet-class的值
  37. servletClass=eles.elementText("servlet-class");
  38. }
  39. }
  40. }
  41. //通过servletClass的全限定类名实现类的实例化
  42. Class.forName(servletClass).newInstance();
  43. }
  44. }

【测试结果】

0527c26fbfb74990a4831d084e8ce960.png

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

【对应的servlet-mapping配置】

  1. <servlet-mapping>
  2. <servlet-name>AddServlet</servlet-name>
  3. <url-pattern>/add.do</url-pattern>
  4. <url-pattern>/add1.do</url-pattern>
  5. <url-pattern>/add2.do</url-pattern>
  6. <url-pattern>/add3.do</url-pattern>
  7. </servlet-mapping>

6.5、具体解析方式

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

【代码测试】

  1. package com.it.test;
  2. import java.io.File;
  3. import java.util.List;
  4. import org.dom4j.Document;
  5. import org.dom4j.Element;
  6. import org.dom4j.io.SAXReader;
  7. /**
  8. * dom4j,模拟解析web.xml配置文件。
  9. * @author Administrator
  10. *
  11. */
  12. public class TestParseWebXML {
  13. public static void main(String[] args) throws Exception{
  14. String url="/add2.do";
  15. SAXReader reader=new SAXReader();
  16. File file=new File(System.getProperty("user.dir")+"//src//web.xml");
  17. Document doc=reader.read(file);
  18. //得到xml的跟节点
  19. Element root= doc.getRootElement();
  20. //通过跟节点得到子节点
  21. List<Element> elements= root.elements();
  22. String servletName="";
  23. //寻找第一个参数:通过url找到对应的servlet-name的值
  24. for (Element eles:elements) {
  25. if(eles.getName().equals("servlet-mapping")){
  26. //得到当前的servlet-mapping元素下的子元素(serlvet-name,url-pattern)
  27. List<Element> urlpattern=eles.elements();
  28. 用来遍历一个servlet-mapping中的多个url-pattern
  29. for (Element e:urlpattern) {
  30. if(e.getName().equals("url-pattern")){
  31. if(e.getText().equals(url)){//第一次/add.do;第二次/add1.do....
  32. servletName=eles.elementText("servlet-name");
  33. }
  34. }
  35. }
  36. }
  37. }
  38. //寻找第一个参数:通过servlet-name找到对应的servlet-class的值
  39. String servletClass="";
  40. for (Element eles:elements) {
  41. //先进入到servlet元素中,此时有多个servlet元素
  42. if(eles.getName().equals("servlet")){
  43. //判断servlet-name是否与上面的servletName相等
  44. if(eles.elementText("servlet-name").equals(servletName)){
  45. //如果条件满足,获取servlet-class的值
  46. servletClass=eles.elementText("servlet-class");
  47. }
  48. }
  49. }
  50. //通过servletClass的全限定类名实现类的实例化
  51. Class.forName(servletClass).newInstance();
  52. }
  53. }

【测试结果】

5256af3c47404209a87603e64c2245c5.png

7、源码下载

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

发表评论

表情:
评论列表 (有 0 条评论,188人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Dom4J解析xml文件

    (一)xml基础简介: 什么是xml? \-可扩展标记语言,根据自己的需求定义自己的标签。 xml文件的作用: \-主要用来传输和存储数据。 解析xml文件的方法