资讯专栏INFORMATION COLUMN

XML解析详解|乐字节

LinkedME2016 / 1505人阅读

摘要:解析获取解析器获取文档获取根节点获取根节点下所有的子节点,也可以根据标签名称获取指定的直接点获取元素的名称和里面的文本创建创建节点创建属性设置文本设置关系关于解析先讲到这里了,请继续关注乐字节,后续超级干货奉上,快快乐乐学。

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

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

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

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

一、DOM 解析

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

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

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

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

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

1、核心操作接口

在 DOM 解析中有以下四个核心的操作接口

Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM 树的根,提供了对文档中的数据进行访问和操作的入口,通过 Document 节点可以访问 XML 文件中所有的元素内容。

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

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

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

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

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

2、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); 
}
二、SAX 解析

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

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

如果要想实现这种 SAX 解析,则肯定首先建立一个 SAX 的解析器

// 1、创建解析器工厂 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
// 2、获得解析器 
SAXParser parser = factory.newSAXParser(); 
// SAX解析器 ,继承 DefaultHandler 
String path = new File("resource/demo01.xml").getAbsolutePath(); 
// 解析 
parser.parse(path, new MySaxHandler()); 
三、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 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(); 

四、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 list = root.getChildren(); 
System.out.println(list.size()); 
for(int x = 0; x

创建

// 创建节点 
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。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110395.html

相关文章

  • 可扩展标记语言XML之一:XML的概念、作用与示例

    摘要:当今广泛使用的标记语言是超文本标记语言,和可扩展标记语言。标记语言广泛应用于网页和网络应用程序。芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁媵侍远嫁秦国。目前只有一个版本,即是自描述数据,使用现有的国际标准。 哈喽大家好啊,乐字节小乐又来给大家分享Java技术文章了。上次已经讲完了Java多线程相关知识,这次文章将讲述可扩展标记语言XMLshowImg(https://...

    myshell 评论0 收藏0
  • 可扩展标记语言XML之一:XML的概念、作用与示例

    摘要:当今广泛使用的标记语言是超文本标记语言,和可扩展标记语言。标记语言广泛应用于网页和网络应用程序。芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁媵侍远嫁秦国。目前只有一个版本,即是自描述数据,使用现有的国际标准。 哈喽大家好啊,乐字节小乐又来给大家分享Java技术文章了。上次已经讲完了Java多线程相关知识,这次文章将讲述可扩展标记语言XMLshowImg(https://...

    william 评论0 收藏0
  • 字节-Java8新特性之Date API

    摘要:上一篇文章,小乐给大家带来了新特性之,接下来本文将会给大家介绍新特性之前言通过发布新的来进一步加强对日期与时间的处理。 上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期与时间的处理。 旧版的 Java 中,日期时间 API 存在诸多问题...

    suemi 评论0 收藏0
  • 字节Java继承-方法重写、super和final关键字

    摘要:大家好,乐字节的小乐又来了,上一篇是乐字节继承与权限修饰,也是属于继承的,今天继续继承方法重写和关键字。三关键字表示最终的。修饰类,表示该类不能被继承修饰方法,表示该方法不能被重写修饰属性,表示常量,值一旦确定不可改变。 大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean、继承与权限修饰,也是属于Java继承的,今天继续Java继承-方法重写、super和final...

    trigkit4 评论0 收藏0
  • 字节Java|this关键字、static关键字、block块

    摘要:在成员方法中或构造器中隐式的传递。作用如下在构造器中只能放在第一行属性避免属性和形参局部变量同名,发生就近原则实参列表构造器的首行调用其他构造器。关键字静态的公共的。构造块,先于构造器执行,每创建一个对象执行一次。 大家好,我是乐字节的小乐,从本文开始将会给大家讲述Java继承,一下是Java继承的知识图谱:showImg(https://segmentfault.com/img/bV...

    _DangJin 评论0 收藏0

发表评论

0条评论

LinkedME2016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<