SAX解析xml

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();
        }



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值