- 浏览: 114630 次
- 性别:
- 来自: 成都
文章分类
最新评论
JAVA 解析 XML 通常有两种方式:DOM 和SAX。DOM(文档对象模型)是W3C标准,提供了标准的解析方式,但其解析效率一直不尽如人意,这是因为DOM解析XML文档时,把所有内容一次性的装载入内存,并构建一个驻留在内存中的树状结构(节点数)。如果需要解析的XML文档过大,或者我们只对该文档中的一部分感兴趣,这样就会引起性能问题。
SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。
SAX采用事件处理的方式解析XML文件,通常涉及两个部分:解析器和事件处理器:
——解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
——事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。
SAX采用事件处理的方式解析XML文件,通常涉及两个部分:解析器和事件处理器:
——解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
——事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
package cd.itcast.day3; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxParserDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub saxParse(); } public static void saxParse() { // 得到SAX解析工厂实例 SAXParserFactory spf = SAXParserFactory.newInstance(); try { // 得到SAX解析器 SAXParser sp = spf.newSAXParser(); // 得到XML读取器 // XMLReader xr = sp.getXMLReader(); // 设置XML内容处理器 // xr.setContentHandler(new MyContentHandler()); // xr.parse("D:\\Java\\WorkSpace\\JavaDemo\\src\\cd\\itcast\\day3\\student.xml"); List<Student> list = new ArrayList<Student>(); //直接采用SAX解析器的解析方法,传入一个DefaultHandler实例 sp.parse( "D:\\Java\\WorkSpace\\JavaDemo\\src\\cd\\itcast\\day3\\student.xml", new MyDefaultHander(list)); for (Student stu : list) { System.out.println(stu); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //DefaultHandler实现了ContentHandler的方法,因此可以声明一个类继承DefaultHandler,并覆盖我们需要的方法即可. static class MyDefaultHander extends DefaultHandler { // 通过够咱函数传递给内部的List,接收解析出来的Student内容. private List<Student> stuList = null; // 定义一个标记,获取元素的标签名,根据标签名称做不同的处理. private String tagName = null; //Student实例,每解析出一个student元素,将解析出来的内容设置到stu对象,并添加到list中. private Student stu = null; public MyDefaultHander(List<Student> stuList) { this.stuList = stuList; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("文档开始"); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("文档结束"); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // TODO Auto-generated method stub // System.out.println("元素开始:" + qName); tagName = qName; // 元素一开始,记录标记 if ("student".equals(qName)){ stu = new Student(); stu.setId(Integer.parseInt(atts.getValue("id"))); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub // System.out.println("元素结束:" + qName); tagName = null; // 清空标记 if ("student".equals(qName)){ stuList.add(stu); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub // System.out.println("开始处理字符:" + new String(ch, start, length)); if ("name".equals(tagName)) { stu.setName(new String(ch, start, length)); } else if ("sex".equals(tagName)) { stu.setSex(new String(ch, start, length)); } else if ("age".equals(tagName)) { stu.setAge(Integer.parseInt(new String(ch, start, length))); } } } //采用XMLReader必须要覆盖ContentHandler的方法,不方便. static class MyContentHandler implements ContentHandler { @Override public void setDocumentLocator(Locator locator) { // TODO Auto-generated method stub } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("文档开始"); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("文档结束"); } @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // TODO Auto-generated method stub } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // TODO Auto-generated method stub System.out.println("元素开始:" + qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub System.out.println("元素结束:" + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub System.out.println("开始处理字符:" + new String(ch, start, length)); } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub } @Override public void processingInstruction(String target, String data) throws SAXException { // TODO Auto-generated method stub } @Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub } } }
发表评论
-
java远程调试(转载)
2012-12-29 16:43 897新接手的项目采用的是Maven作为编译管理工具,项目内容则是按 ... -
将秒转换成日期格式的java方法:
2012-12-29 12:01 955package net.blogjava.frankieg ... -
java对世界各个时区(TimeZone)的通用转换处理方法(转载)
2012-12-25 15:24 984在进行国际性软件项目开发的过程中,有时候会碰到一些比较特殊的要 ... -
RandomAccessFile
2012-12-19 22:05 794RandomAccessFile RandomAccessF ... -
java-WEB中的过滤器Filter
2012-09-18 22:58 1471过滤器是一个程序,它先于与之相关的s ... -
java-例子:MVC模式,用jstl和el输出数据到jsp页面.
2012-09-09 23:57 1643例子:利用session完成购物车. domain: pac ... -
java中的el——表达式语言
2012-09-09 23:36 877EL 全名为 Expression Lang ... -
java-下载图片(正则表达式、HttpURLConnection、流、socket综合运用)
2012-08-26 22:22 1284package cn.itcast.httpserver; ... -
java-用HttpURLConnection发送Http请求.
2012-08-26 22:00 724注意:利用URL发送的请求,服务器只返回实体部分,不包括htt ... -
java-模拟tomcat服务器
2012-08-26 21:57 1129模拟tomcat服务器端代码示例:package cd.itc ... -
java-增强for循环示例
2012-08-25 19:14 826package cd.itcast.day1; impo ... -
java-反射示例
2012-08-24 14:13 719package cd.itcast.day1; im ... -
java-可变参数示例
2012-08-24 14:07 541package cd.itcast.day1; pu ... -
java-枚举示例
2012-08-24 14:04 708package cd.itcast.day1; /* ... -
java-注解annotation
2012-08-24 13:54 728package cd.itcast.day2; impo ... -
Java-dom编程:操作xml
2012-08-24 13:47 748package cd.itcast.day3.xmldom; ...
相关推荐
以下是使用SAX解析XML的基本步骤: 1. 创建一个实现DefaultHandler或ContentHandler接口的类,重写其中的方法,如startElement()、endElement()和characters(),用于处理XML文档的结构和数据。 2. 实例化SAX解析器...
标题"读取RSS-SAX解析XML实例(java版)"所涉及的知识点主要集中在两个方面:一是如何读取RSS(Really Simple Syndication)数据,二是使用SAX解析XML文件。 RSS是一种用于发布新闻、博客和其他定期更新内容的格式...
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
以下是一个简单的SAX解析示例: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MySaxHandler extends DefaultHandler { @...
下面是一段示例代码,展示了如何使用SAX解析XML: 1. **创建SAX解析器工厂**:首先需要创建一个SAX解析器工厂实例。 ```java SAXParserFactory factory = SAXParserFactory.newInstance(); ``` 2. **获取...
而SAX解析示例则相对复杂,需要创建事件处理器类: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXExample extends ...
本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...
四、SAX解析XML示例 ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyContentHandler extends DefaultHandler { @...
"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析XML的示例代码。 3. **JDOM**:JDOM是一个Java API,专门用于读写XML文档。它提供了一个更面向Java的对象模型,使得XML处理更加直观。JDOM在DOM的基础上...
下面将详细介绍Java SAX解析XML的相关知识点。 1. **SAX解析原理**: - SAX解析器读取XML文件,遇到每个元素、属性、文本等,都会触发一个相应的事件。 - 应用程序通过实现SAX解析器的回调接口,定义处理这些事件...
在本项目中,"saxloadxml"应该是实现了一个SAX解析XML文件的示例,旨在帮助开发者理解和应用SAX解析。 首先,我们需要理解SAX解析的基本原理。当解析器读取XML文件时,它会触发一系列的事件,如开始文档、结束文档...
在Java中,`org.xml.sax.helpers.DefaultHandler`和`org.xml.sax.XMLReader`类是SAX解析的核心。 3. DOM4J解析: DOM4J是一个开源的Java库,提供了一种灵活且功能强大的API来处理XML、XPath和XSLT。它扩展了DOM模型...
总的来说,SAX解析XML是一种高效且灵活的方法,适用于处理大型XML文档。通过自定义事件处理器,我们可以根据业务需求定制解析逻辑,从而有效地解析和利用XML数据。在实际项目中,结合源码分析和工具使用,如IDE中的...
以下是一个简单的SAX解析超大XML文件的Java示例代码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers....
以下是一个简单的SAX解析XML的Java示例: ```java import org.xml.sax.XMLReader; import org.xml.sax.InputSource; import org.xml.sax.helpers.DefaultHandler; public class SaxDemo { public static void ...
在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,因其结构清晰、...对于初学者来说,这是一个很好的起点,可以结合实际项目需求,灵活运用DOM和SAX解析XML,提升自己的编程能力。
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
2. SAX解析: SAX 是一种基于事件驱动的解析方式,它不会将整个 XML 文档加载到内存。当解析器遇到 XML 文档中的特定事件(如元素开始、结束等)时,会触发回调函数,由用户定义的事件处理器执行相应操作。这种方式...
**SAX解析XML详解** XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和Web服务等领域。SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,以流式处理...
以下是一个简单的SAX解析XML文件的Java代码示例: ```java import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler;...