DOM的概念和简单应用:使用DOM解析XML数据
概念:DOM是Document Object Model的简称,即文档数据模型。
Oracle公司提供了JAXP(Java API for XML Processing)来解析XML。JAXP会把XML文档转换成一个DOM树,JAXP的三个包都在JDK中。
org.w3c.dom;W3C推荐的解析文档的接口
org.xml.sax;使用SAX解析XML文档的接口
javax.xml.parsers;解析器工厂工具
一、使用DOM解析XML文档的步骤
1.创建解析器工厂对象,即DocumentBuilderFactory对象
2.由解析器工厂创建解析器对象,即DocumentBuilder对象
3.由解析器对象解析XML文档构建相应的DOM树,创建Document对象
4.以Document对象为起点对DOM树的节点进行增加、删除、修改、查询等操作
5.保存XML数据文档
二、案例
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<PhoneInfo>
<Brand name="华为">
<Type name="P9" />
<Item>
<title>标题信息</title>
<link>连接</link>
<description>描述</description>
<pubDate>2016-11-12</pubDate>
</Item>
</Brand>
<Brand name="苹果">
<Type name="iPhone5" />
<Type name="iPhone6" />
</Brand>
<Brand name="SAMSUNG">
<Type name="Note7" />
</Brand>
<Brand name="SAMSUNG">
<Type name="Note7" />
</Brand>
<Brand name="三星">
<Type name="Note7" />
</Brand>
<Brand name="三星">
<Type name="Note7" />
</Brand>
</PhoneInfo>
1.使用DOM读取手机收藏信息
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; 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; /**
* DOM解析xml文档
* @author Administrator
*
*/
public class PhoneInfoShow { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//从DOM工厂获得DOM解析器
DocumentBuilder builder = dbf.newDocumentBuilder();
//解析xml文档,得到一个Document对象,即DOM树
Document phoneInfo = builder.parse("src/PhoneInfo.xml");
//得到所有Brand节点列表信息
NodeList brandList = phoneInfo.getElementsByTagName("Brand");
//循环Brand信息
for (int i = 0; i < brandList.getLength(); i++) {
//获取第i个Brand元素信息
Node node = brandList.item(i);
Element brand = (Element)node;
//获取元素属性值
String brandValue = brand.getAttribute("name");
System.out.println("手机品牌:"+brandValue);
//获取brand元素下的所有子元素
NodeList types = brand.getElementsByTagName("Type");
for (int j = 0; j < types.getLength(); j++) {
/*Node item = types.item(j);
Element type = (Element)item;*/
Element type = (Element)types.item(j);
//获取子节点属性值
String typeValue = type.getAttribute("name");
System.out.println("\t型号:"+typeValue);
}
}
} }
2.查找节点信息
/**
* 查找节点信息
* @author Administrator
*
*/
public class PhoneInfo03{ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//得到DOM解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//从DOM工厂获得DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//解析XML文档得到一个DOM树
Document phoneInfo = db.parse(new File("src/PhoneInfo.xml"));
//读取pubDate
NodeList list = phoneInfo.getElementsByTagName("pubDate");
//pubDate元素节点(转换)
Element pubDateElement = (Element)list.item(0);
//读取文本节点
String pubDate = pubDateElement.getFirstChild().getNodeValue();
System.out.println(pubDate);
} }
三、使用DOM维护XML数据
1.添加信息
import java.io.FileOutputStream;
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException; /**
* 添加手机收藏信息
* @author Administrator
*
*/
public class PhoneInfoAdd { public static void main(String[] args) throws TransformerException, SAXException, IOException, ParserConfigurationException {
//解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//DOM文档
Document phone = db.parse("src/PhoneInfo.xml");
/*创建brand节点*/
Element brand = phone.createElement("Brand");
brand.setAttribute("name","三星");
/*创建type节点*/
Element type = phone.createElement("Type");
type.setAttribute("name", "Note7");
//建立父子关系
brand.appendChild(type);
Element phoneElement = (Element)phone.getElementsByTagName("PhoneInfo").item(0);
phoneElement.appendChild(brand); //保存xml文件
/*使用传输工厂*/
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
/*创建数据源*/
DOMSource domSource = new DOMSource(phone);
/*设置编码类型*/
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
/*创建目标数据*/
StreamResult result = new StreamResult(new FileOutputStream("src/PhoneInfo.xml"));
/*把DOM树转换为xml文件*/
transformer.transform(domSource, result); } }
2.修改信息
import java.io.FileOutputStream;
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
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.NodeList;
import org.xml.sax.SAXException; public class PhoneInfoEdit { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
//解析xml得到DOM对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document phone = db.parse("src/PhoneInfo.xml");
//找到修改的菜单
NodeList brand = phone.getElementsByTagName("Brand");
for (int i = 0; i < brand.getLength(); i++) {
Element brandElement = (Element)brand.item(i);
//得到Brand的name属性
String brandName = brandElement.getAttribute("name");
if ("三星".equals(brandName)) {
brandElement.setAttribute("name","SAMSUNG");
}
}
//保存xml文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
/*创建DOM源*/
DOMSource xmlSource = new DOMSource(phone);
/*设置编码类型*/
transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
Result outputTarget = new StreamResult(new FileOutputStream("src/PhoneInfo.xml"));
//写入文件
transformer.transform(xmlSource, outputTarget );
} }
3.删除信息
import java.io.FileOutputStream;
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
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.NodeList;
import org.xml.sax.SAXException; /**
* 删除节点
* @author Administrator
*
*/
public class PhoneInfoDel { public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, TransformerException {
//解析xml文档
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document phone = documentBuilder.parse("src/PhoneInfo.xml");
//找到要删除的节点
NodeList brand = phone.getElementsByTagName("Brand");
//通过遍历Brand找到要删除的节点
for (int i = 0; i < brand.getLength(); i++) {
Element brandElement = (Element)brand.item(i);
//获取Brand节点属性
String brandName = brandElement.getAttribute("name");
//查找需要的节点
if ("SAMSUNG".equals(brandName)) {
//获取父节点,利用父节点删除这个节点
brandElement.getParentNode().removeChild(brandElement);
}
}
/*for (int i = 0; i < brand.getLength(); i++) {
Element brandElement = (Element)brand.item(i);
//得到Brand的name属性
String brandName = brandElement.getAttribute("name");
if ("三星".equals(brandName)) {
//修改属性
brandElement.setAttribute("name","SAMSUNG");
//获取父节点,利用父节点删除这个节点
brandElement.getParentNode().removeChild(brandElement);
}
}*/
//写入xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource xmlSource = new DOMSource(phone);
//设置编码
transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
Result outputTarget = new StreamResult(new FileOutputStream("src/PhoneInfo.xml"));
transformer.transform(xmlSource, outputTarget);
/*TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
创建DOM源
DOMSource xmlSource = new DOMSource(phone);
设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
Result outputTarget = new StreamResult(new FileOutputStream("src/PhoneInfo.xml"));
//写入文件
transformer.transform(xmlSource, outputTarget );*/ } }
此外,还可以使用DOM4J解析XML文档会更加方便。
DOM的概念和简单应用:使用DOM解析XML数据的更多相关文章
- [iOS] dom解析xml数据,拿到<>里面的值
<response result="success" timestamp="1338890206" cityver="1.0"> ...
- DOM&SAX解析XML
在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...
- dom 解析xml文件
JAXP技术 JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术.大家可以参见SUN的以下两 ...
- JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解
这节博客主要讲解Dom模型概念~和JSON的简单介绍 首先,还是先上out.js的代码: function println(param){ document.write(param+"< ...
- 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来 ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
- Java解析XML文档(简单实例)——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...
- 实现一个简单的虚拟DOM
现在的流行框架,无论React还是Vue,都采用虚拟DOM. 好处就是,当我们数据变化时,无需像Backbone那样整体重新渲染,而是局部刷新变化部分,如下组件模版: <ul class=&qu ...
- DOM的概念(1)
什么是DOM? 通过 JavaScript,您可以重构整个HTML文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript就需要对HTML文档中所有元素进行访问的入口 ...
随机推荐
- Redhat7无法启动mysql
是这样的,7的这个环境安装了叫MariaDB了 安装MariaDB之后必须先启动MariaDB [root@redhatx ~]# yum -y install mysql [root@redhatx ...
- JAVA学习必须掌握的框架,不看后悔
Web应用,最常见的研发语言是Java和PHP. 后端服务,最常见的研发语言是Java和C/C++. 大数据,最常见的研发语言是Java和Python. 可以说,Java是现阶段中国互联网公司中,覆盖 ...
- VS2010设置默认浏览器
1.选择项目中起始页右键,然后选择浏览方式 2.然后就可以设置默认浏览器了
- centos7 yum安装配置redis
1.设置Redis的仓库地址 yum install epel-release 2.安装redis yum install redis 修改配置文件,监听所有的IP地址 vim /etc/redis. ...
- eclipse搭建maven project的spring4 spring mvc mybatis
一,先确定已经安装好了Eclipse Java EE IDE for Web Developers我用的是如下版本 Version: Neon.3 Release (4.6.3)Build id: 2 ...
- 带权并查集 - How Many Answers Are Wrong
思路: 带权并查集+向量偏移 #include <iostream> using namespace std; int n, m; ]; ]; // 到根节点的距离 ; void init ...
- springboot访问静态资源遇到的坑
开始是以这种结构进行的,结果页面上一篇红,访问的页面是这样的 最终找出来问题,虽然每次调整路径都不对,最终查看多种方法可以看到了: 增加: package com.example.demo.confi ...
- Mysql Update更新错误 Error Code:1175
Mysql 5.7,默认执行 update 语句时遇到错误提示: Error Code: 1175. You are using safe update mode and you tried to u ...
- 洛谷 P1453 城市环路 ( 基环树树形dp )
题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...
- bzoj1818 内部白点(好题) 离散化+树状数组
题目传送门 题意:给出很多黑点,当一个坐标上下左右都有黑点时,这个点也被染成黑色,问最后黑点的数量. 思路:首先,一个很显然的结论,不可能出现无限染色的情况.所以不会输出-1,当n为0或者1时,答案就 ...