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文档中所有元素进行访问的入口 ...
随机推荐
- 【bzoj3670】: [Noi2014]动物园 字符串-kmp-倍增
[bzoj3670]: [Noi2014]动物园 一开始想的是按照kmp把fail算出来的同时就可以递推求出第i位要f次可以跳到-1 然后把从x=i开始顺着fail走,走到fail[x]*2<i ...
- 【python】Python的logging模块封装
#!/usr/local/python/bin # coding=utf-8 '''Implements a simple log library. This module is a simple e ...
- PHP选项和运行
PHP运行模式 五大运行模式 1.cgi 通用网关接口 2.fast-cgi cgi升级 3.cli (Command Line Interface) 4.isapi 微软提供的面向Internet服 ...
- P3615 如厕计划
$ \color{#0066ff}{ 题目描述 }$ 竞赛比完之后,水箱里充满水的选手们鱼贯而出.凡华中学的厕所规划的很糟,只有两个厕位,于是厕所门前排起了长长的队伍. 厕所有两个,一个是女生专用厕所 ...
- bzoj 3895: 取石子
$ \color{#0066ff}{ 题目描述 }$ Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子 排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选 ...
- SqlBulkCopy使用注意事项
1. 有标识列的表 1.1 SqlBulkCopyOptions.KeepIdentity 必须设置!否则会出现复制过去的数据产生标识列发现变化的情况! 1.2 如果原表的标识列即为主键, 那按1. ...
- JAVA基础——重新认识String字符串
深入剖析Java之String字符串 在程序开发中字符串无处不在,如用户登陆时输入的用户名.密码等使用的就是字符串. 在 Java 中,字符串被作为 String 类型的对象处理. String 类位 ...
- window平台 php 安装 redis 扩展
1.使用phpinfo() 函数查看PHP的版本信息 <?php phpinfo(); ?> 查看扩展文件版本(特别注意以php版本的 architecture 是x86还是64为准,不能 ...
- POJ1077 Eight A*
这个题扔到A*可也还行... 定义估价函数h():为每个数或空格的位置 到 最终状态中所在位置 的 曼哈顿距离 的 总和. 把状态压成一个九进制数,便于存储和判重. 然后记录方案可以记录一下此次的操作 ...
- POJ_3262 Protecting the Flowers 【贪心】
一.题面 POJ3262 二.分析 这题要往贪心上面想应该还是很容易的,但问题是要证明为什么比值关系就能满足. 可以选择几个去分析,入1-6 与 2-15 和 1-6 与2-5 和 1-6 与 2 ...