一、 前言
用 Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1) org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2) org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3) javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
二、 前提
DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。
三、 使用SAX解析XML文档
SAX是基于事件的简单API,同样的我们也是用一个最简单的例子来看看SAX是如何解析XML的
先来看看我们要解析的XML代码吧
<?xml version="1.0" encoding="gb2312"?>
<books>
<book email="zhoujunhui">
<name addr="address">rjzjh</name>
<price>jjjjjj</price>
</book>
</books>
简单的不能再简单了。但是该有的都有了,根元素、属性、子节点。好了,能反应问题就行了,下面来看看解析这个XML文件的Java代码吧!
1 public class SaxParse {
2 public SaxParse(){
3 SAXParserFactory saxfac=SAXParserFactory.newInstance();
4 try {
5 SAXParser saxparser=saxfac.newSAXParser();
6 InputStream is=new FileInputStream("bin/library.xml");
7 saxparser.parse(is,new MySAXHandler());
8 } catch (ParserConfigurationException e) {
9 e.printStackTrace();
10 } catch (SAXException e) {
11 e.printStackTrace();
12 } catch (FileNotFoundException e) {
13 e.printStackTrace();
14 } catch (IOException e) {
15 e.printStackTrace();
16 }
17 }
18 public static void main(String[] args) {
19 new SaxParse();
20 }
21 }
这段代码比较短,因为SAX是事件驱动的,它的大部分实现在在另一个Java文件中,先别管另一个文件,我们来一个个地分析吧!
(1)得到SAX解析器的工厂实例
3 SAXParserFactory saxfac=SAXParserFactory.newInstance();
这是一个javax.xml.parsers.SAXParserFactory类的实例
(2)从SAX工厂实例中获得SAX解析器
5 SAXParser saxparser=saxfac.newSAXParser();
使用javax.xml.parsers.SAXParserFactory工厂的newSAXParser()方法
(3)把要解析的XML文档转化为输入流,以便DOM解析器解析它
6 InputStream is=new FileInputStream("bin/library.xml");
InputStream是一个接口。
(4)解析XML文档
7 saxparser.parse(is,new MySAXHandler());
后面就不用看了,都是些没用的代码(相对而言),够简单的吧!
注意了,我们新建了一个实例new MySAXHandler()这个实例里面又有什么东西呢?
这个实例就是SAX的精华所在。我们使用SAX解析器时,必须实现内容处理器ContentHandler接口中的一些回调方法,然而我们不须要全部地实现这些方法,还好,我们有org.xml.sax.helpers.DefaultHandler类,看它的类申明:
public class DefaultHandler
implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler
实现了这么多接口啊,其它的先不管了,至少它实现了ContentHandler这一接口。
好了,看看这个类有些什么吧?下面是它的Java代码!
public class MySAXHandler extends DefaultHandler {
boolean hasAttribute=false;
Attributes attributes=null;
/* (非 Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#startDocument()
*/
public void startDocument() throws SAXException {
System.out.println("文档开始打印了");
}
/* (非 Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#endDocument()
*/
public void endDocument() throws SAXException {
System.out.println("文档打印结束了");
}
/* (非 Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("books")){
return;
}
if(qName.equals("book")){
System.out.println(attributes.getQName(0)+attributes.getValue(0));
}
if(attributes.getLength()>0){
this.attributes=attributes;
this.hasAttribute=true;
}
}
/* (非 Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(hasAttribute&&(attributes!=null)){
for(int i=0;i<attributes.getLength();i++){
System.out.println(attributes.getQName(0)+attributes.getValue(0));
}
}
}
/* (非 Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
}
不要看它一大堆,我一一分解给大家看。我们说SAX是基于事件的API,我们这个类实到了ContentHandler接口中的如下方法:
(1)startDocument() 用于处理文档解析开始事件
public void startDocument() throws SAXException {
System.out.println("文档开始打印了");
}
(2)endDocument() 用于处理文档解析结束事件
public void endDocument() throws SAXException {
System.out.println("文档打印结束了");
}
(3)startElement 用于处理元素开始事件
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("books")){
return;
}
if(qName.equals("book")){
System.out.println(attributes.getQName(0)+attributes.getValue(0));
}
if(attributes.getLength()>0){
this.attributes=attributes;
this.hasAttribute=true;
}
}
第二个参数String qName表示这个元素的名字,如:
根节点 <books></books> 它的qName为“books”
最底层节点 <price>jjjjjj</price> 它的qName为“price”
知道这一点上面程序就好解释了,当遇到根元素“books”时就什么也不做跳过,当遇到“book”元素时就打出它的属性(它只有一个属性<book email="zhoujunhui"></book>)。
当是其它节点时(这下只剩下最底层的两个节点“name”和“price”了),就把它的属性取出来存到this.attributes域中,以后中元素结束事件好处理。
(4)endElement 用于处理元素结束事件
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(hasAttribute&&(attributes!=null)){
for(int i=0;i<attributes.getLength();i++){
System.out.println(attributes.getQName(0)+attributes.getValue(0));
}
}
}
代码的作用是如果这个元素的属性不为空(hasAttribute&&(attributes!=null)),就把它们打印出来。
(5)characters(char[] ch, int start, int length) 处理元素字符的内容
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
我们只用了这么几个事件,其它还有其的的一些事件,我们只要看一下ContentHandler这个接口就行了,如:
(6)startPrefixMapping(String prefix,String URI) 处理前缀映射开始事件,参数表示前缀名称和所指向的URI
(7)endPrefixMapping(String prefix,String URI) 处理前缀映射结束事件,参数表示前缀名称和所指向的URI
(8)ignorableWhitespace(Char[] ch,int start,int length) 处理元素中可忽略的空格
(9)processingInstruction(String target,String data) 处理解析中产生的处理指令事件。
相关推荐
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
- `xmlSAXPaserDemo`可能是一个包含示例代码的Android项目,用于演示如何实际使用SAX解析XML文件。 - 项目中可能包括网络请求模块、SAX解析器处理类以及展示解析结果的UI部分。 通过以上步骤,开发者可以在...
使用sax解析xml,有详细的解析及源代码实例
以下是使用SAX解析XML文件的步骤: 1. 引入依赖:在Android项目中,通常需要添加`xmlpull`库,它包含了SAX解析器。可以在`build.gradle`文件中添加依赖: ``` implementation 'xpp3:xpp3:1.1.4c' ``` 2. 创建...
本教程将详细讲解如何在Android中使用SAX解析XML。 首先,要使用SAX解析XML,我们需要理解其工作原理。SAX解析器会逐个读取XML文档的元素,每当遇到文档的开始、结束、文本等事件时,就会触发相应的回调方法。...
使用SAX解析XML文件的基本步骤如下: 1. **导入库**:首先需要导入`org.xml.sax`包下的相关类,如`SAXParserFactory`,`SAXParser`和`DefaultHandler`。 2. **创建解析工厂**:使用`SAXParserFactory.newInstance()`...
下面我们将详细讨论如何在Android中使用SAX解析XML。 首先,我们需要了解SAX解析的基本原理。SAX解析器在读取XML文档时,会触发一系列的事件,如开始文档、开始元素、结束元素、字符数据等。开发者需要定义一个...
### 使用SAX解析XML文件详解 #### 一、XML与SAX简介 XML(Extensible Markup Language,可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言,旨在克服HTML的一些不足,使得数据能够被不同系统间共享...
本实例“JAVA100例之实例69 JAVA使用SAX解析XML”将详细讲解如何利用SAX解析XML文件。SAX解析器通过触发一系列的回调事件来处理XML文档,程序员需要定义一个实现了`org.xml.sax.helpers.DefaultHandler`接口的类,...
本教程将聚焦于如何在Android应用程序中使用SAX解析XML。 一、SAX解析器工作原理 SAX解析器通过读取XML文档,当遇到特定的XML元素、属性或其他结构时,会触发相应的事件,如开始元素、结束元素、字符数据等。开发者...
下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能...
本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...
本教程将详细讲解如何在Android中使用SAX解析XML。 SAX解析器是事件驱动的,它逐行读取XML文档,当遇到特定的元素、属性或事件时,会触发相应的回调函数。这种方式避免了整个XML文档加载到内存中,因此对于大型XML...
本文将详细介绍如何在Android中使用SAX解析XML。 首先,我们需要了解SAX解析的基本流程。SAX解析XML的过程是基于事件的,当解析器读取XML文档时,会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等...
以下是一个使用SAX解析XML文件的基本步骤: 1. **创建解析器**: 首先,我们需要创建一个SAX解析器实例。在Java中,这通常通过`SAXParserFactory`类完成。设置解析器属性,然后调用`newSAXParser()`方法获取`...
总结来说,"saxloadxml"项目提供了使用SAX解析XML文件的一个实例,可以帮助开发者了解如何利用SAX解析器处理XML文档,尤其是在性能和内存使用方面有较高要求的情况下。通过学习和实践这个项目,你可以提升处理XML...
本文将深入探讨如何使用SAX解析XML并获取元素的值或内容。 首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应...
**SAX解析XML的基本原理:** SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而...
使用SAX解析XML"的项目中,你可能会看到以下关键组件: 1. **XML解析器实例化**:首先,你需要创建一个`SAXParserFactory`实例,然后用它来生成`SAXParser`。这一步是配置和初始化解析器的过程。 ```java ...