XML三种解析方式:

SAX解析:基于事件驱动,事件机制基于回调函数的,得到节点和节点之间内容时也会回调事件

PULL解析:相同基于事件驱动,仅仅只是回调时是常量

DOM解析:是先把XML文件装入内存中。在解析,耗费资源

SAX解析:

student.xml

  1. <?
  2.  
  3. xml version="1.0" encoding="UTF-8"?
  4.  
  5. >
  6.  
  7. -<students>
  8.  
  9. -<student group="1" id="1001">
  10.  
  11. <name>张三</name>
  12.  
  13. <sex>男</sex>
  14.  
  15. <age>30</age>
  16.  
  17. <email>zhangsan@163.com</email>
  18.  
  19. <birthday>1900-09-09</birthday>
  20.  
  21. <memo>组长</memo>
  22.  
  23. </student>
  24.  
  25. -<student group="1" id="1002">
  26.  
  27. <name>lisi</name>
  28.  
  29. <sex>女</sex>
  30.  
  31. <age>23</age>
  32.  
  33. <email>lisi@163.com</email>
  34.  
  35. <birthday>2000-09-09</birthday>
  36.  
  37. <memo>组员</memo>
  38.  
  39. </student>
  40.  
  41. -<student group="1" id="1003">
  42.  
  43. <name>wangwu</name>
  44.  
  45. <sex>男</sex>
  46.  
  47. <age>30</age>
  48.  
  49. <email>wangwu@163.com</email>
  50.  
  51. <birthday>1990-09-09</birthday>
  52.  
  53. <memo>组员</memo>
  54.  
  55. </student>
  56.  
  57. -<student group="2" id="1004">
  58.  
  59. <name>Jack</name>
  60.  
  61. <sex>男</sex>
  62.  
  63. <age>30</age>
  64.  
  65. <email>jack@163.com</email>
  66.  
  67. <birthday>2001-09-09</birthday>
  68.  
  69. <memo>组长</memo>
  70.  
  71. </student>
  72.  
  73. -<student group="2" id="1005">
  74.  
  75. <name>Rose</name>
  76.  
  77. <sex>女</sex>
  78.  
  79. <age>23</age>
  80.  
  81. <email>rose@163.com</email>
  82.  
  83. <birthday>2003-09-09</birthday>
  84.  
  85. <memo>组员</memo>
  86.  
  87. </student>
  88.  
  89. -<student group="3" id="1006">
  90.  
  91. <name>Tom</name>
  92.  
  93. <sex>男</sex>
  94.  
  95. <age>30</age>
  96.  
  97. <email>tom@163.com</email>
  98.  
  99. <birthday>2008-09-09</birthday>
  100.  
  101. <memo>组长</memo>
  102.  
  103. </student>
  104.  
  105. </students>

