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文档也是数据的一种,对数据的 ...
随机推荐
- 一些关于Hibernate延迟加载的误区
最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写 些东东在这里,希望对大家有所帮助. 首先是第一个误区:延迟加 ...
- 十条服务器端优化Web性能的技巧总结
原文地址:http://www.jb51.net/yunying/452723.html 提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长:全球经济超过 5% 的价值是在因特网 ...
- 关于C++ const 的全面总结 分类: ubuntu 2014-12-03 21:03 72人阅读 评论(0) 收藏
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...
- 通过apiservice反向代理访问service
第一种:NodePort类型 type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30008 第二种:ClusterIP类型 typ ...
- vue qs插件的使用
参考:https://blog.csdn.net/weixin_43851769/article/details/86505164 qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库. 步 ...
- Python全栈开发:运算符
1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算:
- Atcoder arc096
C:Half and Half 几个if语句贪心算一算就好了 #include<cstdio> #include<algorithm> using namespace std; ...
- python 简单的图片比较
# by movie on 2019/12/18 from PIL import Image from PIL import ImageChops path1 = 'images/trumpA689. ...
- 11-1-break-continue
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js日期格式化Date
使用Date类进行日期格式化. 1 输入“yyyy-MM-dd hh:mm:ss”格式的String字符串,返回字符串 做一个简单判定,在当日显示为几点几分,同年为月日,不同年显示年月 functio ...