第7章__SAX解析XML

合集下载

XML解析原理

XML解析原理

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(xml路径);
NodeList list=document.getElementByTagName(XML文档中的标签元素(第一个根节点或是子节点));
Node node=list.item(0);
String content=node.getTextContent();
System.out.println(content);
XML编程(CRUD)-----create read update delete
XML解析技术概述
XML解析方式分为两种:dom和sax
dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式
sax:(Simple API for xml)不是官方标准,但他是XML社区事实上的标准,几乎所有的XML解析器都支持他
JAXP
JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成
在Java.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂,可以得到XML文档的DOM
或SAX的解析器,从而实现对XML文档的解析 Biblioteka 读取XML文档中的值代码:
XML解析开发包:Jaxp(sun) Jdom、dom4j
dom和sax解析方法的区别

SAXReader解析XML文件数据

SAXReader解析XML文件数据

SAXReader解析XML⽂件数据关于SAXReader解析XML⽂件数据注意:须从maven公共库中添加dom4j依赖包(依赖于元素名和元素的⽅法)解析xml代码private static void parseXml(String path) throws Exception {// 调⽤dom4j依赖包中的SAXReader对象SAXReader saxReader = new SAXReader();// 通过read⽅法可以读取XML数据,返回Document格式对象Document document = saxReader.read(path);// 使⽤getRootElement()⽅法获取根元素,根节点元素是students,返回element对象Element element = document.getRootElement();// 通过element()⽅法,获取该根节点下的所有⼦元素List<Element> list = element.elements("student");//循环遍历所有的⼦元素的信息for (Element studentElement : list) {System.out.println("姓名:"+studentElement.elementText("Name")+",年龄:"+studentElement.elementText("Age")+",性别:"+studentElement.elementText("Gender"));}/*//第⼆种⽅法:通过⼦元素下的标签名---》element()获取对应的元素值for(Element studentElement:list){Element elementName=studentElement.element("Name");Element elementAge=studentElement.element("Age");Element elementGender=studentElement.element("Gender");System.out.println("姓名:"+elementName.getText()+",年龄:"+elementAge.getText()+",性别"+elementGender.getText());}*/}public static void main(String[] args) throws Exception {String path = "src/test/resources/student.xml";parseXml(path);}要解析的student.xml⽂件<?xml version="1.0" encoding="UTF-8"?><students><student number="1801001"><Name>王尼玛</Name><Age>21</Age><Gender>男</Gender></student><student number="1801002"><Name>赵铁柱</Name><Age>22</Age><Gender>男</Gender></student><student number="1801003"><Name>李⼩花</Name><Age>18</Age><Gender>⼥</Gender></student></students>实现结果:解析代码:1、读取xml⽂件创建SAXReader对象并调⽤其read()⽅法来读取xml数据,并返回Document格式的对象。

解析Xml文件的三种方式

解析Xml文件的三种方式

解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。

它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。

使⽤回调函数来实现。

1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。

xml 格式 解析

xml 格式 解析

xml 格式解析XML格式解析是一种常见的数据解析方法,它可以将XML格式的数据转换为可供程序使用的数据结构。

XML即可扩展标记语言(eXtensible Markup Language),它被广泛应用于数据交换和存储。

下面将介绍XML格式解析的原理和常用的解析方法。

XML格式解析的原理是通过读取XML文件并识别其中的标签、属性和文本内容,将其转换为内存中的数据结构,以便程序进行进一步处理。

XML文件由起始标签、结束标签、属性和文本内容组成。

解析器会根据这些组成部分对XML文档进行解析。

常用的XML格式解析方法有两种:DOM解析和SAX解析。

DOM(文档对象模型)解析是一种将整个XML文档加载到内存中,并构建一个XML树结构的解析方法。

它可以方便地对XML文档进行增删改查操作。

DOM解析器会先将整个XML文档加载到内存中,然后构建一个树状结构,通过遍历树状结构来访问和操作XML文档的节点。

SAX(简单 API for XML)解析是一种基于事件驱动的解析方法。

它边读取XML文档边解析,并在读取到XML文档的不同部分时触发相应的事件。

相比DOM解析,SAX解析更加高效,特别适用于大型XML文件的解析。

SAX解析器会逐行读取XML文档,当遇到起始标签、结束标签或文本内容时触发相应的事件,并通过事件处理程序来处理这些事件。

选择使用DOM解析还是SAX解析取决于具体的需求。

如果需要对XML文档进行多次操作或查询,DOM解析更方便。

但是,如果处理大型XML文件或只需一次性读取XML数据,SAX解析更高效。

总之,XML格式解析是处理XML数据的重要技术。

通过DOM解析和SAX 解析,我们可以将XML格式的数据转换为程序可以处理的数据结构,实现数据的读取、分析和操作。

xml格式讲解

xml格式讲解

xml格式讲解XML(eXtensible Markup Language)是一种用于描述和传输数据的标记语言。

它能够通过自定义标签来定义数据的结构和内容。

本文将对XML格式进行详细讲解。

一、XML的基本语法XML采用了类似于HTML的标签语法,但与HTML不同的是,XML标签必须自行定义,且对大小写敏感。

以下是XML的基本语法要点:1. 标签:XML使用尖括号(< >)来定义标签,标签通常成对出现,分为开始标签和结束标签。

例如:<book>...</book>2. 元素(Element):元素由开始标签、结束标签和标签内容组成。

例如:<name>John</name>3. 属性(Attribute):属性为元素提供更多的信息,通常出现在开始标签中。

例如:<book category="novel">...</book>4. 注释:注释用于添加对XML代码的说明,以"<!--"开头,以"-->"结尾。

例如:<!-- This is a comment -->二、XML的文档结构一个合法的XML文档必须包含一个根元素,并且所有的元素都必须严格嵌套。

以下是一个简单的XML文档示例:<?xml version="1.0" encoding="UTF-8"?><library><book><title>《Pride and Prejudice》</title><author>Jane Austen</author></book><book><title>《1984》</title><author>George Orwell</author></book></library>在上述示例中,根元素是"library",它包含了两个子元素"book",并且每个"book"元素分别包含了"title"和"author"元素。

xml文件解析方法

xml文件解析方法

xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。

在处理XML文件时,解析是必不可少的环节。

本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。

一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。

DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。

DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。

1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。

2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。

3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。

4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。

二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。

在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。

相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。

1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。

2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。

4种常见的xml解析方法

4种常见的xml解析方法

查看文章4种常见的xml解析方法2009-11-03 14:40==========================================xml文件<?xml version="1.0" encoding="GB2312"?><RESULT><VALUE><NO>A1234</NO><ADDR>四川省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE><NO>B1234</NO><ADDR>四川省XX市XX乡XX村XX组</ADDR></VALUE></RESULT>需要什么包自己到网上找下吧?==========================================1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。

DOM是以层次结构组织的节点或信息片断的集合。

这个层次结构允许开发人员在树中寻找特定信息。

分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。

由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。

DOM 以及广义的基于树的处理具有几个优点。

首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。

它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。

DOM使用起来也要简单得多。

import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;public class MyXMLReader{public static void main(String arge[]){long lasting =System.currentTimeMillis();try{File f=new File("data_10k.xml");DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc = builder.parse(f);NodeList nl = doc.getElementsByTagName("VALUE");for (int i=0;i<nl.getLength();i++){System.out.print("车牌号码:" +doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue() );System.out.println("车主地址:" +doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue ());}}catch(Exception e){e.printStackTrace();}==========================================2)SAXSAX处理的优点非常类似于流媒体的优点。

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较XML(可扩展标记语言)是一种非常常见的数据交换格式,用于在应用程序之间传递和存储数据。

在处理XML数据时,需要使用解析器来读取和解析XML文档。

下面将介绍XML的四种解析器的原理和性能比较。

1. DOM解析器(Document Object Model Parser):DOM解析器将整个XML文档加载到内存中,并将其表示为一个树形结构,每个节点都对应XML文档中的一个元素或属性。

解析器可以通过遍历这个树形结构来访问和操作XML数据。

由于将整个文档加载到内存中,DOM解析器所需的内存较大,适合处理比较小的XML文档。

虽然性能较差,但它提供了灵活的访问和操作XML数据的方法。

2. SAX解析器(Simple API for XML Parser):3. StAX解析器(Streaming API for XML Parser):StAX解析器是一种混合了DOM和SAX解析器的解析器,它允许开发人员以推拉模型访问XML数据。

开发人员可以使用迭代器的形式遍历XML文档,并根据需要拉取或推送事件。

StAX解析器的内存需求较低,同时也具备灵活的操作XML数据的能力。

4. JAXB解析器(Java Architecture for XML Binding):JAXB解析器是一种用于将XML数据绑定到Java对象的解析器。

它可以将XML文档中的元素和属性映射到具体的Java类和对象上,并提供了将Java对象序列化为XML的能力。

相比于前三种解析器,JAXB解析器需要定义Java类和XML的映射关系,稍微复杂一些。

但它提供了方便的对象操作方式,可以更加简洁地处理XML数据。

对于解析性能的比较,DOM解析器的性能最差,因为它需要将整个XML文档加载到内存中。

对于大型XML文档,DOM解析器可能会导致内存不足的问题。

SAX解析器和StAX解析器的性能较好,因为它们是基于事件驱动的解析器,可以逐行读取XML文档,无需将整个文档加载到内存中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
• • • • • •
7.1.4 SAX解析器创建及使用 解析器创建及使用
• SAX接口提供了解析XML文件的API,基于S AX接口的解析器这里我们称作SAX解析器。和DO M M解析不同的是,SAX解析器不在内存中建立和X SAX X ML文件相对应的树状结构数据。SAX解析器的核 心是事件处理机制。
11
7.2.4 处理文本数据
• XML文件中标记的内容是文本数据,当SAX解析 器解析这些数据时,就报告“文本数据”事件给事件 处理器,事件处理器获取事件信息后,就会调用下面 的方法: • public void characters(char[] ch,int start,int length)throws SAXException
16
7.3 SAX与DOM接口比较 与 接口比较
• 基于DOM接口的解析器,解析XML文档时,会将XML文 档以树模型的方式加载到内存中。此时应用程序可以对树模 型的任一个部分进行遍历和操作,通过DOM的树模型可以实 现对XML文档的随机访问。这种访问方式给应用程序的开发 带来了很大的灵活性,它可以任意地控制整个XML文档中的 内容。然而,由于DOM解析器把整个XML文档转化成DOM树 放在了内存中,因此,当XML文档比较大或者文档结构比较 复杂时,对内存的需求就比较高。而且,对于结构复杂的树 的遍历也是一项比较耗时的操作。所以,DOM解析器对机器 性能的要求比较高,实现效率不十分理想。不过,由于DOM 解析器的树结构的思想与XML文档的结构相吻合,所以通过D OM树机制很容易实现随机访问。
15
7.2.8 SAX应用程序异常 应用程序异常

从上面的案例中,可以看出解析在调用parese 方法时,必须使用try-catch语句来捕获SAXExcepti on异常,当SAXException异常发生时,parse方法 会离开结束执行,停止解析过程。实际上,Default Handler类中的方法都可以抛出一个SAXException 对象给解析器,比如,事件处理在调用startDocum ent()方法时,突然决定终止解析文件,就可以抛出 一个SAXException对象给解析器,解析器将停止p arse方法的执行。
12
7.2.5 处理空白

人们习惯上称标记之间的缩进区域是可忽略空 白,这实际上不是很准确,应为XML文件的标记可 以有文本和子标记,在这种情况下,标记之间的区 域就可能包含非空白的字符内容(混合内容)。如果 我们不允许标记有混合内容,即标记要么只包含有 子标记要么只包含有文本数据,在这种情形下,称 标记之间缩进区域是可忽略空白就比较恰当,这些 空白区使得XML文件看起来更加美观,是没有价值 的文本数据。
• 当SAX解析器解析XML文档时,解析到不同的标 记会触发不同的事件。当SAX解析器开始解析XML文 件时,就会报告“文件开始”事件给事件处理器,此 时事件处理器会调用方法startDocument()方法,然后 再陆续处理并报告其他的事件,如“开始标记”、“ 文本事件”等,如果解析到XML文档的结束,解析器 会报告“文件结束”事件,事件处理器会调用endDoc ument()方法。解析器在解析XML文件的过程中,只能 报告一次“文件开始”事件和“文件结束”事件。如 果要实现处理“文件结束”和“文件开始”事件,需 要在程序的类中重写这两个继承的方法。
5

7.1.3 常用接口
• SAX是一个接口,一套API,在SAX接口里声 明了处理XML文档的时候需要的方法。利用SAX编 写的程序,可以快速的对数据进行操作。SAX接口 中常用的接口如下所示: Attributes接口 ContentHandler接口 DTDHandler接口 EntityResolver接口 XMLReader接口 SAX错误处理程序的基本接口
9
7.2.2 处理指令

该处理指令使得XML文件关联到某个层叠样式表, 其路径为url。当SAX解析器处理XML文件时,如果发现 XML文档中的处理指令会报告一个“处理指令”事件给 事件处理器,事件处理器会调用下面的方法处理。
10
7.2.3 处理开始和结束标记
• 在解析器解析XML文档时,如果发现了开始标 记,就会触发“开始标记”事件,并向事件处理器 发送一个“开始标记”事件报告。事件处理器获得 发送的事件报告信息,就会调用方法。
4
7.1.2 工作机制
SAX在概念上与DOM完全不同。首先,不同于 DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是S AX的解析过程。所谓事件驱动,是指一种基于回调 (callback)机制的程序运行方法。我们也可以把它 称为授权事件模型。 • SAX解析器装载XML文件时,它遍历XML文档并 在其主机应用程序中产生事件(经由回调函数、指派 函数或者任何可调用平台完成这一功能)表示这一过 程。这样,编写SAX应用程序就如同采用最现代的工 具箱编写GUI事件程序。
本章知识要点: 本章知识要点:
• • • • • • • 掌握SAX概念和特点 熟练掌握SAX的工作机制 了解SAX常用接口 熟练掌握SAX解析XML文档的步骤 熟练掌握解析器和事件处理器的创建和使用 熟练掌握SAX处理各种应用 掌握SAX和DOM共同构建XML文档
2
7.1 SAX概述 概述
• 高效地解析XML数据非常重要,尤其是对于那些 要处理大量数据的应用程序,这种技术尤为重要。不 正确的解析会导致过度的内存消耗和过长的处理时间 ,从而有损于可伸缩性。SAX就是其中一种,并以快 速高效解析大量XML文档而著称。
17
7
7.2 SAX应用 应用
• SAX是一种基于事件驱动的API。利用SAX解 析XML文档,涉及到两个部分:解析器和事件处理 器。解析器负责读取XML文档,并向事件处理器发 送事件,如元素开始和元素结束。事件处理器则负 责对事件做出响应,对传递的XML数据进行处理。
8
7.2.1 处理文件开始与结束
13
7.2.6 处理名称空间

在XML文档中,名称空间主要是有效的区分名 字相同的标记。当使用两个标记的名字相同时,它 们可以通过隶属不同的名称空间来相互区分。名称 空间通过声明名称空间来建立,分为有前缀的名称 空间和无前缀的名称空间。
14
7.2.7 处理实体

在XML文档中,利用DTD可以定义实体,然后 与该DTD文件关联的XML文件可以通过实体引用使 用该实体。实体又分为内部实体和外部实体,所谓 内部实体就是实体的内容包含在DTD文件本身中; 而外部实体是指实体的内容是DTD文件以外的其他 文件。
解析XML 第7章 SAX解析 章 解析
通过上一章的学习,我们知道基于DOM的解析 器的核心是在内存中建立和XML文档相对应的树性 树状结构,XML文件的标记、标记中的文本数据、 实体等都会和内存中树状结构的某个节点相对应。 使用DOM解析器的好处是,可以方便的操作内存中 的树的节点来处理XML文档,获取自己所需要的数 据。但DOM解析的不足之处在于,如果XML文件 较大,或者只需要解析XML文档一部分数据,此时 就会占有大量的内存空间。和DOM解析不同的是, SAX解析器不在内存中建立和XML文件相对应的树 状结构数据,SAX解析器的核心是事件处理机制, 具有占有内存少、效率高等特点。 1
3
7.1.1 SAX介绍 介绍
• 用于读取和操作XML文件的标准是文档对象模 型(Document Object Model,DOM)。遗憾的是 ,DOM方法涉及读取整个文件并将该文件存储在一 DOM 个树结构中,而这样可能是低效的、缓慢的,并且 很消耗资源。一种替代技术就是Simple API for XM L,或称为SAX,翻译过来的意思是简易应用程序 编写接口。SAX允许在读取文档时处理它,从而不 必等待整个文档被存储之后才采取操作。
相关文档
最新文档