Sax解析XML文档
SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序。使用SAX的优势在于其解析速度较快,相对于DOM而言占用内存较少。而且SAX在解析文件的过程中得到自己需要的信息后可以随时终止解析,并不一定要等文件全部解析完毕。 Sax API中有四个接口,分别是ContentHandler,DTDHandler,EntityResolver,ErrorHandler。实现可以通过实现着四个接口来实现xml解析,但是在实际中一般都是用DefaultHandler,DefaultHandler类实现了所有以上接口EntityResolver、DTDHandler、ContentHandler、ErrorHandler,并提供了所有方法的空实现。我们在使用SAX时,一般都是继承自DefaultHandler,然后实现需要的方法,而保持其他方法默认实现。 在这里有五个个方法 需要注意 startDocument(),在开始读取xml文档的时候调用、在这里可以进行初始化的一些操作 endDocument (),结束的时候调用 startElement (String uri,String localName,String qName,Attributes attributes),这个方法是在执行读取xml ElementNode的时候会调用。 他的参数的主要 uri 指的是代表命名空间的标识符,当元素没有命名空间或 attributes- 与元素相关的属性,如果没有属性,那么就是空的属性对象。 endElement (String uri,String qName) public void characters (char ch[],int start,int length)参数 ch表示当前督导的textnode字节数组,starrt表示字节开始的位置,length表示textnode的长度。要获取当前textnode可以用String data=new String(ch,start,length); 举个例子:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>newii</name> <age>21</age> </person> <person id="20"> <name>wiwi</name> <age>26</age> </person> </persons>当用sax解析这个xml的时候开始先执行 startDocument 然后会读取到persons这个。就会调用 startElement。root结点一般不会做什么操作,继续往下走 到了person这个结点.一步步往下走。过程如图
其实就是挨着结点进行。 下面我们就具体讲解sax解析的操作. 二.我们通过SAXParserFactory、SAXParser、XMLReader完成,步骤如下 大概流程就是这样,最后再贴上一个关于sax解析xml的代码。 public class SaxXml extends DefaultHandler { private static final String TAG="SAXForHandle"; private List<Person> persons; private String perTag; Person person; public List<Person> getPerson(){ return persons; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub persons=new ArrayList<Person>(); } @Override public void endDocument() throws SAXException { } @Override public void startElement(String uri,Attributes attributes) throws SAXException { // TODO Auto-generated method stub if("person".equals(localName)){ for (int i = 0; i < attributes.getLength(); i++) { Log.i(TAG,"attributeName:"+attributes.getLocalName(i)+"value"+attributes.getValue(i)); person =new Person(); person.setId(Integer.valueOf(attributes.getValue(i))); } } perTag=localName; } @Override public void endElement(String uri,String qName) throws SAXException { if("person".equals(localName)){ persons.add(person); person=null; } perTag=null; } @Override public void characters(char[] ch,int length) throws SAXException { String data=new String(ch,length).trim(); if("name".equals(perTag)){ person.setName(data); }else if("age".equals(perTag)){ person.setAge(new Short(data)); } } }如有错误之处,敬请指正。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |