Android开发 --- SAX解析XML

来源:互联网 发布:知天气全国版 编辑:程序博客网 时间:2024/05/18 01:24

原理:顺序扫描,以事件方式处理文件信息

文档的开始结束、元素的开始结束都会触发事件。

通常 由SAXParserFactory产生SAXParser ----> SAXReader 绑定 事件处理接口

通常使用ContentHandler接口,鉴于里边的事件有的压根就用不到,采用继承org.xml.sax.helpers.DefaultHandler

并重写其中的事件处理方法

事件:

setDocumentLocator(org.xml.sax.Locator arg0);

startDocument() throws org.xml.sax.SAXException;

 endDocument() throws org.xml.sax.SAXException;

startPrefixMapping() throws org.xml.sax.SAXException;

endPrefixMapping()

startElement() 

endElement()

characters() 

ignorableWhitespace()

 processingInstruction()

skippedEntity()

 

解析过程:

1.创建事件处理程序

2.创建SAX解析器

3.将事件处理程序分配给解析器

4.对文档进行解析,将每个事件发送给处理程序

 

实例:

1. xml 文件

<?xml version="1.0" encoding="utf-8"?>

<workers>

<worker id="abc001">

  <name>abc</name>

  <sex>male</sex>

  <age>20</age>

  </worker>

  

  <worker id="abc002">

  <name>bac</name>

  <sex>femal</sex>

  <age>30</age>

  </worker>

  

  <worker id="abc003">

  <name>cba</name>

  <sex>male</sex>

  <age>25</age>

  </worker>

  

  <worker id="abc004">

  <name>bca</name>

  <sex>male</sex>

  <age>18</age>

  </worker>

</workers>

2. 继承DefaultHandler

public class MyContentHandler extends DefaultHandler {

String hisname, sex, age;   

String tagName;

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

if(tagName.equals("name")) {

hisname = new String(ch, start, length);

} else if(tagName.equals("sex")) {

sex = new String(ch, start, length);

} else if(tagName.equals("age")) {

age = new String(ch, start, length);

}

}

@Override

public void endDocument() throws SAXException {

System.out.println("------------ end ----------");

}

@Override   //worker元素结束打印

public void endElement(String uri, String localName, String qName)

throws SAXException {

if (localName.equals("worker")) {

printOut();

}

}

@Override

public void startDocument() throws SAXException {

System.out.println("----------- begin ----------");

}

@Override       //元素开始

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

tagName = localName;

if (localName.equals("worker")) {

for (int i = 0; i < attributes.getLength(); i++) {

System.out.println(attributes.getLocalName(i) + "="

+ attributes.getValue(i));

}

}

}

public void printOut() {

System.out.println("name=" + hisname);

System.out.println("sex=" + sex);

System.out.println("age=" + age);

}

}

 

3.Activity中按钮单击事件解析xml

   class DownloadOnclickeListener implements OnClickListener {

@Override

public void onClick(View v) {

HttpDownLoader hd = new HttpDownLoader();

String tempString = hd.downLoadText("http://cdccn.cn:8080/test/work.xml");

System.out.println(tempString);

try {

SAXParserFactory sf = SAXParserFactory.newInstance();        //获得工厂

XMLReader xmlReader = sf.newSAXParser().getXMLReader(); //获得XMLReader

xmlReader.setContentHandler(new MyContentHandler());            //将reader绑定到自定义的handler

xmlReader.parse(new InputSource(new StringReader(tempString)));  //开始解析   其中 tempString是获取的xml文件

} catch (Exception e) {

e.printStackTrace();

}

}

 }

原创粉丝点击