SAX解析XML文件步骤及问题
2015-08-26 21:25
218 查看
昨天学了两种XML的解析方式,今天自己尝试用SAX解析本地XML,出现好多问题,BUG修正之后,在此总结一下,加深记忆,便于提高。
1)自定义一个处理XML 的Handler(PS:这个自定义类用来解析XML,它的重要性不言而喻,许多BUG的出现,最后发现都是在这个类中一些细节没有处理周到造成的。见黑色粗体标记)
从开始写,到功能正常,这个小程序花我1个小时的时间的时间。其中写代码只花了我20分钟,也就是整个的1/3,而改BUG花费了整整2/3的时间。这件事证明,前期代码coding的重要性。能写出小而确信的代码,对一个程序猿真的很重要。
1)自定义一个处理XML 的Handler(PS:这个自定义类用来解析XML,它的重要性不言而喻,许多BUG的出现,最后发现都是在这个类中一些细节没有处理周到造成的。见黑色粗体标记)
class MyHandler extends DefaultHandler{ private String tagName ; private List<Person> list = new ArrayList<Person>(); private Person p ; public void startDocument() throws SAXException { System.out.println("开始解析文档"); } public void endDocument() throws SAXException { System.out.println("------>文档解析结束了"); } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { **//将当前读到的标签,无论是什标签,都复制给tagName。(ps:在characters()方法中作出判断,过滤不要的标签)** **tagName = qName ;** if(qName.equals("person")) p = new Person() ; } public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("person")) { list.add(p) ; } **tagName = null ; //在结束标签的时候,tagName要设成null,因为程序读到空格,也会调用characters() ;** } public void characters(char[] ch, int start, int length) throws SAXException { String data = new String(ch , start , length); if("name".equals(tagName)){ p.setName(data); }else if("age".equals(tagName)){ p.setAge(Integer.parseInt(data)) ; //如果此处产生NumberFormatException,检查一下endEliment()函数中,tagName是否充塞为null值。 } public List<Person> getList() { return list; } }
2)初始化自定义的Handler对象
MyHandler handler = new MyHandler() ;
3)创建XML解析对象(我这里写的比较简单,中间跳过一步,节省了一个变量的声明):
parser = SAXParserFactory.newInstance().newSAXParser() ;
4)创建一个本地xml文件的输入流
InputStream in = new FileInputStream("******") ;//星星代表文件路径
5)做好以上准备工作后,开始解析
parser.parse(in, handler);
从开始写,到功能正常,这个小程序花我1个小时的时间的时间。其中写代码只花了我20分钟,也就是整个的1/3,而改BUG花费了整整2/3的时间。这件事证明,前期代码coding的重要性。能写出小而确信的代码,对一个程序猿真的很重要。
相关文章推荐
- POJ 1651 Multiplication Puzzle (区间DP)
- IOS零碎知识点
- poj 1321 棋盘问题 dfs
- Magic Number(Levenshtein distance算法)
- 三道题 2015.8.26(二进制中1的个数,数组中出现次数超过一半的数字,最大(小)的K个数)
- poj 3685 Matrix 二分里套二分
- 21 Merge Two Sorted Lists
- cf Div#317 Lengthening Sticks
- C++中虚继承派生类构造函数的正确写法
- xcode快捷键
- 跨域资源共享(CORS)安全性浅析[内有提及OPTIONS请求发起的条件]
- Reduce侧联接
- 折叠Collapse插件
- linux 根据sp和fp查调用栈
- html 利用 frameset 进行简单的框架布局
- PHP的curl带验证码模拟登陆学校的教务系统(验证码已被自动识别,不需要输入)
- 02类型转化 进程空间 数组2015/08/26
- 设计模式之策略模式
- 最新制作 Mac 电脑 U 盘启动盘笔记
- javascirpt对象创建