微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml文件的sax解析

sax解析xml,采用事件处理方法,它的解析不需要完全加载完文件,可以避免了当xml文件过大时导致内存溢出的情况。sax解析主要包含两部分:解析器与事件处理器。
java api中已经提供了 创建sax解析器的方式。解析器只要解析到xml文档中的一个部分,就会调用事件处理器的某个方法。如下面的person.xml方件,当读到xml的开始,会触发事件处理器的startDocument()方法,当读到<persons>标签时,又会触发事件处理器的startElement()方法事件处理器是由我们来完成的,都过不同的事件,执行不同的方法,就可以完成对xml文件的解析。
[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <persons>
  3. personid="328">
  4. name>zhangsan</age>23personpersonid="303">lisi>22>

如何获取解析器?
1、得到解析工厂。
2、得到解析器。
3、解析xml文件

如何获取事件处理器?
方法1、实现ContentHandler接口,这个方法要实现很多事件处理方法,不是很方便。
方法2、继承DefaultHandler类,查看源码可以看到, DefaultHandler实现了ContentHandler接口,只是对其方法空实现,所以我们只需要重写我们要处理的事件。
常用事件:
1、startDocument() 读到文档开始时触发事件。
2、endDocument() 读到文档结束时触发事件。
3、startElement() 读到标签开始时触发事件。
4、endElement() 读到标签结束时触发事件。
5、characters() 读到文档字符数据时触发事件。哪怕是空白区域,也会触发这个方法

下面看一个例子,将上述person.xml保存项目src目录下,并读取后将内容封装成Person对象。
Person类:
[java] copy
    publicclassPerson{
  1. privateintid;
  2. privateStringname;
  3. intage;
  4. intgetId(){
  5. returnid;
  6. }
  7. voidsetId(intid){
  8. this.id=id;
  9. publicStringgetName(){
  10. returnname;
  11. voidsetName(Stringname){
  12. this.name=name;
  13. intgetAge(){
  14. returnage;
  15. voidsetAge(intage){
  16. this.age=age;
  17. @Override
  18. inthashCode(){
  19. finalintprime=31;
  20. intresult=1;
  21. result=prime*result+age;
  22. result=prime*result+id;
  23. result=prime*result+((name==null)?0:name.hashCode());
  24. returnresult;
  25. booleanequals(Objectobj){
  26. if(this==obj)
  27. returntrue;
  28. if(obj==null)
  29. false;
  30. if(getClass()!=obj.getClass())
  31. Personother=(Person)obj;
  32. if(age!=other.age)
  33. false;
  34. if(id!=other.id)
  35. if(name==null){
  36. if(other.name!= }elseif(!name.equals(other.name))
  37. true;
  38. }
  39. @Override
  40. publicStringtoString(){
  41. return"Person[id="+id+",name="+name+",age="+age+"]";
  42. publicPerson(intid,Stringname,super();
  43. this.id=id;
  44. this.age=age;
  45. publicPerson(){
  46. super();
  47. }

sax解析:
copy
    importjava.io.IOException;
  1. importjava.io.InputStream;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importjavax.xml.parsers.ParserConfigurationException;
  5. importjavax.xml.parsers.SAXParser;
  6. importjavax.xml.parsers.SAXParserFactory;
  7. importorg.xml.sax.Attributes;
  8. importorg.xml.sax.SAXException;
  9. importorg.xml.sax.helpers.DefaultHandler;
  10. classSaxTest{
  11. staticvoidmain(String[]args){
  12. try{
  13. //解析器的获取
  14. //1、获取sax解析工厂
  15. SAXParserFactorysf=SAXParserFactory.newInstance();
  16. //2、获取解析器
  17. SAXParsersp=sf.newSAXParser();
  18. //创建XML文件的输入流
  19. InputStreaminStream=SaxTest.class.getClassLoader()
  20. .getResourceAsstream("person.xml");
  21. //3、解析xml文件,将事件处理器传入。
  22. sp.parse(inStream,newPersonHandler());
  23. }catch(ParserConfigurationException|SAXExceptione){
  24. e.printstacktrace();
  25. catch(IOExceptione){
  26. //事件处理器。
  27. classPersonHandlerextendsDefaultHandler{
  28. privateStringcurrentTag;
  29. privateList<Person>persons=null;
  30. privatePersonperson=null;
  31. //读到文档开始时触发的事件
  32. voidstartDocument()throwsSAXException{
  33. persons=newArrayList<Person>();
  34. //读到文档开始标签时触发的事件
  35. voidstartElement(Stringuri,StringlocalName,StringqName,
  36. Attributesattributes) currentTag=qName;
  37. System.out.println(qName);
  38. if("person".equals(qName)){
  39. person=newPerson();
  40. Stringid=attributes.getValue("id");
  41. person.setId(Integer.parseInt(id));
  42. //读到字符数据时触发的事件。
  43. voidcharacters(char[]ch,153); background-color:inherit; font-weight:bold">intstart,153); background-color:inherit; font-weight:bold">intlength)
  44. throwsSAXException{
  45. //if(currentTag.equals("name")){容易抛空指针异常
  46. if("name".equals(currentTag)){
  47. person.setName(newString(ch,start,length));
  48. if("age".equals(currentTag)){
  49. Stringage= person.setAge(Integer.parseInt(age));
  50. //读到结束标签时触发的事件。
  51. voidendElement(Stringuri,StringqName)
  52. persons.add(person);
  53. person= currentTag=voidendDocument()for(Personp:persons){
  54. System.out.println(p);
  55. }

此处再介绍一下XMLReader的用法
获取解释器之后,我们也可以获取它的XMLReader对象,该对象
  1. 增加查询和设置功能属性的标准方法
  2. 增加了对名称间的支持,这是许多高层的 XML 标准所必需的。
具体方法如下。
[java] view plain copy
  1. //解析器的获取
  2. //1、获取sax解析工厂
  3. SAXParserFactorysf=SAXParserFactory.newInstance();
  4. //2、获取解析器
  5. SAXParsersp=sf.newSAXParser();
  6. //得到读取器
  7. XMLReaderreader=sp.getXMLReader();
  8. //设置读取器的事件处理器对象。
  9. reader.setContentHandler(newPersonHandler());
  10. //开始解析
  11. reader.parse("src/person.xml");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类