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文档中所有元素进行访问的入口 ...
随机推荐
- 1. 时间复杂度(大O表示法)以及使用python实现栈
1.时间复杂度(大O表示法): O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n! ...
- linux安装数据库
1.登录数据库 mysql -u root -p xxxxxx 2.创建数据库 create database xx; 3.use xx; 4.source xx.sql
- 【洛谷2416】泡芙(Tarjan+LCA)
题目描述 火星猫经过一番努力终于到达了冥王星.他发现冥王星有 \(N\) 座城市,\(M\) 条无向边.火星猫准备出发去找冥王兔,他听说有若干泡芙掉落在一些边上,他准备采集一些去送给冥王兔.但是火星猫 ...
- [I/O]一览图
- js 伪数组 arguments
/* 定义一个函数,如果不确定用户是否传入了参数, arguments可以获取到函数传入了多少个参数 和每个参数的值 */ /* 定义 */ function f1() { //获取的是函数在调用的时 ...
- Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.
分析:还是权限问题,所以给他加上权限就可以了!! 解决:chmod +s /bin/netstat
- COCO2018 目标检测
刚浏览了一下coco数据集官网,认真看了一下18年的目标检测任务,简单记录一下. coco2018目标检测挑战赛只进行实例分割的评比,虽然仍然可以输出bbox,但是不可以提交到比赛的服务器,原因是官方 ...
- php 替换 oracle 数据字段中“看不见”换行符号
工作需要,把oracle中的数据导出csv,导出代码如下:<?php$file_name = "申請書承認(予定休出).csv";header("Content-D ...
- Docker Run 设置环境变量
Docker Run We can then override the environment variables set in the Docker file when running the im ...
- Collectors.groupingBy分组后的排序问题
默认groupingBy代码里会生成一个HashMap(hashMap是无序的,put的顺序与get的顺序不一致) HashMap是无序的,HashMap在put的时候是根据key的hashcode进 ...