xml解析
xml简介
XML(eXtended Markup Language,可扩展标记性语言),xml可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。xml可以使我们能够更准确的搜索,更方便的传送软件组件,更好的描述一些事物。例如电子商务交易等。它的主要特点:它被设计用来传输和存储数据;被设计用来显示数据。它们都是[标准通用标记语言]的子集。
xml解析
在XML文件中由于更多的是描述信息的内容,所以在得到一个XML文档后用该利用程序按照其中元素的定义名称取出对应的内容,这样的操作就称为XML解析。在XML解析中W3C定义了SAX和DOM两种解析方式,这两种解析方式的程序操作如下:
XML解析操作
可以看出,应用程序不是直接对XML文档进行操作的,而是首先由XML分析器对XML文档进行分析,然后应用程序通过XML分析器所提供的DOM接口或SAX接口对分析结构进行操作,从而间接地实现了对XML文档的访问。
Dom解析
在应用程序中,基于DOM (Document Object Model,文档对象模型)的XML分析器将一个XML文档转换成一个对象模型的集合(通常称为DOM树),应用程勋正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种这种利用DOM接口的机制也被称作随机访问机制。由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高,而且对于结构复杂的树的遍历也是一项耗时的操作。DOM操作会在内存中将所有的XML文件变为DOM树。
在DOM解析中有以下4个核心的操作接口:
Document:此接口代表了整个XML文档,表示整个DOM树的根,提供了对文档中的数据进行访问和操作的入口,通过Document节点可以访问XML文件中所有的元素内容。
Document接口的常用方法
Node:DOM操作的核心接口中有很大一部分是从Node接口继承过来的。例如Document、Element、Attri等接口。在DOM树中,每一个Node接口代表了DOM树中的一个节点。
Node接口的常用方法
NodeList:此接口表示一个节点的集合,一般用于表示有顺序关系的一组节点。例如,一个节点的子节点,当文档改变时会直接 影响到NodeList集合。
NodeList接口的常用方法
NameNodeMap:此接口表示一组节点和其唯一名称对应的一一对应关系,主要用于属性节点的表示。
出以上4个核心接口外,如果一个程序需要进行DOM解析读操作,则需要按如下步骤进行:
(1)建立DocumentBuilderFactory:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)建立DocumentBuilder:DocumentBuilder builder = factory.newDocumentBuilder();
(3)建立Document:Document doc= builder.parse("要读取的文件路径");
(4)建立NodeList:NodeList nl = doc.getElementsByTagName("读取节点");
(5)进行XML信息读取。
DOM完成XML的文件输出。此时就需要使用DOM操作中提供的各个接口(如Element接口)并手工设置各个节点的关系,同时在创建Document对象时就必须使用newDocument()方法建立一个新的DOM树。如果现在需要将XML文件保存在硬盘上,则需要使用TransformerFactory、Transformer、DOMSource、StreamResult 4个类完成。TransformerFactory类:取得一个Transformer类的实例对象。DOMSource类:接收Document对象。StreamResult 类:指定要使用的输出流对象(可以向文件输出,也可以向指定的输出流输出)。Transformer类:通过该类完成内容的输出。
StreamResult类的构造方法
SAX解析操作
SAX(Simple APIs for XML,操作XML的简单接口)与DOM操作不同的是,SAX采用的是一种顺序的模式进行访问,是一种快速读取XML数据的方式。当使用SAX 解析器进行操作时会触发一系列的事件。
SAX主要事件
当扫描到文档(Document)开始与结束、元素(Element)开始与结束时都会调用相关的处理方法,并由这些操作方法做出相应的操作,直到整个文档扫描结束。如果在开发中想要使用SAX解析,则首先应该编写一个SAX解析器,再直接定义一个类,并使该类继承自DefaultHandler类,同时覆写上述的表中的方法即可。
建立完SAX解析器后,还需要建立SAXParserFactory和SAXParser对象,之后通过SAXPaeser的parse()方法指定要解析的XML文件和指定的SAX解析器。
使用SAX解析器
package com.sax.demo;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxTest { public static void main(String[] args) throws Exception {
//(1)建立SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//(2)构造解析器
SAXParser parser = factory.newSAXParser();
//(3)解析XML使用
handler parser.parse("sax_demo.xml", new XmlSax());
}}
通过上面的程序可以发现,使用SAX解析比使用DOM解析更加容易。
DOM解析与SAX解析的区别
有两者的特点可以发现两者的区别:DOM解析适合于对文件进行修改和随机存取的操作,但是不适合于大型文件的操作。SAX采用部分读取的方式,所以可以处理大型文件,而且只需要从文件中读取特定内容。SAX解析可以由用户自己建立自己的对象模型。
2.3、XML解析的好帮手:jdom
jdom是使用Java编写的,用于读、写、操作XML的一套组件。
jdom = dom 修改文件的有点 + SAX读取快速的优点
jdom的主要操作类
使用jdom生成XML文件
使用jdom读取XML文件
jdom是一种常见的操作组件在实际的开发中使用非常广泛。
2.4、解析工具:dom4j
dom4j也是一组XML操作组件包,主要用来读写XML文件,由于dom4j性能优异、功能强大,且具有易用性,所以现在已经被广泛地应用开来。如,Hibernate、Spring框架中都使用了dom4j进行XML的解析操作。开发时需要引入的jar包:dom4j-1.6.1.jar、lib/jaxen-1.1-beta-6.jar
dom4j中的所用操作接口都在org.dom4j包中定义。其他包根据需要把选择使用。
dom4j的主要接口
用dom4j生成XML文件:
用dom4j读取XML文件:
小结
XML主要用于数据交换,而HTML则用于显示。
Java直接提供的XML解析方式分为两种,即DOM和SAX。这两种解析的区别如下:
DOM解析是将所有内容读取到内存中,并形成内存树,如果文件量较大则无法使用,但是DOM解析可以进行文件的修改
SAX解析是采用顺序的方式读取XML文件中,不受文件大小限制,但是不允许修改。