二、Java XML 教程
1、Java XML 解析器
1.1、什么是XML解析?
解析XML是指将通过XML文档访问数据或修改数据的一个操作或方法。
Java库中提供了两种XML解析器: 1、像文档对象模型(Document Object Model,DOM)解析器这的树型解析器(tree parse),它们将读入的XML文档转换 成树结构。 2、像XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器(streaming parser),它们在读入XML文档时生 成相应的事件。
1.2、XML解析器是什么?
XML解析器提供方法来访问或修改XML文档中的数据。 Java提供了多种选择来解析XML文档。以下是各种类型解析器其通常用于解析XML文档。 Dom解析器 - 解析通过加载该文件的全部内容,并创建其完整分级树中存储的文件。 SAX解析器 - 解析基于事件触发器的文档。不完整(部分)的文件加载到存储器中。 JDOM解析器 - 解析以类似的方式,以DOM解析器但更简单的方法的文档。 StAX解析器 - 解析以类似的方式,以SAX解析器但在更高效的方式的文档。 XPath解析器 - 解析基于表达式XML并广泛选择使用XSLT。 DOM4J解析器 - Java库来解析XML,XPath和使用Java集合框架XSLT,为DOM,SAX和JAXP的支持。
2、Java DOM解析器
2.1、DOM解析器简介
文档对象模型是万维网联盟(W3C)的官方推荐。它定义了一个接口,使程序能够访问和更新样式,结构和XML文档的内容。支持DOM实现该接口的XML解析器。
何时使用? 在以下几种情况时,应该使用DOM解析器: 1、需要知道很多关于文档的结构 2、需要将文档的部分周围(例如,可能需要某些元素进行排序) 3、需要使用的文件中的信息超过一次
会得到什么? 当使用DOM 解析器解析一个XML文档,会得到一个树形结构,其中包含的所有文档的元素。 DOM提供了多种可用于检查文档的内容和结构的函数。
优势 DOM是用于处理文档结构的通用接口。它的一个设计目标是Java代码编写一个DOM兼容的解析器,运行在任何其他的DOM兼容的解析器不会有变化。
DOM接口 DOM定义了几个Java接口。这里是最常见的接口: 1、节点 - DOM的基本数据类型。 2、元素 - 要处理的对象绝大多数是元素。 3、Attr - 代表元素的属性。 4、文本 - 元素或Attr的实际内容。 5、文档 - 代表整个XML文档。文档对象是通常被称为DOM树。
常见的DOM方法 当正在使用DOM,有经常用到的几种方法: 1、Document.getDocumentElement() - 返回文档的根元素。 2、Node.getFirstChild() - 返回给定节点的第一个子节点。 3、Node.getLastChild() - 返回给定节点的最后一个子节点。 4、Node.getNextSibling() - 这些方法返回一个特定节点的下一个兄弟节点。 5、Node.getPreviousSibling() - 这些方法返回一个特定节点的前一个兄弟节点。 6、Node.getAttribute(attrName) - 对于给定的节点,则返回所请求的名字的属性。
2.2、Java DOM解析器 - 解析XML文档
使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤。 1、导入XML相关的软件包。 2、创建DocumentBuilder 3、从文件或流创建一个文档 4、提取根元素 5、检查属性 6、检查子元素
document对象: 要操作XML,先就得有Document对象,把一个XML文件加载进内存的时候,在内存中形成所谓的一种树状结构,我们把这一个结构称之为DOM树.
注意: 我们在Java代码中所做的增/删/改/查操作,都仅仅是操作的是内存中的Document对象,和磁盘中的XML文件没有关系。比如:删除一个联系人信息之后,XML文件中数据依然存在,此时出现内存中的数据和磁盘文件中的数据不同步。所以,对于增删改操作,我们需要做同步操作(把内存中的数据和磁盘的XML文件数据保持一致)。 DOM:在第一次的时候就会把XML文件加载进内存,如果XML文件过大,可能会造成内存的溢出. DOM:在做增删改查操作的时候比较简单,,但是性能却不高(线性搜索).
3、Java SAX解析器
3.1、Java SAX解析器简介
SAX解析器在解析XML输入数据的各个组成部分时会报告事件,但不会以任何方式存储文档,而是由事件处理器建立相应的数据结构。实际上DOM解析器是在SAX解析器的基础上构建的,它在接收到解析器事件时构建DOM树。
SAX(针对XML的简单API)是基于事件为XML文档的解析器。不像DOM解析器,SAX解析器创建没有解析树。 SAX是一个流接口用于XML的,这意味着使用SAX应用接收事件通知有关XML文档被处理的元素,属性,在按顺序每次开始在文档的顶部,并与所述闭合结束根元素。 1、读取XML文件从上到下,构成一个结构完整的XML文档的标记 2、令牌以相同的顺序进行处理,它们出现在文档中 3、报告应用程序,因为它们所出现解析器遇到标记的特性 4、应用程序提供了必须的解析器注册的“事件”处理程序 5、作为标记标识,在处理程序回调方法相关信息调用
什么时候使用? 应该使用SAX解析器的时候: 1、可以在XML文档从上往下处理以线性方式 2、该文件并不深层次嵌套 3、处理一个非常大的XML文档,DOM树会占用太多的内存。典型DOM的实现使用10字节的存储器以表示XML的一个字节 4、解决的问题涉及的XML文档的一部分 5、数据是可用的,只要它是由解析器看出,这样的SAX可以很好地用于到达流的XML文档
SAX的缺点 1、它是在一个只进入处理随机访问方式XML文档 2、如果需要跟踪的数据分析器已经看到或更改项目的顺序,必须自已编写代码和数据存储
ContentHandler接口 此接口指定SAX解析器用来通知XML文档,已经看到部件应用程序的回调方法。
方法 | 方法描述 |
---|---|
void startDocument() | 调用在一个文件的开头。 |
void endDocument() | 调用在一个文件的末尾。 |
void startElement(String uri, String localName, String qName, Attributes atts) | 调用在一个元素的开头 |
void endElement(String uri, String localName,String qName) | 调用在一个元件的末端。 |
void characters(char[] ch, int start, int length) | 字符数据出现时调用。 |
void ignorableWhitespace( char[] ch, int start, int length) | 当DTD是当前和忽略空白遇到时调用。 |
void processingInstruction(String target, String data) | 当处理指令的认可时调用。 |
void setDocumentLocator(Locator locator)) | 提供可用于识别文档中的位置的定位器。 |
void skippedEntity(String name) | 一个尚未解决实体遇到时调用。 |
void startPrefixMapping(String prefix, String uri) | 当一个新的命名空间的映射定义调用。 |
void endPrefixMapping(String prefix) | 当一个命名空间定义结束其范围时调用。 |
属性接口 这种接口指定用于处理连接到一个元素的属性的方法。 int getLength() - 返回属性的数目。 String getQName(int index) String getValue(int index) String getVal