DOM解析XML

@author ixenos

XML解析方式(原理)


a)     DOM 解析树

b)     SAX  流事件

DOM解析对应主流工具

i.          DOM(官方)

ii.          DOM4J  (非官方 主流  三大框架使用DOM4J解析配置文件)

iii.          JDOM (非官方)

SAX解析对应主流工具

SAX (官方  主流)

解析XML文档


a)     要处理XML文档就要先解析(parse)它,

b)     解析器程序:读入一个文件,确认这个文件具有正确的格式,然后分解成各种元素,使程序员能够访问这些元素

i.          文档对象模型(Document Object Model,DOM)解析器,是树型解析器(tree parser),将读入的XML文档转换成树结构

ii.          XML简单API(Simple API for XML,SAX)解析器,是流机制解析器(streaming parser),在读入XML文档时生成相应的事件

c)     如果只是对于某些元素感兴趣,而不关心他们的上下文,那么在这些情况下你应该考虑使用流机制解析器

节点Node


一个XML文档中只有一个根节点

没有父节点的元素节点

元素节点

根节点和根节点中的所有标签都是元素节点

属性节点

<student id=“001”></student> id就是属性节点

文本节点

<name>zhangsan</name> zhangsan就是文本节点

注释节点

<!-- --> xml文档中的注释信息

Element类型:带标签的<a>b</a>,节点名是a,节点值都是null,b是“节点值”,也是子节点(此时b是Text类型的节点)

Attr类型:节点值是属性名,节点值是属性值

Text类型:在标签之外的都是文本节点,节点名都是#text,节点值是文本

因此,我们认为的Element类型的节点的“节点值”,实际上是Element类型节点的Text类型的子节点——指夹在标签中间的内容,不能通过getNodeValue()获取,要通过:

  1. getFirstChild().getNodeValue() 获得第一个子节点的节点值
  2. getTextContent() 获得所有Text子节点的节点值,也会递归孙子节点获得曾孙节点的节点值

a)     例如<a><b>bb</b>哈哈哈</a>将得到:bb哈哈哈

b)     而用1.将解析b这个Element节点,将得到null

DOM官方解析示例


a)     首先要明白XML是被看成文档(Document)的,所以我们需要一个DocumentBuilder对象来读取XML,生成对应的Document对象

i.          /*用Builder工厂生成Builder*/

ii.          DocumentBuilderFactory factory = DocumentDuilderFactory.newInstance();

iii.          DocumentBuilder builder = factory.newDocumentBuilder();

iv.          /*用builder读取XML文档生成Document对象*/

v.          File f = new File(“…”);

vi.          Document doc = builder.parse(f);  //也可以读URL或者输入流

b)     启动对Document的分析,调用getDocumentElement,获得root元素

i.          Element root = doc.getDocumentElement();

c)     获得root节点子节点的列表,

i.          注意,子节点不仅有Element元素类型还有Text文本类型(不在标签里的,连换行回车的空白也算

ii.          NodeList children = root.getChildNodes();

iii.          For(int i=0; i<children.getLength(); i++){

Node child = children.item(i);

……

iv.          }

v.          如果只希望得到元素子节点(Element),那么可以忽略空白字符(Text):

vi.          NodeList children = root.getChildNodes();

vii.          For(int i=0; i<children.getLength(); i++){

Node child = children.item(i);

if(child instanceof Element){

Element childElement = (Element)child;

}

viii.          }

d)     如果文档有DTD,那么解析器知道哪些是没有文本节点的子元素,而且会自动剔除掉空白字符!DTD很好用

e)     如<a>123</a><b>456</b>,当我们想知道标签夹着的信息时,既然Text是这些元素子节点唯一的子节点,就可以用getFirstChild方法而不必对着这些元素子节点的NodeList一顿遍历,而只需要之后再对Text节点getData得到字符串即可

i.          For(int i=0; i<children.getLength(); i++){

  1. Node child = children.item(i);
  2. If(child instanceof Element){

a)     Element childElement = (Element)child;

b)     Text textNode = (Text)childElement.getFirstChild();

c)     String text = textNode.getData().trim(); //去掉多余空格和换行符

d)     if(childElement.getTagName().equals(“name”)) //name标签名

i.          name = text;

e)     else if(childElement.getTagName().equals(“size”))

i.          size = Integer.parseInt(text);

}

}

对元素节点的文本子节点getData后再trim,可以优化这种情况:

<size>

36

</size>

此时文本子节点中含有换行和空格,调用trim可以删掉前后的空格

f)      枚举元素子节点的属性<size hel=”pt”>36</size>

