XML解析之DOM解析详解
一、概念
xml文件多用于信息的描述,所以在得到一个xml文档之后按照xml中的元素取出对应的信息就是xml的解析。Xml解析有两种方式,一种是DOM解析,另一种是SAX解析,两种操作的方式如图。
二、DOM解析
基于DOM解析的xml分析器是将其转换为一个对象模型的集合,用树这种数据结构对信息进行储存。通过DOM接口,应用程序可以在任何时候访问xml文档中的任何一部分数据,因此这种利用DOM接口访问的方式也被称为随机访问。
这种方式也有缺陷,因为DOM分析器将整个xml文件转换为了树存放在内存中,当文件结构较大或者数据较复杂的时候,这种方式对内存的要求就比较高,且对于结构复杂的树进行遍历也是一种非常耗时的操作。不过DOM所采用的树结构与xml存储信息的方式相吻合,同时其随机访问还可利用,所以DOM接口还是具有广泛的使用价值。
这里我们举个栗子来说明xml转换为树的数据结构。
<?xml version="1.0" encoding="GBK"?>
<address><linkman><name>Van_DarkHolme</name><email>van_darkholme@163.com</email></linkman><linkman><name>Bili</name><email>Bili@163.com</email></linkman>
</address>
将该xml转换为树的结构为:
DOM解析中有以下4个核心操作接口
Document:此接口代表了整个xml文档,表示为整个DOM的根,即为该树的入口,通过该接口可以访问xml中所有元素的内容。其常用方法如下。
(注:上述图中虽未画出,但是name和email的属性(van_darkhole,van_holme@163.com)也分别为一个节点)
Document常用方法
public NodeList getElementByTagName(String tagname) |
取得指定节点名称的NodeList |
Public Element createElement(String tagName) throws DOMException |
创建一个指定名称的节点 |
Public Text createTextNode(String data) throws DOMException |
创建一个文本内容节点 |
Element createElement(String tagName) throws DOMException |
创建一个节点元素 |
Public Attr createAttribute(String name)throws DOMException |
创建一个属性 |
Node:此接口在整个DOM树中有着举足轻重的地位,DOM操作的核心接口都继承于Node(Document、Element、Attr)。在DOM树中,每一个Node接口代表了一个DOM树节点
Node接口常用方法
Node appendChilid(Node newChild) throws DOMException |
在当前节点下增加下一个新节点 |
Public NodeList getChildNodes() |
取得本节点下的全部子节点 |
Public Node getFirstChild() |
取得该节点下的第一个子节点 |
Public Node getLastChild() |
取得本节点下的最后一个子节点 |
Public boolean hasChildNodes() |
判断是否还有其他节点 |
String getNodeValue()throws DOMException |
获取节点内容 |
NodeList:此接口表示一个点的集合,一般用于有序关系的一组节点。
NodeList常用方法
Public int getLength() |
取得NodeList中节点的个数 |
Public Node item(int index) |
根据索引取得节点对象 |
NamedNodeMap:此接口表示一组节点和其唯一名称对应的一一关系,主要用于节点属性的表示
除了以上四个核心接口外,如果一个程序需要进行DOM解析操作,则需要按照如下步骤进行:
1. 建立DocumentBuilderFactor,用于获得DocumentBuilder对象:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2. 建立DocumentBuidler:
DocumentBuilder builder = factory.newDocumentBuilder();
3. 建立Document对象,获取树的入口:
Document doc = builder.parse(“xml文件的相对路径或者绝对路径”);
4. 建立NodeList:
NodeList n1 = doc.getElementByTagName(“读取节点”);
5. 进行xml信息获取
下面则根据上面的xml文件进行解析
public class DOMDemo01 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{//建立DocumentBuilderFactor,用于获得DocumentBuilder对象:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.建立DocumentBuidler:DocumentBuilder builder = factory.newDocumentBuilder();//3.建立Document对象,获取树的入口:Document doc = builder.parse("src//dom_demo_02.xml");//4.建立NodeList:NodeList node = doc.getElementsByTagName("linkman");//5.进行xml信息获取for(int i=0;i<node.getLength();i++){Element e = (Element)node.item(i);System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());System.out.println("邮箱:"+e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue());} }
}
运行结果为:
上述代码则从第四处开始分析:
通过doc.getElementByTagName(“linkman”)我们获得了一个NodeList,上述xml文件中包含了两个linkman的节点,所以这里NodeList中包含了两个Node(都是linkman节点),然后通过循环的方法来获取xml文件中的信息。
Element e = (Element)node.item(i)获得了linkman节点,即e这里指向了linkman
e.getElementTagName(“name”).item(0).getFirstChild().getNodeValue();
getElementTagName(“name”);获得了该linkman下的所有name节点(其实就1个);
Item(0);取第一个Name节点(就一个);
getFristChild();获取name节点下的文本节点,即内容van所在的节点(上面已经提到过,文本内容也是一个单独的节点,Document方法列表中的createTextNode()就是创建文本节点);
getNodeValue()获得文本节点的值:van_darkholme;
XML解析之DOM解析详解相关推荐
- Android系统(96)---Android 数据交换解析框架Gson使用详解
Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...
- python3d动态图-Python图像处理之gif动态图的解析与合成操作详解
本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...
- java json path_Java使用JSONPath解析JSON完整内容详解
JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...
- viper4android io错误,golang常用库之配置文件解析库-viper使用详解
一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 c ...
- 【poi-3.8】poi解析excel插入数据库详解
文章目录 poi解析excel&插入数据库详解 说明 一.目的 二.准备工作 三.思路分析 四.流程图分析 五.核心代码 1:上传文件 2:获取输入流 3:初始化excel表 4:遍历行和列 ...
- 装配图中齿轮的画法_减速器结构解析和装配图画法详解
减速机器用于低转速大扭矩的传动设备,原理是把电动机.内燃机.马达或其它高速运转的动力,通过减速机的输入轴上齿数少的齿轮啮合输出轴上的大齿轮,从而达到减速的目的:大小齿轮的齿数之比,就是传动比.减速器是 ...
- ISO7816协议深度解析-简单易懂协议详解(一)-- 复位,字符帧,及ATR
1. 摘要 IC卡必须支持T=0或T=1的协议,但不是同时支持这两种协议,而终端则必须同时支持T=0和T=1的协议. • T=0通讯协议是异步半双工字符传输协议: • T=1通讯协议是异步半双工块传输 ...
- XML解析之DOM解析
目录 1 xml文件 2 DOM解析代码实现 2.1 DOM解析步骤 2.2 DOM解析代码实现 2.3 DOM解析代码运行结果 1 xml文件 <?xml version="1.0& ...
- XML的SAX解析以及DOM解析和SAX解析区别
前言: XML解析工具 DOM解析原理:1)JAXP (oracle-Sun公司官方)2)JDOM工具(非官方)3)Dom4J工具(非官方)三大框架(默认读取xml的工具就是Dom4j)....... ...
最新文章
- Python-OpenCV 处理图像(六):对象识别
- 请解释一下TreeMap
- 在SAP云平台上部署和运行Docker应用
- 机器学习问题总结(03)
- 人脸识别智能会议签到系统
- html文字阴影php,HTML_html5文字阴影效果text-shadow使用示例,复制代码代码如下: !DOCTYPE h - phpStudy...
- Python基础函数学习笔记(二)
- 【ArcGIS操作】4 空间分析篇
- 连文件搜索都不会用,也不自己反省一下?
- 啊哈算法(pdf免积分下载)
- ORACLE_mldn_002
- winrar解压时出现诊断信息怎么办?
- 超详细的CentOS7的下载安装配置教程
- Android 车载应用开发与分析(5) - CarLauncher(一)
- java微博分享代码实例
- 任正非:《一江春水向东流》
- 鸿蒙曰蜉蝣不知所求,【经典金句408 · 庄子】:浮游,不知所求;猖狂,不知所往;游者鞅掌,以观无妄。...
- Java代码给csv文件加水印_如何给CSV数据包的图片批量加上水印
- Windows校验文件完整性(MD5)
- C语言中的TRUE和FALSE