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文档也是数据的一种,对数据的 ...
随机推荐
- 云-腾讯云-云点播:云点播(VOD)
ylbtech-云-腾讯云-云点播:云点播(VOD) 提供端到端的一站式VpaaS音视频点播解决方案 1.返回顶部 1. 云点播(Video on Demand,VOD)基于腾讯多年技术积累与基础设施 ...
- Windows平台编译libevent
使用VisualStudio来编译,我的电脑上安装的是VS2013.1.在开始菜单项里面(或者在VS安装路径中)打开Developer Command Prompt for VS2013.exe2.在 ...
- 第十四篇:PL/SQL Developer Oracle配置和必知基础
1.一般在本地使用PL/SQL 第三方工具操作Oracle数据库,首先你的机器上得有oracle的客户端client,下一个就行了,很小2.首先找到你下载的oracle的客户端的包,找到tnsname ...
- <小白学技术>将python脚本导出为exe可执行程序
1.简介(为啥需要导出为exe可执行程序) python写完的程序靠命令来执行,显得太专业,不符合python简单的特点(好吧,主要是太low) 代码给别人执行,别人没有你的python库也没法用(双 ...
- Amazon AWS
- spring:bean的细节之三种创建Bean对象的方式
<!--创建Bean的三种方式--><!--第一种方式,使用默认构造函数创建 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有属性和标签时. 采用的就 ...
- Python全栈开发:选课系统实例
程序目录: bin文件夹下为可执行文件:administrator,students config文件夹下为设置文件,涉及系统参数配置:setting db文件夹为数据类文件,涉及系统的输入输出数据: ...
- P3480 [POI2009]KAM-Pebbles
P3480 [POI2009]KAM-Pebbles比如第一个样例 原:0 2 2差: 2 0 0如果把中间的2拿掉一个,就会变成原:0 1 2差: 1 1 0就可以把差看成阶梯nim细节:最终要移到 ...
- 廖雪峰Java13网络编程-2Email编程-1发送email
1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...
- 廖雪峰Java12maven基础-2maven进阶-1使用插件
1.maven的Lifecycle,Phase和Goal: 使用maven构建项目就是执行Lifecycle 执行Lifecycle就是按顺序执行一系列Phase 每执行一个Phase,都会执行该Ph ...