DOM(Document Object Model),“文档对象模型”早期是为了解决不用浏览器间数据兼容问题提出的解决方案,现在已经是W3C组织推荐的处理可扩展标志语言的标准编程接口。

W3C DOM 被分为 3 个不同的部分/级别(parts / levels):

  • 核心 DOM:用于任何结构化文档
  • XML DOM:用于 XML 文档的标准模型
  • HTML DOM:用于 HTML 文档的标准模型

XML DOM 是:

  • 用于 XML 的标准对象模型
  • 用于 XML 的标准编程接口
  • 中立于平台和语言
  • W3C 的标准

SUN公司的JAXP(Java API for XML Processing)提供了对dom的支持;

其解析步骤为:

  • 创建 DOM 解析器的工厂
  • 得到 DOM 解析器对象。

对整个XML文档进行操作

<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE books SYSTEM "books.dtd"> -->
<books>
<book>
<author>joy</author>
<title>java core</title>
<price>100</price>
</book>
<book>
<author>joy1</author>
<title>Thinking in java</title>
<price>100</price>
</book>
<book>
<comment author="joy" id="S001" language="Chinese" price="20" title="Java"/>
<comment author="joy" id="S002" language="Chinese" price="20" title="Thinking in Java"/>
</book>
</books>
package com.sy;

import java.io.File;
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class first {
private static void findElement() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
NodeList list = doc.getElementsByTagName("title");
Node node = list.item(1);
System.out.println(node.getTextContent());
} // 获取属性内容
private static void getAttribute() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
Element node = (Element) doc.getElementsByTagName("comment").item(1);
System.out.println(node.getAttribute("title"));
} // 使用递归遍历xml文档
private static void loopNode() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
loop(doc);
} private static void loop(Node doc) {
NodeList list = doc.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
System.out.println(node.getNodeName());
loop(node);
} } // 添加节点,内容,属性
private static void createElement() throws ParserConfigurationException,
SAXException, IOException, TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
// 创建结点
Element e = doc.createElement("language");
// 添加内容
e.setTextContent("Chinese");
// 添加属性
e.setAttribute("aa", "xxx");
// 获取父节点,并append新创建的结点
doc.getElementsByTagName("book").item(1).appendChild(e);
// 使用Transformer将内存中更新过的xml文档写入实际的xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc),
new StreamResult(new File("books.xml")));
} // 注意:DOM的解析方式为将整个xml文档都加载入内存,因此对文档节点的添加、删除和修改操作都是只针对内存中的document对象,因此还需要使用Transformer类将修改真正写入到xml文件中!
// 删除节点
private static void deleteElement() throws ParserConfigurationException,
SAXException, IOException, TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
// 得到待删除的结点
Element e = (Element) doc.getElementsByTagName("language").item(0);
// 获取结点的父节点,然后删除该子结点
e.getParentNode().removeChild(e);
// 使用Transformer将内存中更新过的xml文档写入实际的xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc),
new StreamResult(new File("books.xml")));
} public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException, TransformerConfigurationException,
TransformerFactoryConfigurationError, TransformerException {
// findElement();
// getAttribute();
// loopNode() ;
// createElement();
deleteElement();
} }

代码解读

这个类内含七个函数(包括五个自定义功能函数,一个递归函数体,一个main函数)

五个功能函数:

JfindElement():发现节点(输出特定节点的文本内容)

    private static void JfindElement() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// ????
DocumentBuilder builder = factory.newDocumentBuilder();// ????
Document doc = builder.parse(new File("./WebRoot/xml/t6.xml"));// 获取页面
NodeList list = doc.getElementsByTagName("title");// 获取tittle节点
System.out.println(list.getLength());// 输出title节点长度
Node node = list.item(1);// 第二个节点
System.out.println(node.getTextContent());// 输出第二个节点的文本信息
}

getAttribute():获得属性值(输出特定节点的属性值)

private static void getAttribute() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("./WebRoot/xml/t6.xml"));
Element node = (Element) doc.getElementsByTagName("comment").item(1);// 获取comment节点集合
System.out.println(node.getAttribute("title"));// 输出node节点的tittle属性的值
}

loop(Node doc):递归主函数体

private static void loop(Node doc)// Document继承自Node,,,此处为向上转型
{
NodeList list = doc.getChildNodes();// 获取孩子节点的集合
// 便利孩子节点集合
// 输出每个节点的标签名
// 递归调用,输出每一层的子节点
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
System.out.println(node.getNodeName());
loop(node);
}
}
loopNode()递归输出所有节点
// 输出所有节点的节点名称
private static void loopNode() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("./WebRoot/xml/t6.xml"));
loop(doc);// 函数调用输出doc所有子孙节点
}

createElement():

创建新节点

把新节点添加到父节点后面

更新文档(把修改后的xml文档同步到本地)

