1、获取一个SAXParserFactory的实例。2、通过factory获取SAXParser实例。

 3、新建一个包和继承自DefaultHandler的类。
 因为SAX遍历方式,比如便利一个节点<a></a>是需要startHandler便利起始标签<a>,还需要endHandler便利结束标签</a>。
 
4、将XML文件路径和SAXParserHandler实例对象作为 SAXParser对象 的参数使用。然后运行验证执行初始情况。
 5、在SAXParserHandler类中添加一个访问元素的方法,startElement。
6、所以需要进一步修改,条件过滤:
 不过,以上是已知标签属性名称的情况下使用的,getValue("id")获取属性值。下面是未知标签属性名称以及个数的情况下,怎么访问标签属性名和属性值。
 当我把XML的第一个book节点添加了一个属性和属性值,再运行上面的程序:
 7、解析XML文件的节点名和节点间文本。这里需要endElemet方法打印输出一个节点的访问结束。
然后还要重写一个方法characters方法,这个方法的第一个参数char[ ] ch这个是加载了整个xml的数据字节内容。
这里就直接上代码吧:
  注意这里用了去尾空格的方法,然后判断为空字符。这个方法比较巧妙。
 上代码吧:
  1. package com.goodboy.saxtest;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8.  
  9. import org.xml.sax.SAXException;
  10.  
  11. import com.goodboy.SAXParserHandler.SAXParserHandlerTest;
  12.  
  13. public class SAXTest {
  14.  
  15. public static void main(String[] args) {
  16. SAXParserFactory factory = SAXParserFactory.newInstance();
  17. try {
  18. SAXParser sax = factory.newSAXParser();
  19. //创建一个SAXParserHandler对象
  20. SAXParserHandlerTest handler = new SAXParserHandlerTest();
  21. //作为参数使用
  22. sax.parse("books.xml", handler);
  23. } catch (ParserConfigurationException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. } catch (SAXException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34.  
  35. }

SAXTest(main)

  1. package com.goodboy.SAXParserHandler;
  2.  
  3. import org.xml.sax.Attributes;
  4. import org.xml.sax.SAXException;
  5. import org.xml.sax.helpers.DefaultHandler;
  6.  
  7. public class SAXParserHandlerTest extends DefaultHandler {
  8. @Override
  9. public void startDocument() throws SAXException {
  10. super.startDocument();
  11. System.out.println("解析开始");
  12. }
  13. @Override
  14. public void startElement(String uri, String localName, String qName,
  15. Attributes attributes) throws SAXException {
  16. super.startElement(uri, localName, qName, attributes);
  17. System.out.println("=====开始访问节点"+qName+"=====");
  18. //这里的qName是标签名
  19. if (qName.equals("book") ) {
  20. System.out.println("属性的个数:"+attributes.getLength());
  21. for (int i = 0; i < attributes.getLength(); i++) {
  22. String name = attributes.getQName(i);
  23. System.out.println("属性名:"+name);
  24. String value = attributes.getValue(i);
  25. System.out.println("属性值:"+value);
  26. }
  27. }else if(!qName.equals("book") && !qName.equals("bookstore") ) {
  28. System.out.print("属性名:"+qName);
  29. }
  30. }
  31. @Override
  32. public void endElement(String uri, String localName, String qName)
  33. throws SAXException {
  34. super.endElement(uri, localName, qName);
  35. System.out.println("=====结束访问节点"+qName+"=====");
  36. }
  37. @Override
  38. public void endDocument() throws SAXException {
  39. super.endDocument();
  40. System.out.println("解析结束");
  41. }
  42. @Override
  43. public void characters(char[] ch, int start, int length)
  44. throws SAXException {
  45. super.characters(ch, start, length);
  46. String name = new String(ch, start, length);
  47. if (!name.trim().equals("")) {
  48. System.out.println(" 节点中的内容:"+name);
  49. }
  50. }
  51. }

DefaultHandler对象

 最后  使用SAX解析将XML的内容和结构存入JAVA对象

1、建立一个book类:

 
 后续步骤就制作动态图片了,因为比较繁琐,就直接上代码了:
<理解的要点,就是这里面的重写的中间三个方法(startElement,characters,endElement),他们在解析XML的执行顺序,然后合理的结合这些方法的参数,合理的使用全局变量,将XML转为集合数据>
  1. package com.goodboy.SAXParserHandler;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import org.xml.sax.Attributes;
  6. import org.xml.sax.SAXException;
  7. import org.xml.sax.helpers.DefaultHandler;
  8.  
  9. import com.goodboy.entity.Book;
  10.  
  11. public class SAXParserHandlerTest extends DefaultHandler {
  12. Book book = null;
  13. String value = null;
  14. ArrayList<Book> booklist = new ArrayList<Book>();
  15. public ArrayList<Book> getBooklist() {
  16. return booklist;
  17. }
  18. @Override
  19. public void startDocument() throws SAXException {
  20. super.startDocument();
  21. System.out.println("解析开始");
  22. }
  23. @Override
  24. public void startElement(String uri, String localName, String qName,
  25. Attributes attributes) throws SAXException {
  26. super.startElement(uri, localName, qName, attributes);
  27. System.out.println("=====开始访问节点"+qName+"=====");
  28. //这里的qName是标签名,也是集合的元素名
  29. if (qName.equals("book") ) {
  30. book = new Book();
  31. System.out.println("属性的个数:"+attributes.getLength());
  32. for (int i = 0; i < attributes.getLength(); i++) {
  33. if(attributes.getQName(i).equals("id")){
  34. book.setId(attributes.getValue(i));
  35. System.out.println("book.getId:"+book.getId());
  36. }
  37. }
  38. }else if(!qName.equals("book") && !qName.equals("bookstore") ) {
  39. System.out.print("属性名:"+qName);
  40. }
  41. }
  42. @Override
  43. public void characters(char[] ch, int start, int length)
  44. throws SAXException {
  45. super.characters(ch, start, length);
  46. String name = new String(ch, start, length);
  47. if (!name.trim().equals("")) {
  48. System.out.println(" 节点中的内容:"+name);
  49. value = name;
  50. }
  51. }
  52. @Override
  53. public void endElement(String uri, String localName, String qName)
  54. throws SAXException {
  55. super.endElement(uri, localName, qName);
  56. System.out.println("=====结束访问节点"+qName+"=====");
  57. if (qName.equals("name")) {
  58. book.setName(value);
  59. }
  60. if (qName.equals("author")) {
  61. book.setAuthor(value);
  62. }
  63. if (qName.equals("year")) {
  64. book.setYear(value);
  65. }
  66. if (qName.equals("prive")) {
  67. book.setPrice(value);
  68. }
  69. if (qName.equals("language")) {
  70. book.setLanguage(value);
  71. }
  72. if (qName.equals("book")) {
  73. booklist.add(book);
  74. book = null;
  75. }
  76. value = null;
  77. }
  78. @Override
  79. public void endDocument() throws SAXException {
  80. super.endDocument();
  81. System.out.println("book集合的长度"+booklist.size());
  82. System.out.println(booklist.get(0).getName());
  83. System.out.println("解析结束");
  84. }
  85. }
 
 
 
 
 
 
 

Java眼中的XML--文件读取--2 应用SAX方式解析XML的更多相关文章

  1. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  2. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  4. Java&Xml教程(五)使用SAX方式解析XML文件

    Java SAX解析机制为我们提供了一系列的API来处理XML文件,SAX解析和DOM解析方式不太一样,它并不是將XML文件内容一次性全部加载,而是连续的部分加载. javax.xml.parsers ...

  5. Android程序解析XML文件的方法及使用PULL解析XML案例

    一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...

  6. 网络相关系列之四:数据解析之SAX方式解析XML数据

    一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...

  7. 用JAXP的SAX方式解析XML文件

    简单用JAXP的SAX方式(事件驱动)解析XML文件: 文件(1.XML) <?xml version="1.0" encoding="UTF-8" st ...

  8. SAX方式解析XML文件实例

    books.XML文件: 书籍book.java实体类: public class Book { private String id; private String name; private Str ...

  9. SAX方式解析XML

    sax解析分为以下几步: 1 获取一个saxparserfactory 2 获取一个解析器 3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类,这个实现类里 ...

随机推荐

  1. Android 简单计算器源码....

    PS:今天算是闲着没事做了一个小型的计算器...顺便熟悉一下Android的布局,组件,以及时间监听的方法...就当是做了一个小小的练习吧...     顺便去对比了一下别人写的代码...有的使用到了 ...

  2. Android学习笔记(第二篇)View中的五大布局

    PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Act ...

  3. 探秘空值位图掩码(NULL bitmap mask)

    这篇文章我想谈下空值位图掩码(NULL bitmap mask) ,并揭开它的神秘面纱.空值位图掩码是在存储引擎层为列是否存储NULL值进行编码.它是一个简单的位图掩码,如果值是1的话,表示这列有NU ...

  4. SystemTap了解

    SystemTrap是监控和跟踪运行中的Linux内核操作的动态方法. http://www.ibm.com/developerworks/cn/linux/l-systemtap/ 使用System ...

  5. 一些有用的UtilityExtend小方法

    public static bool StartBy(this string thisValue, params string[] startBy) { foreach (string item in ...

  6. 四、Handler(WSGIHandler)

    1.1       类视图关系 Handler主要负责处理HTTP请求,并生成相应的相应,process_request,process_response是两个最主要的成员.下图是WSGIHandle ...

  7. Mysql中的各种timeout

    在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?那么这些Timeout之后,到底是代码问题,还是不为人知的匠心独具?本期Out-man,讲述咱们MySQL DBA自己的Ti ...

  8. WinForm公共控件

    公共控件:1.Button:按钮 用户点击时触发事件 行为属性 Enabled -是否启用 Visible -是否隐藏2.CheckBox .CheckListBox - 复选框 复选框组 3.Com ...

  9. 2016C#模拟谷歌Google登陆Gmail&Youtube小案例

    之所以写这个,是因为本来想写一个Youtube刷评论的工具,把登录做出来了,后面就没继续做下去. 涉及到基本的HttpWatch的应用以及Fiddler的应用(Fd主要用来排查问题,通过对比 浏览器和 ...

  10. Dev TreeList设置焦点失败解决方法

    问题描述 对TreeList初始化之后,设置treelist的焦点节点时,发现每次初始化控件的时不能正确的绑定焦点节点,第二次点开treelist的时候才会正常的设置目标节点为焦点节点. 截图 解决方 ...