大家好,乐字节的小乐又来了,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.6.1/
http://sourceforge.net/projects/dom4j
可以使用 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();

  

 

四、JDOM 解析

下载路径: http://www.jdom.org/downloads/index.html
JDOM 是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。JDOM 是一个开源项目,它基于树形结构,利用纯 Java 的技术对 XML 文档实现解析、生成、序列 化及多种操作。
JDOM 解析
掌握 JDOM 开发工具的使用及产生原理
可以使用 JDOM 进行读取或写入的操作
在 W3C 本身提供的 XML 操作标准,DOM 和 SAX,但是从开发角度上看,DOM 和 SAX
本身是各有特点的,DOM 可以修改,但不适合读取大文件,而 SAX 可以读取大文件,
但是本身不能修改所谓的 JDOM = DOM 的可修改 + SAX 的读取大文件 。
JDOM 本身是一个免费的开源组建,直接从 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。

XML解析详解|乐字节的更多相关文章

  1. Tomcat详解|乐字节

    大家好,欢迎来到乐字节小乐的Java技术分享园地.这次给大家分享的是Tomcat   一. 什么是 Tomcat Tomcat 是一个符合 JavaEE WEB 标准的最小的 WEB 容器,所有的 J ...

  2. Python之XML解析详解

    什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这 ...

  3. python的内置模块xml模块方法 xml解析 详解以及使用

    一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...

  4. XML文件详解以及解析

    转自:https://blog.csdn.net/com_ma/article/details/73277535 一.xml基础详解: 1.概述: xml:即可扩展标记语言,xml是互联网数据传输的重 ...

  5. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  7. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  8. sqlMapConfig.xml配置文件详解

    sqlMapConfig.xml配置文件详解: Xml代码 Xml代码  <? xml version="1.0" encoding="UTF-8" ?& ...

  9. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

随机推荐

  1. Flume高级之自定义MySQLSource

    1 自定义Source说明 Source是负责接收数据到Flume Agent的组件.Source组件可以处理各种类型.各种格式的日志数据,包括avro.thrift.exec.jms.spoolin ...

  2. MYECLIPSE说明书

    0. 快捷键================================================================================编辑:Ctrl+Shift+ ...

  3. The 10th Shandong Provincial Collegiate Programming Contest 2019山东省赛游记+解题报告

    比赛结束了几天...这篇博客其实比完就想写了...但是想等补完可做题顺便po上题解... 5.10晚的动车到了济南,没带外套有点凉.酒店还不错. 5.11早上去报道,济南大学好大啊...感觉走了一个世 ...

  4. Xamarin移动开发之路

    Xamarin入门 1.Xamarin开发及学习资源 2.Xamarin安装及调试 Xamarin.Forms 1.入门 [快速入门] 2.XAML 3.应用程序基础知识 [辅助功能]eg:大类型.高 ...

  5. CSS文本元素

    一.属性 font-size:16px;  文字大小 Font-weight: 700 ;   值从100-900,文字粗细,不推荐使用font-weight:bold; Font-family:微软 ...

  6. 这里是DDOSvoid的blog

    由于博主已经退役,博客现由 @一扶苏一 代为维护. DDOSvoid 在生前退役前写下了大量的 blog 存在本地,现在由他的弟子 一扶苏一 整理编纂成为题单慢慢上传,是为<论语>< ...

  7. 273道题目;更新到java题目里面 (已迁移到其他类目下面,存储)

    1. Java 基础 1.JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗? ...

  8. FusionInsight,一个融合的大数据平台

    随着物联网技术和应用的普及,以运营商.互联网以及实体经济行业为代表的企业产生了越来越多的数据,大数据的发展越来越蓬勃. 从2007年开始,大数据应用成为很多企业的需求,2012年兴起并产生了大数据平台 ...

  9. ubuntu之路——day13 只用python的numpy在较为底层的阶段实现单隐含层神经网络

    首先感谢这位博主整理的Andrew Ng的deeplearning.ai的相关作业:https://blog.csdn.net/u013733326/article/details/79827273 ...

  10. Git提交(PUSH)时记住密码 - 不用每次都输入密码

    开发使用的团队搭建好的GitLab服务器来作为项目共享开发,由于我不是最高权限,没办法把我git生成的SSH-Key放到服务器里面去,所有只好在每次提交的时候配置git config来记录密码不过期来 ...