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

使用SAX解析XML文件

SAX(Simple API for XML),是指一种接口,或者一个软件包。

DOM:文档驱动。DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能很差,是由于DOM的树结构所造成的,此结构占用的内存较多。

SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。

由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。

SAX解析XML步骤
创建XML解析处理器。
②创建SAX解析器。
③将XML解析处理器分配给解析器。
④对文档进行解析,将每个事件发送给处理器。

下面是SAX解析XML文件代码程序,完整代码下载地址:android_sax.rar

MainActivity:

[java] view plain copy
  1. /**
  2. *MainActivity
  3. *
  4. *@authorzuolongsnail
  5. */
  6. publicclassMainActivityextendsActivity{
  7. privateButtonparseBtn;
  8. privateListViewlistView;
  9. privateArrayAdapter<Person>adapter;
  10. privateArrayList<Person>persons;
  11. @Override
  12. voidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. parseBtn=(Button)findViewById(R.id.parse);
  16. listView=(ListView)findViewById(R.id.list);
  17. parseBtn.setonClickListener(newOnClickListener(){
  18. @Override
  19. voidonClick(Viewv){
  20. persons=MainActivity.this.readxml();
  21. adapter=newArrayAdapter<Person>(MainActivity.this,
  22. android.R.layout.simple_expandable_list_item_1,persons);
  23. listView.setAdapter(adapter);
  24. }
  25. });
  26. privateArrayList<Person>readxml(){
  27. InputStreamfile=this.getClass().getClassLoader()
  28. .getResourceAsstream("persons.xml");
  29. //①创建XML解析处理器
  30. SAXXmlContentHandlercontentHandler=newSAXXmlContentHandler();
  31. try{
  32. //创建一个SAXParserFactory
  33. SAXParserFactoryfactory=SAXParserFactory.newInstance();
  34. //②创建SAX解析器
  35. SAXParserparser=factory.newSAXParser();
  36. //③将XML解析处理器分配给解析器
  37. //④对文档进行解析,将每个事件发送给处理器。
  38. parser.parse(file,contentHandler);
  39. file.close();
  40. }catch(Exceptione){
  41. e.printstacktrace();
  42. }
  43. returncontentHandler.getBooks();
  44. }

XML解析处理器:

copy
    *解析XML处理器
  1. *@authorzuolongsnail
  2. *
  3. */
  4. classSAXXmlContentHandlerextendsDefaultHandler{
  5. privateArrayList<Person>persons;
  6. privatePersonperson;
  7. privateStringtagName;
  8. publicArrayList<Person>getBooks(){
  9. returnpersons;
  10. voidstartDocument()throwsSAXException{
  11. this.persons=newArrayList<Person>();
  12. Log.e("SAXXmlContentHandler","开始解析XML文件");
  13. voidstartElement(Stringuri,StringlocalName,StringqName,248)"> Attributesattributes)throwsSAXException{
  14. "读取标签");
  15. this.tagName=localName;
  16. if(this.tagName.equals("person")){
  17. person=newPerson();
  18. person.setId(Integer.parseInt(attributes.getValue(0)));
  19. voidcharacters(char[]ch,intstart,153); font-weight:bold; background-color:inherit">intlength)
  20. "根据tagName获取标签内容");
  21. this.tagName!=null){
  22. Stringdata=newString(ch,start,length);
  23. this.tagName.equals("name")){
  24. this.person.setName(data);
  25. }elsethis.tagName.equals("age")){
  26. this.person.setAge(Integer.parseInt(data));
  27. voidendElement(Stringuri,StringqName)
  28. if(localName.equals("person")){
  29. this.persons.add(person);
  30. this.tagName=null;
  31. }

persons.xml文件

[xhtml] copy
    <?xmlversion="1.0"encoding="UTF-8"?>
  1. <persons>
  2. personid="1">
  3. name>张三</age>24personpersonid="2">李四>25personid="3">王五>26>

Person实体类

copy

    *Person实体类
  1. classPerson{
  2. privateintid;
  3. privateStringname;
  4. intage;
  5. publicPerson(){
  6. publicPerson(intid,Stringname,153); font-weight:bold; background-color:inherit">intage){
  7. this.id=id;
  8. this.name=name;
  9. this.age=age;
  10. intgetId(){
  11. returnid;
  12. voidsetId(intid){
  13. this.id=id;
  14. publicStringgetName(){
  15. returnname;
  16. voidsetName(Stringname){
  17. intgetAge(){
  18. returnage;
  19. voidsetAge(intage){
  20. this.age=age;
  21. publicStringtoString(){
  22. return"姓名:"+this.name+",年龄:"+this.age;
  23. main.xml文件

    copy

    xmlversion="1.0"encoding="utf-8"LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  1. android:orientation="vertical"android:layout_width="fill_parent"
  2. android:layout_height="fill_parent"TextViewandroid:layout_width="fill_parent"
  3. android:layout_height="wrap_content"android:text="@string/hello"/>
  4. Buttonandroid:id="@+id/parse"android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"android:text="SAX解析XML"ListViewandroid:id="@+id/list"android:layout_width="fill_parent"
  6. ListViewLinearLayout 程序运行截图:

    点击解析按钮后为

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