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. ML神器:sklearn的快速使用

    传统的机器学习任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类.本文我们将依据传统机器学习的流程,看看在每一步流程中都 ...

  2. 11) 十分钟学会android--Intent消息处理与传递详解

    一个Android app通常都会有多个activities. 每个activity的界面都扮演者用户接口的角色,允许用户执行一些特定任务(例如查看地图或者是开始拍照等).为了让用户能够从一个acti ...

  3. 四、VueJs 填坑日记之搭建Axios接口请求工具

    上一章,我们认识了项目的目录结构,以及对项目的目录结构做了一些调整,已经能把项目重新跑起来了.今天我们来搭建api接口调用工具Axios.Vue本身是不支持ajax调用的,如果你需要这些功能就需要安装 ...

  4. Xshell 的安装教程

    Xshell就是一个远程控制RHEL的软件:其他的还有很多,用什么都无所谓(根据公司情况). 下面我们来安装下这个工具: 双击exe 点下一步: 选 免费的 然后下一步:(免费的功能足够用了) 点接受 ...

  5. "虐待"过我的老师们,你们如今还好吗

    当皇城脚下的民生问题都这么难做的时候,其他地方又该如何保障呢? 京城“红黄蓝”出名了,京城发生锅炉大爆炸了,京城发生火灾了…… 聊天中,有一好友突然蹦出了一句话:“你看在皇城脚下都不安全了”. 久久我 ...

  6. 如何在 Centos7 中安装 nginx

    1. 添加 nginx 的 yum 源(官网安装说明) vi /etc/yum.repos.d/nginx.repo 在该文件中添加如下内容: [nginx]name=nginx repobaseur ...

  7. AIO5系统中关于赠品处理的方法

    最近频繁有人问我,关于赠品在AIO5系统中如何处理.首先AIO5系统支持赠品处理关于赠品,在AIO5系统中走的是[其他出库单]路径:仓库--仓库作业--其他出库单--新增(如下图) 通常赠品对应的业务 ...

  8. MD5摘要算法简析

    1 MD5简介 1.1  概述 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主 ...

  9. SQL Server 结构分解

    关系引擎和存储引擎是SQL Server 的两大组件,其中关系引擎也叫查询处理器,它包括查询优化器.命令解析器.查询执行器.存储引擎管理所有的数据及涉及的IO,它包括事务管理器和数据访问方法和缓冲区管 ...

  10. 总结HTML5的学习方法大汇总

    html5学习方法之技能清单: 必须掌握基本的Web前端开收技术,其中包括:CSS.HTML.DOM.java.Ajax,jquery,Vue,jquery- mobile,zepto等,在掌握这些技 ...