您的位置:首页 > 其它

SAX解析XML文件步骤及问题

2015-08-26 21:25 218 查看
昨天学了两种XML的解析方式,今天自己尝试用SAX解析本地XML,出现好多问题,BUG修正之后,在此总结一下,加深记忆,便于提高。

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的重要性。能写出小而确信的代码,对一个程序猿真的很重要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: