解析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是以层次结构组织的节点或信息片断的集合.这个层次结构允许 ...
随机推荐
- Careercup 论坛上较有意思的题目整理
# 数据结构类 ### 线段树 segment tree http://www.careercup.com/question?id=5165570324430848 找区间内的value的个数 二维线 ...
- C#高级编程(第8版)
http://spu.jd.com/11328513.html 第1章 .NET体系结构1.1 C#与.NET的关系1.2 公共语言运行库1.2.1 平台无关性1.2.2 提高性能1.2.3 语言的互 ...
- 【转载】div层调整zindex属性无效原因分析及解决方法
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效.在CSS中,只能通过代码改变层级,这个属性就是z-index,要让z-index起作用有个小小前提,就是元素的pos ...
- Bower 手册
安装 Bower 使用 npm 安装 Bower.(Bower 依赖于 Node, npm 和 Git.) $ npm install -g bower 基本用法 安装程序包 程序包安装命令 bowe ...
- 文本框不够长,显示“XXX...”
WPF: How to make the TextBox/TextBlock/Label show "xxx..." if the text content too long? 设 ...
- [IR] Boolean retrieval
How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictionary & Postings code ...
- 初遇sql server
今天初始接触sql server 和mysql的语法有一些不同 sql server中使用[] 或双引号来表示数据库.字段名.表名等,而字符串使用单引号来表示 mysql中数据库名,表名,字段名不需要 ...
- Mysql学习笔记(十)存储过程与函数 + 知识点补充(having与where的区别)
学习内容:存储程序与函数...这一章学的我是云里雾里的... 1.存储过程... Mysql存储过程是从mysql 5.0开始增加的一个新功能.存储过程的优点其实有很多,不过我觉得存储过程最重要的 ...
- mysql update时报错You are using safe update mode
在使用mysql执行update的时候,如果不是用主键当where语句,会报如下错误,使用主键用于where语句中正常. ) Error Code: . You are using safe upda ...
- 连接不上mysqlworkbench问题解决方法
连接mysqlworkbench出现如下提示: 查看ip 加入host的范围 mysql> select user,host from mysql.user;+--------- ...