您的位置:首页 > 编程语言 > Java开发

java之XML解析(Dom及Sax)

2015-07-20 09:48 337 查看
XML是一种可扩张标记语言。是J2EE的十三个规范之一。

可扩展标记语言,标准通用标记语言的子集。是一种用于标记电子文件使其具有结构性的标记语言。

在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。

它可以用来标记数据,定义数据类型。是一种允许用户对自己的标记语言进行定义的源语言。

它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

是Internate环境中跨平台的,依赖于内容的技术。也是当今处理分布式结构信息的有效工具。

早在1998年,W3C就发布XML1.0规范,使用它来简化Internate的文档信息传输。

一.可扩展标记语言:

可扩展标记语言是一种很像超文本标记语言的标记语言。

它的设计宗旨是传输数据,而不是显示数据。

它的标签没有被预定义。你需要自行定义标签。

它被设计为具有自我描述性。

它是W3C的推荐标准。

二.可扩展标记语言和超文本标记语言之间的差异

它不是超文本标记语言的替代

它是对超文本标记语言的补充

1.它和超文本标记语言为不同的目的而设计:

(1)它被设计用来传输和存储数据,其焦点是数据的内容。

(2)超文本标记语言被设计用来显示数据,其焦点是数据的外观。

超文本标记语言旨在显示信息,而XML(可扩展标记语言)旨在传输信息。

对他最好的描述是:

它是独立于软件和硬件的信息传输工具

两种解析方式:

XML基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析。DOM是基于XML文档树结构的解析。

假设我们XML内容和结构如下:

<?xml version="1.0" encoding="UTF-8"?>

<employees>

<employe>

<name>ddviplinux</name>

<sex>m</sex>

<age>30</age>

</employe>

</employees>

1.DOM生成和解析XML文档

为XML文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构。

优点:整个文档树在内存中,便于操作。支持删除,修改,重新排列等多种功能。

缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间。

使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存,CPU)

public void parsexmlforDom(String fileName) {

try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder db = dbf.newDocumentBuilder();

Document document = db.parse(fileName);

NodeList employees = document.getChildNodes();

for (int i = 0; i < employees.getLength(); i++) {

Node employee = employees.item(i);

NodeList employeeInfo = employee.getChildNodes();

for (int j = 0; j < employeeInfo.getLength(); j++) {

Node node = employeeInfo.item(j);

NodeList employeeMeta = node.getChildNodes();

for (int k = 0; k < employeeMeta.getLength(); k++) {

System.out.println(employeeMeta.item(k).getNodeName() +

":" + employeeMeta.item(k).getTextContent());

}

}

}

System.out.println("解析完毕!");

} catch (Exception e) {

e.printStackTrace();

}

}

2.SAX生成和解析XML文档

为解决DOM的问题,出现了SAX。SAX时间驱动。当解析器发现元素开始,元素结束;

文本,文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。

优点:不用事先调入整个文档,占用资源少;

SAX解析器代码比DOM解析器代码小,适于Applet,下载。

缺点:不是持久的。事件过后,若没有保存数据,那么数据就丢失了;

无状态性:从事件中只能得到文本,但不知道该文本属于哪个元素;

使用场合:Applet;只需XML文档少量的内容,很少回头访问;机器内存少;

public void parsexmlforSax(String fileName) {

SAXParserFactory saxfac = SAXParserFactory.newInstance();

try {

SAXParser saxParser = saxfac.newSAXParser();

InputStream is = new FileInputStream(fileName);

// paeseXml为该方法所在类的类名(注意:该类一定要extends DefaultHandler)

parseXml parseXml = new parseXml();

saxParser.parse(is, parseXml);

} catch (Exception e) {

e.printStackTrace();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: