您的位置:首页 > 编程语言 > Java开发

Java中使用SAX方式解析XML的问题

2013-08-12 11:08 459 查看
话说这几天看Mars老师的Android教程,两天就把重制版全部看完了。实在是不过瘾啊。于是就去下了第一版的全部五季,感觉重制版和原先的版本比明显简单,还是老版本的更适合我的口味。但是老版本出了问题很是蛋疼,因为当时还是2.2、2.3时代,而我现在学习时用的是4.2。

4.0以后不能在主线程访问网络,整整憋了我一个下午才发现原来是这么坑爹的原因。还有如搭的Tomcat无法在Android虚拟机中访问,后来发现是127.0.0.1对于模拟器来说是它的localhost,不是电脑的。需要用10.0.2.2才行。

在第一季20课,无论怎么搞,写的xml解析的输出都是空。这回终于不是版本问题,而是Mars老师写错了=_=

Java文档里面说:

The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the
same external entity so that the Locator provides useful information.

Sax类的解析并不保证一次读出所有数据,因而最保险的方法是用StringBuilder缓存一下(不过看了几篇国内的blog都是用tagName赋成空的办法屏蔽第二次解析,个人觉得这不科学)。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

String tagName;
StringBuilder title = new StringBuilder();
StringBuilder artist = new StringBuilder();
StringBuilder country = new StringBuilder();

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);

//!!! 注意,characters并不保证只执行一次就得到数据,所以不能简单的 =
if (tagName.equals("TITLE")) {
title.append(ch, start, length);
} else if (tagName.equals("ARTIST")) {
artist.append(ch, start, length);
} else if (tagName.equals("COUNTRY")) {
country.append(ch, start, length);
}
}

解析完成后清空下

1
2
3
4
5
6
7
8
9
10
11
12
13

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);

//解析完之后会打印出所有得到的数据
if (localName.equals("CD")) {
this.printout();
title.delete(0, title.length());
artist.delete(0, artist.length());
country.delete(0, country.length());
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: