XML解析详解|乐字节

你们好,乐字节的小乐又来了,Java技术分享哪里少的了小乐!上次咱们说了可扩展标记语言XML之二:XML语言格式规范、文档组成,本文将介绍重点——XML解析。
图片描述html

基本的解析方式有两种:一种叫 SAX,另外一种叫 DOM。app

SAX(Simple API for XML)是基于 事件流的解析,DOM(Document Object Model)是基于 XML 文档树结构的解析。SAX:效 率高,数据量小,仅一次获取 。框架

DOM:整颗树加载到内存中,耗内存,可屡次获取。dom

1、DOM 解析

与 js 中的相似,使用 JAXP(Java API for XML Parsing),即:用于 XML 解析的 Java API.工具

DOM(Document Object Model, 文档对象模型),在应用程序中,基于 DOM 的 XML开发工具

分析器将一个 XML 文档转换成一个对象模型的集合(一般称为 DOM 树),应用程序正是经过对这个对象模型的操做,来实现对 XML 文档数据的操做。ui

XML 自己是以树状的形式出现的,因此 DOM 操做的时候,也将按章树的形式进行转换。 在整个 DOM 树种,最大的地方指的是 Document,表示一个文档,在这个文档中存在一个根节点。编码

注意:在使用 DOM 操做的时候,每个文字的区域也是一个节点,称为文本节点。spa

一、核心操做接口

在 DOM 解析中有如下四个核心的操做接口.net

Document : 此接口表明了整个 XML 文档,表示的是整棵 DOM 树的根,提供了对文档中的数据进行访问和操做的入口,经过 Document 节点能够访问 XML 文件中全部的元素内容。

Node : 此接口在整个 DOM 树种具备举足轻重的低位,DOM 操做的核心接口中有很大 一部分接口是从 Node 接口继承过来的。例如:Document、Element 等接口,在 DOM 树种,每个 Node 接口表明了 DOM 树种的一个节点。

NodeList : 此接口表示的是一个节点的集合,通常用于表示有顺序关系的一组节点,

例如:一个节点的子节点,当文档改变的时候会直接影响到 NodeList 集合。

NamedNodeMap : 此接口表示的是一组节点和其惟一名字对应的一一对应关系,本

接口主要用于属性节点的表示上。

二、DOM 解析过程

若是一个程序须要进行 DOM 解析读取操做的话,也须要按照以下的步骤进行:

① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory =

DocumentBuilderFactory.newInstance();

②创建 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();

③创建 Document : Document doc = builder.parse(“要解析的文件路径”);

④创建 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);

⑤进行 XML 信息读取

DOM 操做除了能够进行解析外,也能够进行文档的生成

若是想要生成 XML 文件,则在建立文档的时候,就应该使用 newDocument()方法

若是要将 DOM 的文档输出,自己是比较麻烦的 。一次编写屡次 copy

public static void createXml() throws Exception{ 
//获取解析器工厂 
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
//获取解析器 
DocumentBuilder builder=factory.newDocumentBuilder(); 
//建立文档 
Document doc=builder.newDocument(); 
//建立元素、设置关系 
Element root=doc.createElement("people"); 
Element person=doc.createElement("person"); 
Element name=doc.createElement("name"); 
Element age=doc.createElement("age"); 
name.appendChild(doc.createTextNode("shsxt")); 
age.appendChild(doc.createTextNode("10")); 
doc.appendChild(root); 
root.appendChild(person); 
person.appendChild(name); 
person.appendChild(age); 
//写出去 
// 得到变压器工厂 
TransformerFactory tsf=TransformerFactory.newInstance(); 
Transformer ts=tsf.newTransformer(); 
//设置编码
ts.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
//建立带有DOM节点的新输入源,充当转换Source树的持有者 
DOMSource source=new DOMSource(doc); 
//充当转换结果的持有者 
File file=new File("src/output.xml"); 
StreamResult result=new StreamResult(file); 
ts.transform(source, result); 
}

2、SAX 解析

SAX(Simple API for XML)解析是按照 xml 文件的顺序一步一步的来解析。SAX 没有官方 的标准机构,它不属于任何标准阻止或团体,也不属于任何公司或我的,而是提供任何 人使用的一种计算机技术。

SAX(Simple API for XML,操做 XML 的简单接口),与 DOM 操做不一样的是,SAX 采用的 是一种顺序的模式进行访问,是一种快速读取 XML 数据的方式。当使用 SAX 解析器进行操做的时候会触发一系列的事情,当扫描到文档(document)开始与结束、元素 (element)开始与结束时都会调用相关的处理方法,并由这些操做方法做出相应的操 做,直至整个文档扫描结束。

若是要想实现这种 SAX 解析,则确定首先创建一个 SAX 的解析器

// 一、建立解析器工厂 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
// 二、得到解析器 
SAXParser parser = factory.newSAXParser(); 
// SAX解析器 ,继承 DefaultHandler 
String path = new File("resource/demo01.xml").getAbsolutePath(); 
// 解析 
parser.parse(path, new MySaxHandler());

