XML解析详解|乐字节

大家好,乐字节的小乐又来了,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

publicstaticvoidcreateXml()throwsException{//获取解析器工厂 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();//获取解析器 DocumentBuilderbuilder=factory.newDocumentBuilder();//创建文档 Documentdoc=builder.newDocument();//创建元素、设置关系 Elementroot=doc.createElement("people");Elementperson=doc.createElement("person");Elementname=doc.createElement("name");Elementage=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);//写出去 // 获得变压器工厂 TransformerFactorytsf=TransformerFactory.newInstance();Transformerts=tsf.newTransformer();//设置编码ts.setOutputProperty(OutputKeys.ENCODING,"UTF-8");//创建带有DOM节点的新输入源,充当转换Source树的持有者 DOMSourcesource=newDOMSource(doc);//充当转换结果的持有者 Filefile=newFile("src/output.xml");StreamResultresult=newStreamResult(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、创建解析器工厂 SAXParserFactoryfactory=SAXParserFactory.newInstance();// 2、获得解析器 SAXParserparser=factory.newSAXParser();// SAX解析器 ,继承 DefaultHandler Stringpath=newFile("resource/demo01.xml").getAbsolutePath();// 解析 parser.parse(path,newMySaxHandler());

三、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 发挥了很多新特性,比如输出格式就可以很好解析。

Filefile=newFile("resource/outputdom4j.xml");SAXReaderreader=newSAXReader();// 读取文件作为文档 Documentdoc=reader.read(file);// 获取文档的根元素 Elementroot=doc.getRootElement();// 根据跟元素找到全部的子节点 Iterator<Element>iter=root.elementIterator();while(iter.hasNext()){Elementname=iter.next();System.out.println("value = "+name.getText());}创建// 使用DocumentHelper来创建 Document对象 Documentdocument=DocumentHelper.createDocument();// 创建元素并设置关系 Elementperson=document.addElement("person");Elementname=person.addElement("name");Elementage=person.addElement("age");// 设置文本 name.setText("shsxt");age.setText("10");// 创建格式化输出器 OutputFormatof=OutputFormat.createPrettyPrint();of.setEncoding("utf-8");// 输出到文件 Filefile=newFile("resource/outputdom4j.xml");XMLWriterwriter=newXMLWriter(newFileOutputStream(newFile(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 本身是一个免费的开源组建,直接从 http://www.jdom.org 上下载 ,下载后解压,将 jdom.jar 包拷贝到 Tomcat 目录(项目)的 lib 中 。

JDOM 主要操作的类:

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

的时候都很容易了。

此时观察到的是 JDOM 对于 DOM 解析的支持,但是也说,JDOM 本身也支持了 SAX 的

特点;所以,可以使用 SAX 进行解析操作。

解析

// 获取SAX解析器 SAXBuilderbuilder=newSAXBuilder();Filefile=newFile("resource/demo01.xml");// 获取文档 Documentdoc=builder.build(newFile(file.getAbsolutePath()));// 获取根节点 Elementroot=doc.getRootElement();System.out.println(root.getName());// 获取根节点下所有的子节点, 也可以根据标签名称获取指定的直接点 List<Element>list=root.getChildren();System.out.println(list.size());for(intx=0;x<list.size();x++){Elemente=list.get(x);// 获取元素的名称和里面的文本 Stringname=e.getName();System.out.println(name+"="+e.getText());System.out.println("==================");}

创建

// 创建节点 Elementperson=newElement("person");Elementname=newElement("name");Elementage=newElement("age");// 创建属性 Attributeid=newAttribute("id","1");// 设置文本 name.setText("shsxt");age.setText("10");// 设置关系 Documentdoc=newDocument(person);person.addContent(name);name.setAttribute(id);person.addContent(age);XMLOutputterout=newXMLOutputter();Filefile=newFile("resource/outputjdom.xml");out.output(doc,newFileOutputStream(file.getAbsoluteFile()));

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容