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. System.Web.Mvc.HttpDeleteAttribute.cs

    ylbtech-System.Web.Mvc.HttpDeleteAttribute.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral ...

  2. JS if 判断

    if条件判断 1.语法结构——只判断true,不判断false if(条件判断:结果只有两个true或false) { 条件为true,将执行该代码: } 说明:   if是系统关键字,必须全小写. ...

  3. 利用VS2015自带的报表制作报表

    我用的是VSEnterprise2015 注意:如果要用VS自带的报表,就需要在安装Microsoft SQL Server Data Tools 下面讲讲具体步骤: 1.添加winform界面 2. ...

  4. 如何在 JavaScript 中使用 C 程序

    JavaScript 是个灵活的脚本语言,能方便的处理业务逻辑.当需要传输通信时,我们大多选择 JSON 或 XML 格式. 但在数据长度非常苛刻的情况下,文本协议的效率就非常低了,这时不得不使用二进 ...

  5. 左神算法进阶班1_5BFPRT算法

    在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...

  6. 026_JDBC

    JDBC简介 JDBC(Java DataBase Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编 ...

  7. css实现文字内容超出显示省略号

    white-space: nowrap; /* 内容超出容器宽度时强制不换行 */ overflow: hidden; /* 内容超出容器时隐藏超出部分 */ text-overflow: ellip ...

  8. NOI 2001 食物链 /// 并查集 oj22035

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1~N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  9. [WPF自定义控件库]使用WindowChrome自定义RibbonWindow

    原文:[WPF自定义控件库]使用WindowChrome自定义RibbonWindow 1. 为什么要自定义RibbonWindow 自定义Window有可能是设计或功能上的要求,可以是非必要的,而自 ...

  10. Slim模型部署多GPU

    1 多GPU原理 单GPU时,思路很简单,前向.后向都在一个GPU上进行,模型参数更新时只涉及一个GPU. 多GPU时,有模型并行和数据并行两种情况. 模型并行指模型的不同部分在不同GPU上运行. 数 ...