private static void createElement() throws ParserConfigurationException,
SAXException, IOException, TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("./WebRoot/xml/t6.xml");
// 创建结点
Element e = doc.createElement("language");
// 为新创建的节点添加内容
e.setTextContent("Chinese");
// 为新创建的节点添加属性
e.setAttribute("aa", "xxx");
// 为新创建的节点获取父节点,并append新创建的结点
doc.getElementsByTagName("books").item(1).appendChild(e);
// 使用Transformer将内存中更新过的xml文档写入实际的xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new File(
"./WebRoot/xml/t6.xml")));
}

deleteElement():删除节点

找到他的父节点

父节点删除要删除的节点

更新文档(把修改后的xml文档同步到本地)

private static void deleteElement() throws ParserConfigurationException,
SAXException, IOException, TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("./WebRoot/xml/t6.xml"));
// 得到待删除的结点
Element e = (Element) doc.getElementsByTagName("language").item(0);
// 获取结点的父节点,然后删除该子结点
e.getParentNode().removeChild(e);
// 使用Transformer将内存中更新过的xml文档写入实际的xml文档中
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(new File(
"./WebRoot/xml/t6.xml")));
}

XML文档读取-DOM的更多相关文章

  1. 2.1 使用JAXP 对 xml文档进行DOM解析

    //使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ...

  2. xml文档读取-SAX

    由于dom采用的是将xml文档加载入内存进行处理的方式,如果xml文档较大,则会导致加载时间过长,效率降低的情况,因此,sun公司在JAXP中又添加了对SAX的支持: SAX,全称Simple API ...

  3. Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术

    一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...

  4. 使用JAXP对xml文档进行DOM解析基础

    XML解析方式分为两种:dom和sax         dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式.       sax: ...

  5. 使用JAXP对XML文档进行DOM解析

    import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers. ...

  6. XML文档读取-DOM4j

    JAXP是sun公司官方提供的java解析工具包,但很多其他企业和机构也都开发了自己的xml解析工具,甚至比JAXP更加优秀,比如DOM4J. Dom4j是一个简单.灵活的开放源代码的库.Dom4j是 ...

  7. java: (正则表达式,XML文档,DOM和DOM4J解析方法)

    常见的XML解析技术: 1.DOM(基于XML树结构,比较耗资源,适用于多次访问XML): 2.SAX(基于事件,消耗资源小,适用于数量较大的XML): 3.JDOM(比DOM更快,JDOM仅使用具体 ...

  8. javaweb学习总结十一(JAXP对XML文档进行DOM解析)

    一:将内存中写好的xml文件读取到硬盘上 二:DOM方式对xml文件进行增删改查 1:添加节点(默认是在最后的子节点后面添加) @Test // 向元素中添加节点<version>1.0& ...

  9. PHP中利用DOM和simplxml读取xml文档

    实例  用DOM获取下列xml文档中所有金庸小说的书名,该xml文档所在位置为 ./books.xml: <?xml version="1.0" encoding=" ...

随机推荐

  1. sql 1.1 1.1.1 1.10.1 排序

    解决思路:计算每位的权重,得到序号完整的权重值,使用权重值进行排序! 创建sql 函数如下: ALTER FUNCTION [dbo].[SequenceToOrderNum] ( @Sequence ...

  2. Jquery中attr 和 prop的区别和联系

    昨天在选择借款方类型的时候总是会出现选择要点两次的现象,比如点击公司,第一次点击选择公司,没有选中,必须在次点击才可以选中,总感觉是有点延迟加载的意思,后来审查元素, 发现是redio元素,这样的话就 ...

  3. 深入理解java虚拟机_第二章_读书笔记

    1.本章内容目录: 概述 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 ...

  4. Spring的69个知识点

    目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...

  5. Docker(社区版) centos版 安装

    1,总结一下docker的安装,其实官网有很全面的资料了,可以自己上面去看,但都是英文的. https://docs.docker.com/engine/installation/linux/dock ...

  6. python开发 getpass获取操作系统登陆名

    需用使用python getpass模块 import getpass def get_system_user_name(): return getpass.getuser() def main(): ...

  7. ASP.NET Core 认证与授权[7]:动态授权

    ASP.NET Core 中基于策略的授权旨在分离授权与应用程序逻辑,它提供了灵活的策略定义模型,在一些权限固定的系统中,使用起来非常方便.但是,当要授权的资源无法预先确定,或需要将权限控制到每一个具 ...

  8. csv格式订单下载,完成后伴随邮件通知下载

    前言 功能开发中会遇到大量订单下载,而服务器的请求响应时间又配置的很短,导致下载时候请求超时. 这篇文章主要思路:异步查询数据,生成csv文件,放入email中并发送给用户.(异步部分本文不做介绍,配 ...

  9. 微信公众号 Cookie

    微信公众号开发中,使用cookie和session来存储用户状态. 但总会出现一些空的连接,cookie为[],访问路径为"\" 拦截请求输出为header为: ;Connecti ...

  10. debug断点调试

    debug断点调试  1,虫子启动2,F6   执行断点的下一步,下一个语句     F5    进入方法     F8   执行到结束    查看表达式的值:选中查看的表达式,接着按   ctrl ...