解析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是以层次结构组织的节点或信息片断的集合.这个层次结构允许 ...
随机推荐
- Turtle Online:致力于打造超接地气的PC前端架构,组件+API,快速搭建前端开发
架构创作初衷 每当新开一个项目时,都会绞尽脑汁去考虑采用哪种框架:requirejs/seajs.jquery/zepto.backbone.easeUI/Bootstrap/AngularJS……, ...
- codeforces George and Job
/* 题意:给一个长度为n的序列, 从中选择长度为m的k个区间(任意两个区间不会有公共部分) 使得所选择的区间的和最大! 思路:这是一种很常见的dp dp[i][j] 表示的是前 i 个数选择 j 个 ...
- 如何编写Angular指令
[20140917]Angular:如何编写一个指令 *:first-child { margin-top: 0 !important; } body>*:last-child { margin ...
- Java 集合系列15之 Set架构
前面,我们已经系统的对List和Map进行了学习.接下来,我们开始可以学习Set.相信经过Map的了解之后,学习Set会容易很多.毕竟,Set的实现类都是基于Map来实现的(HashSet是通过Has ...
- 受限玻尔兹曼机(RBM)学习笔记(六)对比散度算法
去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...
- Vim杂记:markdown插件
一.安装插件 从以下地址下载压缩包 github下载:https://github.com/plasticboy/vim-markdown plasticboy下载:http://plasticboy ...
- mysql创建每月执行一次的event
DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ EVENT `dev_sp2p6`.`e_test1` ON SCHEDULEE ...
- 【读书笔记】-【编程语言的实现模式】-【LL(1)递归下降的语法解析器】
形如:[a,b,c] [a,[b,cd],f] 为 嵌套列表 其ANTLR文法表示: list :'[' elements ']'; // 匹配方括号 elements : elements (',' ...
- 使用SignalR构建一个最基本的web聊天室
What is SignalR ASP.NET SignalR is a new library for ASP.NET developers that simplifies the process ...
- Ubuntu搭建Android交叉编译环境
一.下载 Android NDK Android NDK官方下载页:http://developer.android.com/tools/sdk/ndk/index.html如果需要旧版本的,比如10 ...