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的更多相关文章

  1. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  2. DOM4J介绍与代码示例【转载】

    DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...

  3. 实例分析jdom和dom4j的使用和区别

    对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于xml的解析看不懂的可以先去看下我之前关于do ...

  4. 使用dom4j创建和解析xml

    之前工作中用到了,相信写java的都会碰到xml,这里写了两个方法,创建和解析xml,废话不多说,直接上代码 package xml; import java.io.File; import java ...

  5. java代码用dom4j解析xml文件的简单操作

    时间: 2016/02/17 目标:为telenor的ALU Femto接口写一个采集xml文件并解析出locationName标签里的值,然后更新到数据库中. 从网上搜了下,有四种常用的解析xml的 ...

  6. DOM4J介绍与代码示例

    DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...

  7. 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来 ...

  8. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  9. Day06 DOM4J&schema介绍&xPath

    day06总结 今日内容 XML解析之JAXP( SAX ) DOM4J Schema   三.XML解析器介绍   操作XML文档概述   1 如何操作XML文档 XML文档也是数据的一种,对数据的 ...

随机推荐

  1. 杂项-日志:日志(log)

    ylbtech-杂项-日志:日志(log) 1.返回顶部 1. 概述 网络设备.系统及服务程序等,在运作时都会产生一个叫log的事件记录:每一行日志都记载着日期.时间.使用者及动作等相关操作的描述. ...

  2. vue.js+web storm安装及第一个vue.js

    小白还是自己写一遍吧 1.下载node.js https://nodejs.org/en/download/ 2.安装淘宝镜像(类似于阿里云的maven中央仓库镜像) 安装时间有点长 安装命令:npm ...

  3. jedis3.1.0在weblogic(jdk1.6)中无法运行

    文章目录 错误 探索 总结 错误 在tomcat中运行是没有问题的,可是在weblogic中是不能够运行的,weblogic中的jdk客户要求是1.6的. 如果更换版本jedis2.9.0是没有问题的 ...

  4. UVA-307-Sticks-dfs+剪枝

    George took sticks of the same length and cut them randomly until all parts became at most 50 units ...

  5. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  6. JavaScript变量名与函数名的命名规范

    JavaScrip变量名与函数名的命名规范严格遵循以下5条: (1)首字符必须是字母.下划线.$,后跟任意的字母.数字.下划线.$ (2)严格区分大小写 (3)不能使用系统的关键字和保留字 (4)命名 ...

  7. ConcurrentHashMap线程安全的具体实现方式/底层具体实现

    1. jdk1.7以及之前 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成. 通俗的话讲:就是首先将数据分为一段一段的存储,然后给每一段数据配一 ...

  8. 单独安装Babel或者Less

    1.直接安装Babel法: 1)初始化自动创建package.json npm init 2)首先全局安装Babel. npm install -g babel-cli 3)项目安装Babel. np ...

  9. VS2010-如何建立并运行多个含有main函数的文件

    一.先说两个概念,解决方案与工程 在VS2010中,工程都是在解决方案管理之下的.一个解决方案可以管理多个工程,可以把解决方案理解为多个有关系或者没有关系的工程的集合. 每个应用程序都作为一个工程来处 ...

  10. ThinkCMF框架任意内容包含漏洞复现

    1. 漏洞概述 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. 利用此漏洞无需任何权限情况下,构造恶意的url,可以向服务器写入任意内容的 ...