无废话XML--DOM4J
Dom4j 是一个易用的、开源的库,用于 XML ,XPath 和 XSLT 。它应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM ,SAX 和 和 JAXP 。我们可以很方便的使用DOM4J来对一个XML进行CRUD操作,当然也可以面向对象编程,将一个XML里面的数据来转换成相关对象使用。
- 常用有4个接口,4个工具类:
Node Node:为所有的 dom4j 中 XML 节点定义了多态行为
Element Element:定义 XML 元素
Attribute Attribute:定义了 XML 的属性
Text Text:定义 XML 文本节点。
SAXReader:sax解析工具类
DOMReader:dom解析工具类
XMLWriter:写入XML文档工具类
OutputFormat:输入格式化工具类。
- 值得注意的2点是:
1,格式化输出和指定编码。默认的输出方式为紧凑方式,默认编码为 UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat 类。
2,Dom4j 编码问题。j ava中由W ri t er类继承下来的子类没有提供编码格式处理,所以dom 4j 也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的wi ndow下j ava的默认的编码为G BK,也就是所虽然我们标识了要将xm l 保存为ut f -8格式但实际上文件是以G BK格式来保存的,所以这也就是为什么能够我们使用G BK、G B2312编码来生成xm
l 文件能正确的被解析,而以U TF-8格式生成的文件不能被xm l 解析器所解析的原因。所以在创建XMLWriter这个对象时,最好使用FileOutputStream,不要用FileWriter。
以下代码使用了DOM4J对XML实现了CRUD操作:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Comment;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; /**
*
* @version 1L
* @author LinkinPark
* @since 2014-12-29
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^其实DOM4J还是比较简单的,API也不是很多,着重记住Document,Element,Attribute就好了。
* Node是上面所有的接口的公共一个多态接口
*/
public class Dom4jHandler
{
public Document parse(URL url) throws DocumentException
{
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
} //解析XML
public void read(String fileName) throws DocumentException
{
SAXReader reader = new SAXReader();
//定义XML文档
Document document = reader.read(this.getClass().getResourceAsStream("/" + fileName));
//定义XML元素
Element rootElement = document.getRootElement();
System.out.println("根节点是:" + rootElement.getName());
List<Element> childElements = rootElement.elements();
for (Element element : childElements)
{
System.out.println(element.getName());
//下面这个nodeCount里面包含了所有的节点,那个换行也包含上了呢
System.out.println(element.nodeCount());
for (int i = 0; i < element.nodeCount(); i++)
{
Node node = element.node(i);
System.out.println("节点的名字是" + node.getName() + ";节点的值是" + node.getText() + ";节点的类型是" + node.getNodeTypeName());
if (node instanceof Element)
{
System.out.println("这里是元素!");
}
else if (node instanceof Comment)
{
System.out.println("这里是注释!");
}
else
{
System.out.println("这里鸡毛都没有!");
}
}
//现在开始解决上面那个空白的换行问题 如何去掉呢?
System.out.println("========开始去掉那个空白============");
for (int i = 0; i < element.nodeCount(); i++)
{
Node node = element.node(i);
if (node instanceof Text)
{
System.out.println("这里是文本!");
if ("".equals(node.getText().trim()))
{
System.out.println("这里就是要去掉的空白吆。。。");
}
else
{
System.out.println("这里是内容不是空白,所以不要去掉。。。");
System.out.println(node.getText().trim());
}
}
}
System.out.println("=========去掉空白结束=============");
List<Attribute> attributes = element.attributes();
//遍历这个元素里面的所有的属性
for (Attribute attribute : attributes)
{
System.out.println(attribute.getName() + ":" + attribute.getValue());
}
//现在我只想得到version这个属性
Attribute attribute = element.attribute("version");
System.out.println(attribute.getName() + ":" + attribute.getValue());
//现在我只想直接拿出version这个属性的值
String attributeValue = element.attributeValue("version");
System.out.println(attributeValue);
//获得element这个元素里面的所有的子节点
List<Element> childs = element.elements();
for (Element element2 : childs)
{
//Element元素里面没有getValue方法,Attribute里面有,其实和getText是一样的
System.out.println(element2.getName() + ":" + element2.getText());
}
//同样的Element也可以直接获得值,而且还可以去除空格
System.out.println(element.elementText("driver"));
System.out.println(element.elementTextTrim("driver"));
}
} //写出一个XML
public void write(String fileName) throws Exception
{
//生成一个XML文档
Document document = DocumentHelper.createDocument();
//给XML文档也就是Document添加数据
Element root = document.addElement("DataSource");//添加根节点
root.addComment("这里是LinkinPark自己生成的XML。。。");//添加注释
Element dateBase = root.addElement("database");//在root根节点下添加一个子节点
dateBase.addAttribute("name", "mysql");//给dateBase添加属性
dateBase.addAttribute("version", "5.0");//给dateBase添加属性
dateBase.addElement("driver").setText("com.mysql.jdbc.Driver");//给dateBase添加子节点
dateBase.addElement("url").setText("jdbc:mysql://localhost:3306/linkinjdbc");//给dateBase添加子节点
dateBase.addElement("user").setText("root");//给dateBase添加子节点
dateBase.addElement("password").setText("root");//给dateBase添加子节点
//将这个XML文档写出到文件去
writerTo(document, fileName);
} //专门定义一个写出XML到指定文件的方法
public void writerTo(Document document, String fileName) throws Exception
{
//OutputFormat of = OutputFormat.createCompactFormat();//这个format是不换行的,没有格式化过的
OutputFormat of = OutputFormat.createPrettyPrint();//这里是格式化过的
of.setEncoding("UTF-8");
//XMLWriter writer = new XMLWriter(new FileWriter(fileName), of);
//最好使用下面这种情况,这样子可以有效的解决XML编码是UTF-8的编码错误问题
XMLWriter writer = new XMLWriter(new FileOutputStream(fileName), of);
writer.write(document);
writer.close();
} //修改一个XML 2个参数:一个是读取文件自己的位置,一个是要保存到的文件的位置。
//这里也很好的说明了加载文件和流的区别:使用类加载器是直接从内存中要的,所以相对路径没有src;但是要是使用一个流来指定输入位置,那么就是文件系统,src要有的。
public void update(String fileName1, String fileName2) throws Exception
{
//现在我要修改LinkinPark下面的数据库的名称和数据库连接的名称,一个是属性,一个是节点
SAXReader reader = new SAXReader();
Document document = reader.read(this.getClass().getResourceAsStream("/" + fileName1));
Element rootElement = document.getRootElement();
List<Element> childElements = rootElement.elements("database");
for (Element element : childElements)
{
if ("mysql".equals(element.attributeValue("name")))
{
//换了这个属性的名字
element.attribute("name").setText("Oracle1");
}
List<Element> childs = element.elements("driver");
for (Element element2 : childs)
{
System.out.println(element2.getText().trim());
if ("com.mysql.jdbc.Driver".equals(element2.getText().trim()))
{
element2.setText("oracle.jdbc.driver.OracleDriver");
}
}
}
writerTo(document, fileName2);
} //删除一个XML里面的一部分内容
public void delete(String fileName1, String fileName2) throws Exception
{
//现在我要删除LinkinPark下面的数据库的名称和数据库连接的名称,一个是属性,一个是节点
SAXReader reader = new SAXReader();
Document document = reader.read(this.getClass().getResourceAsStream("/" + fileName1));
Element rootElement = document.getRootElement();
List<Element> childElements = rootElement.elements("database");
for (Element element : childElements)
{
//删除掉这个属性
element.remove(element.attribute("name"));
//删除掉这个子节点
element.remove(element.element("driver"));
}
writerTo(document, fileName2);
} public static void main(String[] args) throws Exception
{
//new Dom4jHandler().read("data-sources.xml");
new Dom4jHandler().write("src/LinkinPark...");
//new Dom4jHandler().update("LinkinPark...", "src/LinkinPark...");
//new Dom4jHandler().delete("LinkinPark...", "src/LinkinPark...");
} }
<?xml version="1.0" encoding="UTF-8"?> <DataSource>
<!--这里是LinkinPark自己生成的XML。。。-->
<database name="mysql" version="5.0">
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306/linkinjdbc</url>
<user>root</user>
<password>root</password>
</database>
</DataSource>
无废话XML--DOM4J的更多相关文章
- 无废话XML--XML细节
今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍.作为基本的2种的数据交互载体(还有一个是json),基本的X ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- 无废话ExtJs 入门教程十九[API的使用]
无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...
- 无废话ExtJs 入门教程十七[列表:GridPanel]
无废话ExtJs 入门教程十七[列表:GridPanel] extjs技术交流,欢迎加群(201926085) 在Extjs中,GridPanel用于数据显示,即我们平时说的列表页.在本节中,我们先对 ...
- 无废话WCF入门教程六[一个简单的Demo]
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
- 无废话ExtJs 入门教程十六[页面布局:Layout]
无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...
- 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]
无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...
- 无废话ExtJs 入门教程十四[文本编辑器:Editor]
无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...
随机推荐
- 数据对象转json与md5加密注意事项
项目中遇到将OC数据对象类型转化字符类型,然后进行MD5加密的技术流程,在转化字符数组到字符加密过程中遇到一些问题. 问题 转化后的字符进行md5加密,出现与服务器加密结果不匹配的情况 分析 在对代码 ...
- 【Tarjan缩点】PO3352 Road Construction
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12532 Accepted: 630 ...
- ETL实践--Spark做数据清洗
ETL实践--Spark做数据清洗 上篇博客,说的是用hive代替kettle的表关联.是为了提高效率. 本文要说的spark就不光是为了效率的问题. 1.用spark的原因 (如果是一个sql能搞定 ...
- 简单的vuex 的使用
1. npm install vuex 2. 在src 下 新建文件夹 store (为什么是这个单词,vuex 是用来状态管理的,用储存一些组件的状态,取存贮之意),store 文件下 新建文件 i ...
- [linux] C语言Linux系统编程-TCP通信的11种状态
三次握手由client主动发出SYN请求, 此时client处于SYN_SENT状态(第一次握手)当server收到之后会由LISTEN转变为SYN_REVD状态, 并回复client, client ...
- Python日志监控系统处理日志(pyinotify)
前言 最近项目中遇到一个用于监控日志文件的Python包pyinotify,结合自己的项目经验和网上的一些资料总结一下,总的原理是利用pyinotify模块监控日志文件夹,当日志到来的情况下,触发相应 ...
- 前端构建工具gulp之基本介绍
1.基本介绍 gulp.js是一个自动化构建工具,是自动化项目的构建利器.可以对网站的资源进行优化,将开发过程中一些重复的任务通过执行命令自动完成.这样能很大的提高我们的工作效率. gulp.js是基 ...
- [翻译]QT core wallet manual 狗狗币核心钱包使用教程
译注:比特币没赶上可以玩狗狗币啊,水电厂包不起可以用CPU挖啊.为了顺应时代潮流,了解一下区(fa)块(heng)链(cai)和加密货币技术,准备从研究狗狗币开始.网上找了一圈没有看到很好的入门级教程 ...
- [51nod1502]苹果曼和纸
苹果曼有很大的一张纸.这张纸的形状是1×n的长方形.你的任务是帮助苹果曼来折叠这一张纸.有一些操作,这些操作有如下两个种形式: 1. 把这张纸在第pi个位置对折.经过对折后,左边的1×pi部分会盖到右 ...
- ES5.0集群搭建
最近在网上看到很多ES集群的搭建方法,本人在这人使用Elasticsearch5.0.1版本,介绍如何搭建es集群并安装head插件和其他插件安装方法. 一.搭建环境(2台Centos7系统服务器) ...