DOM知识总结
XML文档解析技术
-
XML本身是以纯文本对数据进行编码的一种格式,XML文档常被应用于数据的交互和传输,因此如何读写XML文档就显得非常重要。
-
目前比较流行的XML文档解析技术包括:DOM、SAX、JDOM、DOM4J、Digester
-
DOM
DOM是Document Object Model的缩写,即文档对象模型。它是由W3C组织推荐的处理XML的标准接口。2004年4月,W3C组织发布了DOM Level3 Core的推荐标准。DOM可用于直接访问 XML 文档的各个部分。在 DOM 中,文档被模拟为树状,其中 XML 语法的每个组成部分(例如元素或文本内容)都被表示为一个节点。 -
SAX
SAX是Simple API for XML的缩写,被翻译为XML的简单应用程序接口,它是一种XML解析的方法。SAX最初是由David Megginson采用Java语言开发,之后SAX很快在Java开发者中流行起来,参与开发的程序员越来越多,组成了互联网上的XML-DEV社区。1998年5月发布了SAX1.0版,目前SAX最新的版本为2.0。 -
JDOM
JDOM是两位著名的 Java 开发人员兼作者,Brett Mclaughlin 和 Jason Hunter 的创作成果, 2000 年初在类似于 Apache 协议的许可下,JDOM 作为一个开放源代码项目正式开始研发了。目前它已成长为包含来自广泛的 Java 开发人员的投稿、集中反馈及错误修复的系统,并致力于建立一个完整的基于 Java 平台的解决方案,通过 Java 代码来访问、操作并输出 XML 数据. -
DOM4J
DOM4J是dom4j.org出品的一个开源XML解析包,Dom4j是一个易用的、开源的库,用于XML、XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP. -
Digester
Digester是apache基金会的一个开源项目。Digester基于规则的XML文档解析,主要用于XML到Java对象的映射.Digester是在DOM和SAX的基础上衍生出来的工具类,为的是满足将 XML 转换为 JavaBean 的特殊需求,故而没有什么特别明显的优缺点。开源框架Struts 的 XML 解析工具 Digester,为我们带来了将XML 转换为 JavaBean
的可靠方法。 -
DOM与SAX比较
SAX适用于处理下面的问题:
对大型文件进行处理;
只需要文件中的部分内容,或者只需要从文件中获取特定的信息;
需要建立自己的对象模型。
DOM适用于解决的问题类型:
需要对文件进行修改;
需要随机对文件进行存取。 -
JAXP是Java API for XML Processing的英文字头缩写,是用于XML文档处理的、使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准,屏蔽具体厂商实现、让开发人员以一种标准的方式对XML进行编程的规范。
使用DOM来解析XML文档
- DOM的核心概念即节点,因为DOM在分析XML文档时把所有的内容都映射为节点。所有的节点形成一个树形结构,我们通过访问这棵节点树来访问XML文档。Node代表了Dom模型的一个抽象节点,并没有具体的节点类型。
- Node接口的主要方法
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("被解析的XML文件名称"));
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
-
Element
一个Element对象代表了DOM树的一个元素节点,元素节点是组成文档树的重要部分。通常,元素节点拥有子元素、文本节点或者两者的组合。
NodeList getElementsByTagName(String name) 返回一个NodeList对象,包含指定元素的所有子元素
String getTagName() 返回一个代表这个标签名字的字符串
String getAttribute(String name) 通过名称获得属性值 -
Attr
一个Attr对象代表了元素的一个属性。DOM不认为属性节点是DOM文档树的一个独立部分,因此属性节点的父节点、同胞节点等都是null。DOM认为属性节点是元素节点的一个组成部分
String getName() 返回此属性的名称
String getValue() 该属性值以字符串形式返回
Element getOwnerElement() 此属性连接到的 Element 节点;如果未使用此属性,则为 null。 -
Text
Text节点用于代表XML文档中元素和属性中的文本内容。文本节点可以只包含空白,因此如果元素的内容中包含空白,那么该元素节点的子节点中,也将包含以空白组成的文本节点。
String getWholeText() 返回 Text 节点的所有文本
boolean isElementContentWhitespace() 返回此文本节点是否包含 元素内容空白符,即经常所称的“可忽略的空白符”。 -
CDATASection用于代表XML文档中的CDATA部分的内容,DOM解析器只能识别出CDATA的结尾标记“]]>”,并以此作为CDATA的分界符。CDATA段节点表示XML文档中的CDATA段。在DOM API中,CDATA段节点是通过org.w3c.dom.CDATASection接口来表示的。
-
NodeList org.w3c.dom.NodeList接口提供了一个有序节点集合的抽象。
int getLength() 该方法返回列表中节点的数目
Node item(int index) 返回集合中指定索引的节点。索引值从0开始 -
NamedNodeMap
org.w3c.dom.NamedNodeMap接口也是一个节点的集合。通过该接口可以建立节点名和节点之间的映射关系。表示一组节点名称和节点的一一对应关系。
int getLength() 该方法返回列表中节点的数目
Node item(int index) 返回集合中指定索引的节点。索引值从0开始
Node getNamedItem(String name) 检索通过名称指定的节点
Node setNamedItem(Node arg) 使用 nodeName 属性添加节点
Node removeNamedItem(String name) 移除通过名称指定的节点 -
使用JAXP通过DOM解析XML文档
-
NamedNodeMap
org.w3c.dom.NamedNodeMap接口也是一个节点的集合。通过该接口可以建立节点名和节点之间的映射关系。表示一组节点名称和节点的一一对应关系。
int getLength() 该方法返回列表中节点的数目
Node item(int index) 返回集合中指定索引的节点。索引值从0开始
Node getNamedItem(String name) 检索通过名称指定的节点
Node setNamedItem(Node arg) 使用 nodeName 属性添加节点
Node removeNamedItem(String name) 移除通过名称指定的节点