3、DOM4j 解析

dom4j 是一个简单的开源库,用于处理 XML、 XPath 和 XSLT,它基于 Java 平台,使用 Java 的集合框架,全面集成了 DOM,SAX 和 JAXP。下载路径:

http://www.dom4j.org/dom4j-1....

http://sourceforge.net/projec...

可使用 DOM4J 进行 XML 文件的读、写操做

DOM4J 与 JDOM 同样都属于一个免费的 XML 开源组建,可是因为如今的开发框架中使 用该技术较多,好比 Hibernate、Spring 等都使用 DOM4J 这个功能,因此做为介绍, 你们能够对该组件有一个了解。并无谁好谁坏,通常框架使用 DOM4J 较多,而咱们平时若是要用则 JDOM 较常见。 能够发现 DOM4J 发挥了不少新特性,好比输出格式就能够很好解析。

File file = new File("resource/outputdom4j.xml"); 
SAXReader reader = new SAXReader(); 
// 读取文件做为文档 
Document doc = reader.read(file); 
// 获取文档的根元素 
Element root = doc.getRootElement(); 
// 根据跟元素找到所有的子节点 
Iterator<Element> iter = root.elementIterator(); 
while(iter.hasNext()){ 
Element name = iter.next(); 
System.out.println("value = " + name.getText()); 
}

建立

// 使用DocumentHelper来建立 Document对象 
Document document = DocumentHelper.createDocument(); 
// 建立元素并设置关系 
Element person = document.addElement("person"); 
Element name = person.addElement("name"); 
Element age = person.addElement("age"); 
// 设置文本 
name.setText("shsxt"); 
age.setText("10"); 
// 建立格式化输出器 
OutputFormat of = OutputFormat.createPrettyPrint(); 
of.setEncoding("utf-8"); 
// 输出到文件 
File file = new File("resource/outputdom4j.xml"); 
XMLWriter writer = new XMLWriter(new FileOutputStream(new 
File(file.getAbsolutePath())),of); 
// 写出 
writer.write(document); 
writer.flush(); 
writer.close();

4、JDOM 解析

下载路径: http://www.jdom.org/downloads...

JDOM 是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。JDOM 是一个开源项目,它基于树形结构,利用纯 Java 的技术对 XML 文档实现解析、生成、序列 化及多种操做。

JDOM 解析

掌握 JDOM 开发工具的使用及产生原理

可使用 JDOM 进行读取或写入的操做

在 W3C 自己提供的 XML 操做标准,DOM 和 SAX,可是从开发角度上看,DOM 和 SAX

自己是各有特色的,DOM 能够修改,但不适合读取大文件,而 SAX 能够读取大文件,

可是自己不能修改所谓的 JDOM = DOM 的可修改 + SAX 的读取大文件 。

JDOM 自己是一个免费的开源组建,直接从 http://www.jdom.org 上下载 ,下载后解压,将 jdom.jar 包拷贝到 Tomcat 目录(项目)的 lib 中 。

JDOM 主要操做的类:

咱们发现 JDOM 的输出操做要比传统的 DOM 方便得多,并且也更加直观,包括在输出

的时候都很容易了。

此时观察到的是 JDOM 对于 DOM 解析的支持,可是也说,JDOM 自己也支持了 SAX 的

特色;因此,可使用 SAX 进行解析操做。

解析

// 获取SAX解析器 
SAXBuilder builder = new SAXBuilder(); 
File file = new File("resource/demo01.xml"); 
// 获取文档 
Document doc = builder.build(new File(file.getAbsolutePath())); 
// 获取根节点 
Element root = doc.getRootElement(); 
System.out.println(root.getName()); 
// 获取根节点下全部的子节点, 也能够根据标签名称获取指定的直接点 
List<Element> list = root.getChildren(); 
System.out.println(list.size()); 
for(int x = 0; x<list.size(); x++){ 
Element e = list.get(x); 
// 获取元素的名称和里面的文本 
String name = e.getName(); 
System.out.println(name + "=" + e.getText()); 
System.out.println("==================");
}

建立

// 建立节点 
Element person = new Element("person"); 
Element name = new Element("name"); 
Element age = new Element("age"); 
// 建立属性 
Attribute id = new Attribute("id","1"); 
// 设置文本 
name.setText("shsxt"); 
age.setText("10"); 
// 设置关系 
Document doc = new Document(person); 
person.addContent(name); 
name.setAttribute(id); 
person.addContent(age); 
XMLOutputter out = new XMLOutputter(); 
File file = new File("resource/outputjdom.xml"); 
out.output(doc, new FileOutputStream(file.getAbsoluteFile()));

关于XML解析先讲到这里了,请继续关注乐字节,后续Java超级干货奉上,快快乐乐学Java。

相关文章
相关标签/搜索