java学习:使用dom4j读写xml文件

简介: dom4j是一个优秀的开源项目,专用于xml文件的读写,而且支持强大的xpath. 下面的代码演示了对xml文件demo.xml的读写 demo.xml内容: 1 2 3 4 男 5 中国上海外滩No.

dom4j是一个优秀的开源项目,专用于xml文件的读写,而且支持强大的xpath.

下面的代码演示了对xml文件demo.xml的读写

demo.xml内容:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <address-list>
 3   <card name="yangjm" id="1">
 4     <sex></sex>
 5     <address><![CDATA[中国上海外滩No.01]]>    </address>
 6     <telephone>13916732212</telephone>
 7   </card>
 8   <card name="zhangsan" id="2">
 9     <sex></sex>
10     <address>
11       <item type="家庭地址"><![CDATA[中国.北京.东直门外大街]]>      </item>
12       <item type="单位地址"><![CDATA[中国.上海.田林路888号]]>      </item>
13     </address>
14     <telephone>010-123123</telephone>
15   </card>
16 </address-list>
demo.xml

java代码:

 1 package jmyang.dom4j;
 2 
 3 /**
 4  * <p>Title:dom4j测试 </p>
 5  * <p>Description: 使用xpath读取节点内容、属性</p>
 6  * <p>Copyright: Copyright (c) 2012</p>
 7  * <p>Company: infosky.com.cn</p>
 8  * @author:yjmyzz@126.com 菩提树下的杨过
 9  * @version 1.0
10  */
11 
12 import java.util.*;
13 import java.io.*;
14 import org.dom4j.*;
15 import org.dom4j.io.*;
16 
17 
18 public class XmlTest {
19 
20 
21     public static void Test() {
22         String fileName = System.getProperty("user.dir") + "\\demo.xml"; //当前路径下的demo.xml
23 
24         try {
25             SAXReader reader = new SAXReader();
26             Document doc = reader.read(fileName); //加载xml文件
27 
28             List peoples = doc.selectNodes("//*[@name]"); //选择所有具有name属性的节点(即demo.xml中的所有card节点)
29             for (Iterator iter = peoples.iterator(); iter.hasNext(); ) {
30                 Element card = (Element) iter.next();
31                 //System.out.println(node.asXML());
32                 //System.out.println("---------------------------------------");
33                 //System.out.println(node.attributeCount());
34                 List attrList = card.attributes();
35                 //输出每个card的所有属性
36                 for (Iterator attr = attrList.iterator(); attr.hasNext(); ) {
37                     Attribute a = (Attribute) attr.next();
38                     System.out.println(a.getName() + "=" + a.getValue());
39 
40                 }
41                 System.out.println(
42                         "----------------------------------------------------");
43             }
44 
45             Element zhangsan = (Element) doc.selectSingleNode("//card[@id='2']"); //查找“id属性”=2的card元素
46             System.out.println("张三的名称:" + zhangsan.attribute("name").getValue()); //输出zhangsan的name属性
47 
48             Node addrFamily = zhangsan.selectSingleNode("./address/item[2]"); //选择zhangsan元素下的address节点下的第2个item子节点
49             System.out.println("张三的单位地址:" + addrFamily.getStringValue()); //输出cdata内容
50 
51             System.out.println(
52                     "----------------------------------------------------");
53             //为zhangsan下增加二个节点
54             zhangsan.addElement("email").addAttribute("type",
55                     "工作").addText("work@some-domain.com");
56             zhangsan.addElement("email").addAttribute("type",
57                     "私人").addCDATA("private@some-domain.com"); //设置CDATA内容
58 
59             System.out.println(zhangsan.asXML()); //打印zhangsan节点的xml内容(调试用)
60             System.out.println(
61                     "----------------------------------------------------");
62 
63             //将上述改动保存到文件demo2.xml
64             FileWriter fileWriter = new FileWriter(System.getProperty(
65                     "user.dir") + "\\demo2.xml");
66 
67             OutputFormat format = OutputFormat.createPrettyPrint(); //设置美观的缩进格式,便于阅读
68             //format = OutputFormat.createCompactFormat();//设置紧凑格式(消除多余空格),便于下载
69             XMLWriter writer = new XMLWriter(System.out, format);
70             writer.setWriter(fileWriter);
71             writer.write(doc);
72             writer.close();
73 
74         } catch (Exception e) {
75             e.printStackTrace();
76         }
77 
78     }
79 }
XmlTest.java

运行结果:

name=yangjm
id=1
----------------------------------------------------
name=zhangsan
id=2
----------------------------------------------------
张三的名称:zhangsan
张三的单位地址:中国.上海.田林路888号     
----------------------------------------------------
<card name="zhangsan" id="2">
    <sex>女</sex>
    <address>
      <item type="家庭地址"><![CDATA[中国.北京.东直门外大街]]>      </item>
      <item type="单位地址"><![CDATA[中国.上海.田林路888号]]>      </item>
    </address>
    <telephone>010-123123</telephone>
  <email type="工作">work@some-domain.com</email><email type="私人"><![CDATA[private@some-domain.com]]></email></card>
----------------------------------------------------

保存后的demo2.xml

<?xml version="1.0" encoding="UTF-8"?>

<address-list>
  <card name="yangjm" id="1">
    <sex>男</sex> 
    <address><![CDATA[中国上海外滩No.01]]> </address> 
    <telephone>13916732212</telephone>
  </card> 
  <card name="zhangsan" id="2">
    <sex>女</sex> 
    <address>
      <item type="家庭地址"><![CDATA[中国.北京.东直门外大街]]> </item> 
      <item type="单位地址"><![CDATA[中国.上海.田林路888号]]> </item>
    </address> 
    <telephone>010-123123</telephone>  
    <email type="工作">work@some-domain.com</email>
    <email type="私人"><![CDATA[private@some-domain.com]]></email>
  </card>
</address-list>

最后注意一点:dom4j支持xpath语法,但该特性需要jaxen包的支持(编译期不需要,仅运行时需要),所以需要在项目中引入该包,如果是maven项目,要加入

<dependency>
   <groupId>jaxen</groupId>
   <artifactId>jaxen</artifactId>
   <version>1.1.3-redhat-2</version>
  </dependency>

否则运行时会提示"类找不到"之类的错误

目录
相关文章
|
2月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
232 1
|
2月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
315 0
|
3月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
165 1
|
2月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
310 7
|
3月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
83 5
|
3月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
155 5
|
3月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
186 3
|
3月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
96 1
|
3月前
|
设计模式 存储 Java
Java基础学习day07
本节讲解Java中的final关键字、单例设计模式、枚举类、抽象类与接口。涵盖常量定义、单例写法(饿汉式/懒汉式)、枚举特点及应用场景,以及抽象类与接口的使用与区别,助力掌握核心面向对象编程思想。
150 1
|
3月前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
92 2