JavaEE XML DOM解析

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”>

时间: 2024-12-21 09:42:23

JavaEE XML DOM解析的相关文章

python中用xpath和xml.dom解析html

本次推荐的组合为xml.dom.minidom和xpath.其中xml.dom.minidom为python的标准库,无须安装.xpath为Google出品的开源项目py-dom-xpath. 安装py-dom-xpath: 从https://py-dom-xpath.googlecode.com/files/py-dom-xpath-0.1.tar.gz下载压缩包,解压. CD到py-dom-xpath-0.1目录 执行命令:C:\python27\python setup.py instal

XML DOM 解析器

大多数浏览器都内建了供读取和操作 XML 的 XML 解析器. 解析器把 XML 转换为 JavaScript 可存取的对象(XML DOM). XML 解析器 XML DOM 包含了遍历 XML 树,访问.插入及删除节点的方法(函数). 然而,在访问和操作 XML 文档之前,它必须加载到 XML DOM 对象. XML 解析器读取 XML,并把它转换为 XML DOM 对象,这样才可以使用 JavaScript 访问它. 大多数浏览器有一个内建的 XML 解析器. 加载 XML 文档 下面的

Java XML DOM解析(xPath)

(一) XML概念 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.是Internet环境中跨平台的.依赖于内容的技术,也是当今处理分布式结构信息的有效工具.早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输. (二)XML作用 1.

XML DOM解析 基础概念

DOM和SAX W3C制定了一套书写XML分析器的标准接口规范--DOM. 除此以外,XML_DEV邮件列表中的成员根据应用的需求也自发地定义了一套对XML文档进行操作的接口规范--SAX. 这两种接口规范各有侧重,互有长短,应用都比较广泛. 应用程序开发过程中,应用程序不是直接对XML文档进行操作的,而是首先由XML分析器对XML文档进行分析. 然后,应用程序通过XML分析器所提供的DOM接口或SAX接口对分析结果进行操作,从而间接地实现了对XML文档的访问. DOM介绍 优缺点分析 DOM:

XML(DOM解析)

//创建book.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>微冷的雨</name> <price>100.0</price> </book> </books> //解析代码 import javax.xml.parsers.DocumentBuilder; import

JavaEE XML DOM4J解析

DOM4J解析 @author ixenos DOM4J常用API SAXReader reader = new SAXReader(); //Document对象也看成根节点 Document doc = reader.read(File file); //迭代当前节点下的子节点/也可foreach Iterator itr = doc.nodeIterator(); While(itr.hasNext()){ Node node = itr.next(); } //得到根节点 Element

XML数据解析 Dom方式解析

这是一份XML数据,与上一篇文章的JSON数据内容是相同的,上一篇是JSON格式,这篇文章使用的是XML格式的数据 本文以上篇文章的代码为基础修改: 1>数据形式变为XML数据,所以要修改文件的路径 2>因为数据格式不同,所以解析方式不同先采用GData方式解析XML文档 需求:将此XML文档中的数据解析出来,通过tableView展示出来,上一篇文章的需求相同,只是数据与解析方法不同 此处只给出解析本分代码,即JSON解析2文章中代码部分,61--89行部分,开始部分修改文件路径. 使用GD

用java操作XML文件(DOM解析方式)

XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DOM解析方式 在java工程中导入dom4j.jar包. (一)用java读XML文件 <1>创建SAXReader对象. RAXReader reader=new RAXReader(); <2>调用RAXReader的Document read(File file)方法,获取xml文

python 解析XML xml.dom

一 .xml.dom 解析XML的API描述 minidom.parse(filename) 加载读取XML文件 doc.documentElement 获取XML文档对象 node.getAttribute(AttributeName) 获取XML节点属性值 node.getElementsByTagName(TagName) 获取XML节点对象集合 node.childNodes 返回子节点列表. node.childNodes[index].nodeValue 获取XML节点值 node.