i.          一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

<input name=“text”>

属性值一定要用双引号(")或单引号(')引起来

定义属性必须遵循与标签相同的命名规范

多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:

<input>

<name>text</name>

</input>

注意:此时就不能使用getAttributes了

ii.          文档对象调用getAttributes,返回一个NameNodeMap对象,其中包含了描述属性的Node对象(键值对),遍历该Map得Node,调用getNodeName和getNodeValue获得属性名和属性值

iii.          或者知道属性名,直接获取属性值

  1. String unit = element.getAttrbute(“unit”); //unit是属性名,将属性值赋给String变量unit

或者

外部

<!DOCTYPE configuration PUBLIC “http://myserver.com/config.dtd”>

JavaEE XML DOM解析的更多相关文章

  1. JavaEE XML DOM解析之DOM4J

    DOM解析之DOM4J @author ixenos DOM4J常用API 读取xml文档: Document doc = new SAXReader().read("xml文件" ...

  2. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  3. Java XML Dom解析工具

    Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...

  4. XML与web开发-01- 在页面显示和 XML DOM 解析

    前言: 关于 xml 特点和基础知识,可以菜鸟教程进行学习:http://www.runoob.com/xml/xml-tutorial.html 本系列笔记,主要介绍 xml 在 web 开发时需要 ...

  5. Java XML DOM解析(xPath)

    (一) XML概念 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的 ...

  6. Python使用xml.dom解析xml

    在菜鸟教程上找了个关于电影信息的xml类型的文档,用python内置的xml.dom来解析提取一下信息. 先复习一下xml概念: XML 指可扩展标记语言(EXtensible Markup Lang ...

  7. XML DOM解析 基础概念

    DOM和SAX W3C制定了一套书写XML分析器的标准接口规范——DOM. 除此以外,XML_DEV邮件列表中的成员根据应用的需求也自发地定义了一套对XML文档进行操作的接口规范——SAX. 这两种接 ...

  8. XML(DOM解析)

    //创建book.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <books> <b ...

  9. XML (DOM解析) 看看就行

    000000000000000000000000000000000000000 ------------------------------------------------------------ ...

随机推荐

  1. 利用Matlab生成一个网格化的三维三轴椭球面(生成直角坐标)

    代码很简单,a,b,c分别为椭球的三轴轴长,a=b=c时得到的是三维球面,a=b!=c时得到的是三维椭球面,a!=b且a!=c且b!=c时得到的是三维旋转椭球面 %生成一个笛卡尔坐标系下三轴椭球表面的 ...

  2. C#编程断点续传

    C#编程总结(十二)断点续传 Posted on 2014-02-16 10:56 停留的风 阅读(384) 评论(3) 编辑 收藏 C#编程总结(十二)断点续传 我们经常使用下载工具,如bit精灵. ...

  3. DesignMode的状态处理

    自定义控件开发的调试及DesignMode的状态处理 在开发Winform程序的时候,我们往往需要根据需要做一些自定义的控件模块,这样可以给系统模块重复利用,或者实现更好的效果等功能.但在使用的时候, ...

  4. Parameter Binding in ASP.NET Web API(参数绑定)

    Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...

  5. Android学习笔记-Intent(一)

    Intent对象在Android官方API这样描述:It is a passive data structure holding an abstract description of an opera ...

  6. ioc和aop

      IOC容器的基本原理 ioc又称为控制反转.或者依赖注入.为什么叫控制反转呢? 可以这样来看.软件开发中会有很多的类,这些类在一起完成复杂的功能.这些类之间存在了耦合的关系.就如同很多的齿轮,啮合 ...

  7. C#编译器闭包机制

    背景 C# 在编译器层面为我们提供了闭包机制(Java7 和 Go 也是这种思路),本文简单的做个解释. 背景知识 你必须了解:引用类型.值类型.引用.对象.值类型的值(简称值). 关于引用.对象和值 ...

  8. 图解JS的传值与传址

    //编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...

  9. vs2008 试用版评估到期 vs2008试用版 升级正式版

    心得: 解决Vs2008 试用版升级正式版 1.在控制面板里面找到vs2008的程序. 2.点击 更改删除按钮, 3.出现Vs2008的维护模式. 4.在此维护模式下,如果没有出现填写正版密匙的地方, ...

  10. SQL Server监控清单

    SQL Server监控清单 一. 服务器1. 状态监控(1) 服务器是否可访问?(2) 相应的数据库服务是否启用?(3) 操作系统事件日志中的错误或告警(4) 磁盘可用空间 服务器状态监控,不管使用 ...