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文档中所有元素进行访问的入口 ...
随机推荐
- 最近关于linux的一些小问题。
redhat 用yum更新时需要注册付费.centos 不用. 原来版本的ifconfig 在centos中变为了ip addr.
- 老男孩Day13作业:ORM学员管理系统
一.作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上 ...
- 老男孩Day11作业:selectors版socket
一.作业需求: 使用SELECT或SELECTORS模块实现并发简单版FTP 允许多用户并发上传下载文件 二.readme 一.作业需求: 使用SELECT或SELECTORS模块实现并发简单版FTP ...
- Python3之Memcache使用
简介 Memcached是一个高性能的分布式内存对象缓存系统,用于动态WEB应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态,数据库网站的速度.Memcached ...
- 洛谷 P1372 又是毕业季I
可能所有的数论题都是这样玄学.... 题目链接:https://www.luogu.org/problemnew/show/P1372 这道题通过暴力的枚举可以发现是不可做的(当然我也不会做) 然后就 ...
- C# 函数参数object sender, EventArgs e
object sender:表示触发事件的控件对象EventArgs e:表示事件数据的类的基类 Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例 ...
- Ngnix,EA(Enterprise Architect)
nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点 ...
- LeetCode记录之21——Merge Two Sorted Lists
算法和数据结构这东西,真的是需要常用常练.这道看似简单的链表合并题,难了我好几个小时,最后还是上网搜索了一种不错算法.后期复习完链表的知识我会将我自己的实现代理贴上. 这个算法巧就巧在用了递归的思想, ...
- 大素数判断和素因子分解(miller-rabin,Pollard_rho算法) 玄学快
大数因数分解Pollard_rho 算法 复杂度o^(1/4) #include <iostream> #include <cstdio> #include <algor ...
- 2019.3.28 JDBC相关
JDBC(Java Data Base Connectivity) JDBC是一组用Java编写的类和接口 使用JDBC的好处: 1.Java的开发人员完全不需要关心数据库的连接方式和实现手段 2.提 ...