解析XML的几种方法之SAX解析
假期总结不能停,坚持坚持。。。。接下来总结一下XMl和json的解析和生成。。
解析XML的四种方法,即:DOM、SAX、JDOM和DOM4J
下面首先给出这四种方法的jar包下载地址:
DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里
SAX:http://sourceforge.net/projects/sax/
JDOM:http://jdom.org/downloads/index.html
DOM4J:http://sourceforge.net/projects/dom4j/
现编开始一一介绍:
SAX:也是我第一个学的方法。。。
SAX是一种解析速度快并且占用内存少的XML解析器,非常适用于Android的移动设备。
SAX采用事件驱动`,也就是说,它并不是需要解析完整的文档,在按内容顺序解析文档的过程中,Sax会判断当前读到的字符是否符合XMl语法的某部分,如果符合就会触发事件。
所谓事件,其实就是一些回掉方法,这些事件定义在GefaultHandler中。
解析过程:
(1)创建SAX解析器
SAXParserFactory factory=SAXParserFactory.newInstance();
//reader对象,从解析器得到reader
XMLReader reader = factory.newSAXParser().getXMLReader();
(2)实现解析DefaultHandler
主要实现其中的4个方法:
Void startDocument(), void endDocument(), void startElement(String uri,String localName,string qName,Attributes attr).
Void endElement(String uri,String localName,string qName)
android示例代码:
package com.example.xmltest;
import java.text.AttributedCharacterIterator.Attribute;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; //缺省实现所有处理器接口的帮助类DefaultHandler
public class MyContentHandler extends DefaultHandler{ String hisname,address,money,sex,status;
String tagName;
/**
* @param args
*/
public void startDocument() throws SAXException{
System.out.println("、、、、begin、、、、");
} public void endDocument() throws SAXException{
System.out.println("、、、、end、、、、");
}
//QName(Qualified Name 限定?指定?名称)
//sina:blog就是QName,相当于前缀+":"+LocalName,LocalName是blog。
//Attributes得到标签的属性,一个标签可以有多个属性<worker id="AD002">中id就是属性
public void startElement(String namespaceURI, String localName
,String qName, Attributes attr) throws SAXException{
tagName = localName;
System.out.println("tagName:"+tagName);
//localName 属性返回被选元素的本地名称(元素名称)。
//如果选定的节点不是元素或属性,则该属性返回 NULL
if(localName.equals("worker")){
//获取标签的全部属性
for(int i = 0;i < attr.getLength();i++){
System.out.println(attr.getLocalName(i)+"="+attr.getValue(i));
}
//getLocalName(i)得到是id getValue(i)得到的是后边的值
}
}
//namespaceURI命名空间,得到当前正在解析的标签的命名空间,用于区分标签;localname不带前缀,qname带前缀
public void endElement(String namespaceURI, String localName,String qName)
throws SAXException{
//获取标签的全部属性
if(localName.equals("worker")){
this.printout(); //全部输出
}
tagName="";
}
//得到值,tagName在startElement中已经是标签名啦。。。
public void characters(char[] ch,int start,int length)throws SAXException{
if(tagName.equals("name"))
hisname = new String(ch,start,length).trim();
else if(tagName.equals("sex"))
sex = new String(ch,start,length).trim();
else if(tagName.equals("status"))
status = new String(ch,start,length).trim();
else if(tagName.equals("address"))
address = new String(ch,start,length).trim();
else if(tagName.equals("money")){
money = new String(ch,start,length).trim();
}
}
private void printout(){
System.out.print("name: ");
System.out.println(hisname);
System.out.print("sex: ");
System.out.println(sex);
System.out.println("cdv");
System.out.print("status: ");
System.out.println(status);
System.out.print("address: ");
System.out.println(address);
System.out.print("money: ");
System.out.println(money);
System.out.println();
}
}
下边是Activity的代码:
package com.example.xmltest; import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import com.example.utils.HttpDownloader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; //对应的文件在D:\tomcat-6.0.43\webapps\voal
public class XMLActivity extends Activity {
private Button parsebutton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xml);
parsebutton = (Button)findViewById(R.id.parsebutton);
parsebutton.setOnClickListener(new ParseButtonListener());
}
/**
* 住线程中不能申请网络服务!!!!另起线程
* @author 超超boy
*/
class ParseButtonListener implements OnClickListener{ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("启动线程");
new Thread(new Down()).start();
}
}
class Down implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub
HttpDownloader hd = new HttpDownloader();
//resultStr返回的是文件内容
String resultStr = hd.download("http://192.168.253.1:8088/voal/test.xml");
//这个是自己搭建的服务器中的文件 System.out.println(resultStr);
try{
//创建一个SAXParserFactory解析器工程
SAXParserFactory factory = SAXParserFactory.newInstance();
//reader对象,从解析器得到reader
XMLReader reader = factory.newSAXParser().getXMLReader();
//为xmlreader设置内容处理器,逐行扫描,调用函数,要调用的函数就在MyContentHandler实现类中
reader.setContentHandler(new MyContentHandler());
//开始解析文件
System.out.println("开始解析");
reader.parse(new InputSource(new StringReader(resultStr)));
}catch(Exception e){
e.printStackTrace();
}
}
}
}
解析的原文件:
<?xml version="1.0" encoding="UTF-8"?>
<workers>
<worker id="AQ01">
<name>Jery</name>
<sex>女</sex>
<status>经理</status>
<address>北京</address>
<money>4000</money>
</worker>
<worker id="AD02">
<name>Lili</name>
<sex>女</sex>
<status>总监</status>
<address>青岛</address>
<money>40000</money>
</worker>
<worker id="AD03">
<name>ChaoCaho</name>
<sex>男</sex>
<status>董事长</status>
<address>青岛</address>
<money>400000</money>
</worker>
</workers>
转载请注明出处:http://www.cnblogs.com/jycboy/p/saxparxml.html
解析XML的几种方法之SAX解析的更多相关文章
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- 【Java】详解Java解析XML的四种方法
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...
- Java解析XML的四种方法详解 - 转载
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...
- XML解析的二种方法之Sax解析
package com.huawei.xml; import java.io.InputStream;import java.util.Stack; import javax.xml.parsers. ...
- Java 解析XML的几种方法
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已. 基本的解析方式 ...
- php 解析xml 的四种方法(转)
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- php 解析xml 的四种方法
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- java解析XML文件四种方法之引入源文件
1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Documen ...
- 解析xml的4种方法详解
1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许 ...
随机推荐
- JavaScript备忘录(3)——正则表达式
正则表达式是用来进行字符串匹配的. 定义正则表达式有两种方法:/wor/或者new RegExp("wor"). 使用方法 在JS中,使用正则表达式的方法有: 字符串的search ...
- 在server 2008/2003中 取消对网站的安全检查/去除添加信任网站
新安装好Windows Server 2003操作系统后,打开浏览器来查询网上信息时,发现IE总是“不厌其烦”地提示我们,是否需要将当前访问的网站添加到自己信任的站点中去:要是不信任的话,就无 ...
- [转]VS2005/2008过期之后简单实用的升级方法
网络上有不少key,但是用了之后没效果,发现了一个好方法可以解决. 把\vs\setup\下面的 setup.sdb文件用文本编辑器打开,然后改动其最后的一行([Product Key] 下面的一行 ...
- Lua和C语言的交互——C API
Lua可作为扩展性语言(Lua可以作为程序库用来扩展应用的功能),同时也是个可扩展的语言(Lua程序中可以注册由其他语言实现的函数). C和Lua交互的部分称为C API.C API是一个C代码与Lu ...
- Appium移动自动化测试(三)--安装Android模拟器
当Android SDK安装完成之后,并不意味着已经装好了安装模拟器.Android系统有多个版本,所以我们需要选择一个版本进行安装. 第三节 安装Android 模拟器 我这里以Android 4 ...
- 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层
web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...
- Java魔法堂:打包知识点之jar
一.前言 通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所以一起来CLI吧! 二.JAR包 JAR包是基于ZIP文件格式,用于将多个.java文件和各种资源文件, ...
- Python 3.x自定义迭代器对象
Python 3.x与Python 2.x之间存在着较多的语法细节差异.今天在看Python核心编程的时候,说到了自定义迭代器对象.于是动手将源码打了一遍,原书代码如下: class AnyIter( ...
- Diy页面服务端渲染解决方案
1. 问题由来 在移动互联网电商领域,运营每天需要搭建多个促销页面来吸引用户去点击去购买,一开始程序员临时写个新页面去实现,可这些页面可以用几次就不用了,每次创建新页面去实现费时费力,而且,电商的运营 ...
- 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他
[源码下载] 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cooki ...