StudentHandler.java

  1. public class StudentHandler extends DefaultHandler {
  2. // 声明成员变量
  3. private List<Student> studentList; //存放多个学生
  4. private Student student; //存放一个 学生
  5. private String currentTag; //当前标签名字
  6. // 给外部提供List集合的訪问方式
  7. public List<Student> getList() {
  8. return studentList;
  9. }
  10.  
  11. // 重写5个回调方法
  12. @Override
  13. public void startDocument() throws SAXException {
  14. // TODO Auto-generated method stub
  15. super.startDocument();
  16. System.out.println("文档解析開始");
  17.  
  18. }
  19. /**
  20. * String uri:元素的命名空间
  21. * String localName:元素的本地名称
  22. * String qName:标签的名称 book id name
  23. * Attributes attributes: 属性的集合表示
  24. */
  25. @Override
  26. public void startElement(String uri, String localName, String qName,
  27. Attributes attributes) throws SAXException {
  28. super.startElement(uri, localName, qName, attributes);
  29. //currentTag赋值
  30. currentTag=qName;
  31. //推断标签
  32. if("students".equals(qName))
  33. {
  34. studentList=new ArrayList<Student>();
  35. }
  36. if("student".equals(qName))
  37. {
  38. student=new Student();
  39. //推断属性
  40. if(attributes.getLength()>0)
  41. {
  42. //获取属性的值
  43. for (int i = 0; i < attributes.getLength(); i++) {
  44. //获取key
  45. String lname=attributes.getLocalName(i);
  46. //通过推断获取值
  47. if("id".equals(lname))
  48. {
  49. student.setId(Integer.parseInt(attributes.getValue(i))); //获取值
  50. }else if("group".equals(lname))
  51. {
  52. student.setGroup(Integer.parseInt(attributes.getValue(i)));
  53. }
  54. }
  55. }
  56. }
  57.  
  58. }
  59.  
  60. /**
  61. * char[] ch, 将開始与结尾标签之间的值转成char数组的形式
  62. * int start, 数组開始位置
  63. * int length 读取数据的长度
  64. */
  65. @Override
  66. public void characters(char[] ch, int start, int length)
  67. throws SAXException {
  68. super.characters(ch, start, length);
  69. String str=new String(ch,start,length);
  70. if("name".equals(currentTag))
  71. {
  72. student.setName(str);
  73. }else if("sex".equals(currentTag))
  74. {
  75. student.setSex(str);
  76. }else if("age".equals(currentTag))
  77. {
  78. student.setAge(Integer.parseInt(str));
  79. }else if("email".equals(currentTag))
  80. {
  81. student.setEmail(str);
  82. }else if("birthday".equals(currentTag))
  83. {
  84. student.setBirthday(str);
  85. }else if("memo".equals(currentTag))
  86. {
  87. student.setMemo(str);
  88. }
  89. //清空currentTag
  90. currentTag="";
  91. }
  92.  
  93. @Override
  94. public void endElement(String uri, String localName, String qName)
  95. throws SAXException {
  96. super.endElement(uri, localName, qName);
  97. if("student".equals(qName))
  98. {
  99. studentList.add(student);
  100. student=null;
  101. }
  102. }
  103.  
  104. @Override
  105. public void endDocument() throws SAXException {
  106. super.endDocument();
  107. System.out.println("文档解析结束");
  108. }
  109. }

StudentTest.java

  1. public class StudentTest {
  2.  
  3. /*
  4. * @param args
  5. * @throws Exception
  6. */
  7. public static void main(String[] args) throws Exception {
  8. // 1.创建解析工厂类
  9. SAXParserFactory factory = SAXParserFactory.newInstance();
  10. // 2.通过工厂对象创建一个解析器对象
  11. SAXParser parser = factory.newSAXParser();
  12. // 3.创建DefaultHandler的子类对象
  13. StudentHandler handler = new StudentHandler();
  14. parser.parse(new File("C:/1505/day30/xml/student.xml"), handler);
  15. // 4.获取集合的结果
  16. List<Student> list = handler.getList();
  17. // 5.打印
  18. for (Student student : list) {
  19. System.out.println(student);
  20. }
  21.  
  22. }
  23.  
  24. }

打印结果:

PULL解析:

pull解析的第三方的,须要导入jar包才干支持

本次依旧解析上面的student.xml文件

  1. public class PullTest {
  2. public static void main(String[] args) throws Exception {
  3. // 1.创建解析工厂
  4. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  5. // 2.通过解析工厂创建解析器的实例
  6. XmlPullParser parser = factory.newPullParser();
  7. // 3.给解析器设置要解析的数据
  8. parser.setInput(new FileReader("C:/a/student.xml"));
  9. // 4.创建集合对象 用于存储解析完毕之后的存放
  10. List<Map<String, Object>> list = null;
  11. Map<String,Object> map = null;
  12. // 5.获取事件类型
  13. int eventType = parser.getEventType();
  14. // 推断事件类型 不清楚循环次数使用while
  15. while (eventType != XmlPullParser.END_DOCUMENT) {// 不是结尾就開始循环
  16. // 获取当前标签名称
  17. String cuTagString = parser.getName();
  18. switch (eventType) {
  19. case XmlPullParser.START_DOCUMENT:
  20. list = new ArrayList<Map<String,Object>>();
  21. break;
  22.  
  23. case XmlPullParser.START_TAG:
  24. if("student".equals(cuTagString)){
  25. map = new HashMap<String, Object>();
  26. //获取标签的属性值
  27. for(int i=0;i<parser.getAttributeCount();i++){
  28. //获取第i个属性名
  29. String name = parser.getAttributeName(i);
  30. if("group".equals(name)){
  31. map.put("group", parser.getAttributeValue(i));
  32. }else if("id".equals(name)){
  33. map.put("id", parser.getAttributeValue(i));
  34. }
  35. }
  36. }else if("name".equals(cuTagString)){
  37. map.put("name", parser.nextText());
  38. }else if("sex".equals(cuTagString)){
  39. map.put("sex", parser.nextText());
  40. //..........这里不解析了
  41. }
  42. break;
  43. case XmlPullParser.END_TAG:
  44. if("student".equals(cuTagString)){
  45. list.add(map);
  46. }
  47.  
  48. cuTagString="";
  49. break;
  50. default:
  51. break;
  52. }
  53. //获取下一个事件类型,此处忘记将会是一个死循环
  54. eventType=parser.next();
  55. }
  56. for (Map<String, Object> map2 : list) {
  57. System.out.println(map2);
  58. }
  59.  
  60. }
  61. }

