dom4j和document
DOM的优点和缺点:
优点:DOM操作思维清晰,简单
缺点:在操作大量数据的时候性能,不能保证
DOM(Document Object Model)
// 表示出需要被操作的XML文件的路径,注意是文件的路径,不是文件所在的目录
private File f = new File("D:\\workspace\\dom4jAndDocument\\contacts.xml");
@Test
public void testGetDocument() throws Exception{
// 根据DocumentBuilderFactory类,来获取DocumentBuilderFactory对象
// 注意:工厂设计模式往往体现着单列设计模式
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 根据DocumentBuilderFactory对象,创建DocumentBuilder对象
// 注意:XxxFactory,就是用来创建Xxx对象的
DocumentBuilder builder = factory.newDocumentBuilder();
// 根据DocumentBuilder对象,构建Document对象
Document parse = builder.parse(f);
System.out.println(parse);
}
什么时候使用newDocument,什么时候使用parse方法呢?
一般的,当一个XML文件已经存在,我们就只需要去解析即可. -->parse
什么叫解析:把一个数据,从简单类型(String)转换为描述该数据的类型.
如:String time = "2019-11-25",字符串的时间
Date date = DateFormat对象.parse(String time)
当一个XML文件不存在的时候,我们使用newDocument
// 从contacts.xml文件中获取第二个联系人的名字
@Test
public void test1() throws Exception{
// 1):获取Document文本对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document parse = builder.parse(f);
// 2):获取XML的根元素对象:contacts.
Element element = parse.getDocumentElement();
// 3):获取根元素下的第二个linkman元素
NodeList nodeList = element.getElementsByTagName("linkman");
Node linkmanEl =(Element) nodeList.item(1);
// 4):获取该linkman元素下的第一个name元素
Element nameEl = (Element) ((Element) linkmanEl).getElementsByTagName("name").item(0);
// 5):获取该name元素的文本内容.
String name = nameEl.getTextContent();
Assert.assertEquals("Will",name);
System.out.println(name);
}
// 从contacts.xml文件中修改一个联系人的邮箱地址
@Test
public void test2() throws Exception{
// 1):获取Document文本对象
Document doc = DocumentBuilderFactory
.newInstance().newDocumentBuilder().parse(f);
// 2):获取根元素对象
Element root = doc.getDocumentElement();
// 3):获取第一个linkman元素
Node linkmanEl = root.getElementsByTagName("linkman").item(0);
// 4);获取该linkman元素下的第一个email元素
Element emailEl = (Element) ((Element) linkmanEl).getElementsByTagName("email").item(0);
// 5):修改该email元素的文本内容
emailEl.setTextContent("renxiaolong@520it.com");
// 6):同步操作
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
Source source = new DOMSource(doc); // 内存中的Document对象
Result result = new StreamResult(f); // 磁盘中的xml文件对象
trans.transform(source,result);
}
// 从contacts.xml文件中增加一个联系人信息
@Test
public void test3() throws Exception{
// 1):获取Document文本对象
Document doc = DocumentBuilderFactory
.newInstance().newDocumentBuilder().parse(f);
// 2):获取根元素对象
Element root = doc.getDocumentElement();
// 3):创建一个linkman元素的片段
// 3.1:创建linkman,name,email,address,group5个元素
Element linkmanEl = doc.createElement("linkman");
Element nameEl = doc.createElement("name");
Element emailEl = doc.createElement("email");
Element addressEl = doc.createElement("address");
Element groupEl = doc.createElement("group");
// 3.2:设置name,email,address,group的文本内容
nameEl.setTextContent("小明");
emailEl.setTextContent("xaomin@520it.com");
addressEl.setTextContent("中国");
groupEl.setTextContent("听闻");
// 3.3:建立元素之间的层次关系:
// 3.3.1:把name,email,address,group四个作为linkman元素的子元素
linkmanEl.appendChild(nameEl);
linkmanEl.appendChild(emailEl);
linkmanEl.appendChild(addressEl);
linkmanEl.appendChild(groupEl);
// 3.3.2:把linkman元素,作为根元素的子元素
root.appendChild(linkmanEl);
// 4):同步操作
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
// 设置和获取第三个联系人的id属性
@Test
public void test4() throws Exception {
// 1):获取Document文本对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(f);
// 2):获取根元素对象
Element element = doc.getDocumentElement();
// 3):获取第三个linkman元素
NodeList linkman = element.getElementsByTagName("linkman");
Node linkmanEl =linkman.item(2);
// 获取id属性
String map = ((Element) linkmanEl).getAttribute("id");
System.out.println(map);
// 设置id属性:1234
((Element) linkmanEl).setAttribute("id","1234");
// 4):同步操作
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
// 删除第三个联系人信息
@Test
public void test5() throws Exception{
// 1):获取Document文本对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(f);
// 2):获取根元素对象
Element root = doc.getDocumentElement();
// 3):获取第三个linkman元素
NodeList linkman = root.getElementsByTagName("linkman");
Node linkmanEl = linkman.item(3);
// 4):删除第三个linkman元素
// 请自己的老爸来干掉自己
root.removeChild(linkmanEl);
// 5):同步操作
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
// 在内存中创建一个Document对象
@Test
public void test6() throws Exception {
Document doc = null;
// 如果文件存在,则直接解析
// 如果文件不存在,则应该在内存中先创建Document对象
DocumentBuilder builder = DocumentBuilderFactory
.newInstance().newDocumentBuilder();
if (f.exists()) { // 如果文件存在
doc = builder.parse(f);
} else { // 如果文件不存在
doc = builder.newDocument();
// 设置Xml信息
doc.setXmlVersion("1.0");
// 创建根元素
Element root = doc.createElement("contacts");
// 把根元素设置为文档的儿子元素
doc.appendChild(root);
}
// 获取根元素对象
Element root = doc.getDocumentElement();
// 创建一个linkman元素的片段
// 创建linkman,name,email,address,group5个元素
Element linkmanEl = doc.createElement("linkman");
Element nameEl = doc.createElement("name");
Element emailEl = doc.createElement("email");
Element addressEl = doc.createElement("address");
Element groupEl = doc.createElement("group");
// 设置name,email,address,group的文本内容
nameEl.setTextContent("小明");
emailEl.setTextContent("xaomin@520it.com");
addressEl.setTextContent("中国");
groupEl.setTextContent("听闻");
// 建立元素之间的层次关系:
// 把name,email,address,group四个作为linkman元素的子元素
linkmanEl.appendChild(nameEl);
linkmanEl.appendChild(emailEl);
linkmanEl.appendChild(addressEl);
linkmanEl.appendChild(groupEl);
// 3.3.2:把linkman元素,作为根元素的子元素
root.appendChild(linkmanEl);
// 同步操作
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(f));
}
DOM4j(DOM for Java(为Java提供的DOM操作的API))
使用DOM4J需要导入的Jar包:dom4j-1.6.1.jar
// 使用DOM4j从contacts.xml文件中查询所有联系人的信息
private File f = new File("D:\\workspace\\dom4jAndDocument\\contacts.xml");
@Test
public void testQueryAll() throws Exception{
// 获取Document对象
SAXReader reader = new SAXReader();
Document read = reader.read(f);
// 获取根元素
Element root = read.getRootElement();
// 获取根元素中所有的linkman元素
List<Element> linkman = root.elements("linkman");
for (Element like:linkman) {
// 获取linkman元素的id属性
String id = like.attributeValue("id");
// 获取linkman元素下的name,email,address,group子元素的文本内容
String name = like.elementText("name");
String email = like.elementText("email");
String address = like.elementText("address");
String group = like.elementText("group");
System.out.println(id + "," + name + "," + email + "," + address + "," + group);
}
}
// 使用DOM4j新增一个联系人的信息到contacts.xml文件中
@Test
public void testInsert() throws Exception {
// 获取Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
// 获取根元素
Element root = doc.getRootElement();
// 创建linkman元素,并设置为根元素的子元素
Element linkman = root.addElement("linkman");
// 为linkman元素设置id属性
linkman.addAttribute("id", "4");
// 为linkman创建子元素:name,email,address,group
linkman.addElement("name").setText("西门吹雪");
linkman.addElement("email").setText("飞鸽传书");
linkman.addElement("address").setText("万梅山庄");
linkman.addElement("group").setText("武侠");
// 同步操作
OutputFormat format = OutputFormat.createPrettyPrint(); // 对xml做格式化效果
// 设置编码
format.setEncoding("UTF-8");
// format = OutputFormat.createCompactFormat(); // 把xml文件的数据,转换为一行
XMLWriter writer = new XMLWriter(new FileWriter(f), format);
writer.write(doc);
writer.close(); // 关闭流
}
dom4j和document的更多相关文章
- Java XML解析工具 dom4j介绍及使用实例
Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...
- DOM4J介绍与代码示例【转载】
DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...
- 实例分析jdom和dom4j的使用和区别
对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于xml的解析看不懂的可以先去看下我之前关于do ...
- 使用dom4j创建和解析xml
之前工作中用到了,相信写java的都会碰到xml,这里写了两个方法,创建和解析xml,废话不多说,直接上代码 package xml; import java.io.File; import java ...
- java代码用dom4j解析xml文件的简单操作
时间: 2016/02/17 目标:为telenor的ALU Femto接口写一个采集xml文件并解析出locationName标签里的值,然后更新到数据库中. 从网上搜了下,有四种常用的解析xml的 ...
- DOM4J介绍与代码示例
DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- Day06 DOM4J&schema介绍&xPath
day06总结 今日内容 XML解析之JAXP( SAX ) DOM4J Schema 三.XML解析器介绍 操作XML文档概述 1 如何操作XML文档 XML文档也是数据的一种,对数据的 ...
随机推荐
- 51nod-1130-N的阶乘的长度V2(斯特林近似)-套斯特林公式
输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. 输入 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 - T + 1行:每 ...
- 收藏的链接-Qt
Qt编写的开源帖子集合(懒人专用) - QTCN开发网 - Powered by phpwind http://www.qtcn.org/bbs/read-htm-tid-85501.html?tds ...
- 基于jdk8的格式化时间方法
背景 jdk8之前,java使用Date表示时间,在做时间的格式化时,通常使用SimpleDateFormat,但是SimpleDateFormat是非线程安全的,在写代码时通常要将之定义为局部变量或 ...
- XCode的依赖库管理工具——CocoaPods
安装CocoaPods 首先,在启动台里打开终端(terminal),并在终端里输入“sudo gem install cocoapods”,按回车后输入电脑用户密码(注意:输入期间不会显示“***” ...
- iOS开发系列-NSURLConnection
概述 NSURLConnection是负责发送请求,建立客户端与服务端的连接.发送数据给服务器,并收集来自服务器的响应数据.其中NSURLRequest类是用来封装一个请求,包含NSURL对象.请求方 ...
- Java工具类NumberUtils使用
int数据类型和long数据类型 int占32位,long占64位,long表示的数据更大:public static int toInt(String str) NumberUtils.toInt( ...
- vc 获取窗口标题GetWindowText
今天在写一个模块,具体功能是想时刻监控用户当前活动窗口,需要获取窗口标题以及其它相关信息,记得API GetWindowText就是用来做这个的,结果试了半天,有的获取成功了有的获取失败了,而且有关汉 ...
- 第三方下载控件 用起来还是不错的偶!Aria
本文主要介绍开源项目Aria的使用. 先在项目里的build 中配置compile 'com.arialyy.aria:Aria:3.1.1' //下载 开始下载 Aria.download(this ...
- P1082 同余方程(扩欧模板)
https://www.luogu.org/problem/P1082 #include <iostream> #include <cstdio> #include <q ...
- thinkphp 虚拟模型
虚拟模型是指虽然是模型类,但并不会真正的操作数据库的模型.有些时候,我们建立模型类但又不需要进行数据库操作,仅仅是借助模型类来封装一些业务逻辑,那么可以借助虚拟模型来完成.虚拟模型不会自动连接数据库, ...