一、概念

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解析详解相关推荐

  1. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

  2. python3d动态图-Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

  3. java json path_Java使用JSONPath解析JSON完整内容详解

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...

  4. viper4android io错误,golang常用库之配置文件解析库-viper使用详解

    一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 c ...

  5. 【poi-3.8】poi解析excel插入数据库详解

    文章目录 poi解析excel&插入数据库详解 说明 一.目的 二.准备工作 三.思路分析 四.流程图分析 五.核心代码 1:上传文件 2:获取输入流 3:初始化excel表 4:遍历行和列 ...

  6. 装配图中齿轮的画法_减速器结构解析和装配图画法详解

    减速机器用于低转速大扭矩的传动设备,原理是把电动机.内燃机.马达或其它高速运转的动力,通过减速机的输入轴上齿数少的齿轮啮合输出轴上的大齿轮,从而达到减速的目的:大小齿轮的齿数之比,就是传动比.减速器是 ...

  7. ISO7816协议深度解析-简单易懂协议详解(一)-- 复位,字符帧,及ATR

    1. 摘要 IC卡必须支持T=0或T=1的协议,但不是同时支持这两种协议,而终端则必须同时支持T=0和T=1的协议. • T=0通讯协议是异步半双工字符传输协议: • T=1通讯协议是异步半双工块传输 ...

  8. XML解析之DOM解析

    目录 1 xml文件 2 DOM解析代码实现 2.1 DOM解析步骤 2.2 DOM解析代码实现 2.3 DOM解析代码运行结果 1 xml文件 <?xml version="1.0& ...

  9. XML的SAX解析以及DOM解析和SAX解析区别

    前言: XML解析工具 DOM解析原理:1)JAXP (oracle-Sun公司官方)2)JDOM工具(非官方)3)Dom4J工具(非官方)三大框架(默认读取xml的工具就是Dom4j)....... ...

最新文章

  1. Python-OpenCV 处理图像(六):对象识别
  2. 请解释一下TreeMap
  3. 在SAP云平台上部署和运行Docker应用
  4. 机器学习问题总结(03)
  5. 人脸识别智能会议签到系统
  6. html文字阴影php,HTML_html5文字阴影效果text-shadow使用示例,复制代码代码如下: !DOCTYPE h - phpStudy...
  7. Python基础函数学习笔记(二)
  8. 【ArcGIS操作】4 空间分析篇
  9. 连文件搜索都不会用,也不自己反省一下?
  10. 啊哈算法(pdf免积分下载)
  11. ORACLE_mldn_002
  12. winrar解压时出现诊断信息怎么办?
  13. 超详细的CentOS7的下载安装配置教程
  14. Android 车载应用开发与分析(5) - CarLauncher(一)
  15. java微博分享代码实例
  16. 任正非:《一江春水向东流》
  17. 鸿蒙曰蜉蝣不知所求,【经典金句408 · 庄子】:浮游,不知所求;猖狂,不知所往;游者鞅掌,以观无妄。...
  18. Java代码给csv文件加水印_如何给CSV数据包的图片批量加上水印
  19. Windows校验文件完整性(MD5)
  20. C语言中的TRUE和FALSE

热门文章

  1. Vue跳转页面传值(带参数)
  2. windows office 界面改进(续)
  3. 数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟
  4. 浏览器调试webview
  5. git commit前进行checkstyle --pre-commit并优化了checkstyle速度
  6. 数据库语句SUBSTRING的使用
  7. linux 连接网络设备报错 ssh no matching cipher found
  8. java获取当前目录
  9. 特征点匹配——FREAK算法介绍
  10. 树形dp进阶题2 JSOI2018潜入行动