打印结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

常常出现PULL本地解析抛出:Exception in thread "main" org.xmlpull.v1.XmlPullParserException: PI must not start with xml (position:unknown 锘?

@1:6 in java.io.FileReader@5e2de80c) 这里设置相应编码就能够。

以上两种都是本地解析,网络解析同理,仅仅要将解析的数据源设置相相应的网络流就能够。

SAX PULL解析实例的更多相关文章

  1. Android 通过Dom, Sax, Pull解析网络xml数据

    这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...

  2. Android系列--DOM、SAX、Pull解析XML

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  3. pull解析和sax解析的差别

    假设在一个XML文档中我们仅仅须要前面一部分数据.可是使用SAX方式或DOM方式会对整个文档进行解析,虽然XML文档中后面的大部分数据我们事实上都不须要解析.因此这样实际上就浪费了处理资源. 使用PU ...

  4. Java sax、dom、pull解析xml

    -------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度 ...

  5. Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件

    一.Pull解析介绍: Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较 ...

  6. 非常简单的XML解析(SAX解析、pull解析)

    这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...

  7. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  8. Android SAX、DOM、Pull解析xml文件剖析与案例讲解

    XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...

  9. 解析XML:DOM,SAX,PULL

    Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...

随机推荐

  1. linux下系统定时任务配置----crontab(mysql定时备份)

    crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任 ...

  2. iOS在Cocoa Touch Static Library使用CocoaPods

    1.在XCode中新建静态库工程:DDLogLib. 2.添加对外暴露接口的头文件DDLogLibHeader.h 3.命令行进入DDLogLib目录,运行pod init,并修改Podfile 4. ...

  3. 实用iPhone Cydia插件

      BadgeClear(角标清除):可以清除App推送所在图标右上角出现的红色角标.在桌面长按图标后,图标开始左右摇动,再双击图标即可清除点击的图标角标.   Bitesms(短信):收费插件,具有 ...

  4. 浅析a标签的4个伪类 .

    关于伪类,大家最熟悉的还是a标签的4个伪类::link        有链接属性时:visited    链接地址已被访问过:active     被用户激活(在鼠标点击与释放之间发生的事件):hov ...

  5. 关于$_SERVER 常量 HTTP_X_FORWARDED_HOST与 HTTP_HOST的问题

    今天在看ecshop的源码,发现了用$_SERVER['HTTP_X_FORWARDED_HOST']来判断主机的地址,就目前来说很多人都是直接通过$_SERVER['HTTP_HOST']来判断的, ...

  6. Python爬虫预备知识

    1.http编程知识 http中client 和server的工作模式 client和server建立可靠的tcp链接(在HTTP1.1中这个链接是长时间的,超时断开策略) client通过socke ...

  7. 周赛C题 LightOJ 1047 (DP)

    C - C Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu   Description Th ...

  8. SCJP_104——题目分析(2)

    3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out ...

  9. split和join和pop和remove用法

    简单字符串分割不需要import re,多字符串分割要导入re,多个字符串分割的分隔符要用 | 分开 >>> msg='chen hang wuhan keji daxue aljl ...

  10. bzoj3576: [Hnoi2014]江南乐

    Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏.    游戏的规则是这样的,首先给定一 ...