SAX(Simple API for XML),是Java解析XML文件的一种方案,它边读取文件边解析,它是事件驱动型的,简单说就是扫描过程中任何时候遇到某个节点,即触发其相应的处理函数对节点或者内容进行解析处理。使用SAX来解析文件更快、效率更高,方法实现也简单,首先得根据需求实现你自己对文件内容处理的ContentHandler,定义处理的方法方式,然后XML解析器根据这个ContentHandler的规定来解析取得你想要的数据。实现方式如下。
<item>
<title>SAX解析</title>
<content>SAX解析是Java对XML文件进行解析的一种方案</content>
</item>
<item>...</item>
首先实现自己的ContentHandler:
public class MyContentHandler extends DefaultHandler {
public static final String tag = "MyContentHandler";
public String title; //用于存储得到的title
public String content; //用于存储得到的content
public String element; //用于存储标签元素的key
public StringBuffer sb; //用于拼接元素的String值,防止元素值过长导致解析内容丢失的问题
public void startDocument() throws SAXException {
Log.i(tag, "startDocument"); //开始解析文档
}
public void endDocument() throws SAXException {
Log.i(tag, "endDocument"); //文档解析结束
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes attr) throws SAXException { //开始解析元素
if (localName.equals("title"))
{
element = localName;
return;
}
if(localName.equals("content"))
{
element = localName;
return;
}
}
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException { //对应的元素解析结束
Log.i(tag, "endElement:"+localName);
if(localName.equals("title"))
Log.i(tag, "title="+title);
if(localName.equals("content"))
Log.i(tag, "content"+content);
}
public void characters(char[] ch, int start, int length)
throws SAXException { //元素对应value的处理
String s = null;
if (element.equals("title"))
{
s = new String(ch, start, length);
sb.append(s);
title = sb.toString();
}
if (element.equals("content") )
{
s = new String(ch, start, length);
sb.append(s);
content = sb.toString();
}
}
}
在characters()方法里面进行内容处理的时候,如果ch过长,它会再次执行该方法接着读取value,直到取到所有的value,所以可能会多次执行该方法,用StringBuffer进行内容拼接防止丢失。然后结束该元素的解析后对value进行处理即可。然后创建XML解析器,设定ContentHandler,即可开始解析。自己创建方法XMLParser,将ContentHandler作为参数传入就可以了。resultStr是读取的文件内容,parse方法里也可以放文件的URL。
/*
* XML解析器创建
*/
public XMLParser(String resultStr,ContentHandler handler){
try{
//创建一个SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
//为XMLReader设置内容处理器
reader.setContentHandler(handler);
//开始解析文件
reader.parse(new InputSource(new StringReader(resultStr)));
}
catch(Exception e){
e.printStackTrace();
}
}