1.什么是SAX?
SAX,全程Simple API for XML,既是一种接口,也是指一个软件包,作为接口,SAX是事件驱动型XML解析的一个标准接口
2.SAX基本原理
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始于结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束
大多数SAX实现都会产生以下类型的事件:
a.在文档的开始和结束时触发文档处理事件.
b.在文档内每一XML元素接受解析的前后触发元素的事件
c.任何元数据通常都由单独的事件交付
d.在处理文档的DTD或Schema时产生DTD或Schema事件
e.产生的错误事件用来通知主机应用程序解析错误
3.SAX常用接口
4.SAX解析
5.SAX解析xml操作
xml文件的内容如下
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://tempuri.org/">
<ArrayOfHolidayType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="HolidayType">
<HolidayType>
<ID>1</ID>
<Title>事假</Title>
</HolidayType>
<HolidayType>
<ID>2</ID>
<Title>婚假</Title>
</HolidayType>
<HolidayType>
<ID>3</ID>
<Title>年假</Title>
</HolidayType>
<HolidayType>
<ID>4</ID>
<Title>病假</Title>
</HolidayType>
<HolidayType>
<ID>5</ID>
<Title>休假</Title>
</HolidayType>
</ArrayOfHolidayType>
</string>
2.声明一个myContentHandler的匿名内部类
private class myContentHandler extends DefaultHandler
{
private String tagName; //保存当前解析的元素
private HolidayType holidayTypeObj; //每次开始解析一个元素时,实例化HolidayType对象
private ArrayList<HolidayType> HolidayTypeList=new ArrayList<HolidayType>(); //将解析xml后的对象添加到集合中
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String textContent=new String(ch,start,length);
//条件必须这样写呀 否则会出错呀(字符串转换为整形时出错呀)
if(tagName.equals("ID")&&textContent!=null&&!textContent.trim().equals(""))
{
holidayTypeObj.setID(Integer.parseInt(textContent));
}
else if(tagName.equals("Title")&&textContent!=null&&!textContent.trim().equals(""))
{
holidayTypeObj.setTitle(textContent);
}
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if(localName.equals("HolidayType"))
{
HolidayTypeList.add(holidayTypeObj);
}
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
tagName=localName;
if(localName.equals("HolidayType"))
{
holidayTypeObj=new HolidayType();
}
}
}
3.使用上面的myContentHandler类解析xml
try
{
//创建一个SAXParserFactory
SAXParserFactory factory=SAXParserFactory.newInstance();
XMLReader reader=factory.newSAXParser().getXMLReader();
//为XMLReader设置内容处理器
reader.setContentHandler(new myContentHandler());
//开始解析文件
reader.parse(new InputSource(new StringReader(xml)));
for(HolidayType obj:HolidayTypeList)
{
holidayTypes.add(obj.getTitle());
}
}
catch(Exception e)
{
e.printStackTrace();
}