java学习:使用dom4j读写xml文件
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>
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 }
运行结果:
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>
否则运行时会提示"类找不到"之类的错误
- 将你的网站打造成一个iOS Web App
- 什么是人?人工智能的发展已经逼迫人类思考这样的问题
- 加法生产
- Web 前端利器Emmet 的HTML用法总结
- Web 前端利器Emmet 的CSS 用法总结
- 响应式 HTML 邮件制作之三个实例
- java知识点归纳
- EaseMobile 主题导航菜单设置小图标的方法(图文+视频教程)
- NEC css规范
- DW Mobile Switcher:移动设备识别切换主题插件
- 揭秘技术大国以色列
- mix-blend-mode 混合模式 background-blend-mode 背景混合模式 isolation:isolate 隔离
- wp_nav_menu 函数经Walker_Nav_Menu 类自定义导航菜单HTML
- css3 RGBA 红色R+绿色G+蓝色B+Alpha通道
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 技术分享 | 一文了解高并发限流算法
- prometheus-operator 监控 k8s 外部集群
- Kubernetes 通过statefulset部署redis cluster集群
- 猿实战13——实现你没听说过的前台类目
- 猿实战14——前台类目之广告牌设置
- 猿实战15——关联你所不明白的前后台类目
- 完美解决方案-雪花算法ID到前端之后精度丢失问题
- 猿实战16——承运商之搭建你的运费基石
- List对象去重及按属性去重的8种方法-java基础总结第六篇
- 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇
- 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇
- 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
- 总结java中删除文件或文件夹的7种方法-JAVA IO基础总结第四篇
- 总结java中创建并写文件的五种方式-JAVA IO基础总结第一篇
- 8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