新的 SAX 解析代码并未使用 SAX 处理程序,而是使用了 SDK 中的 android.sax 包中的类。这些类允许您构建 XML 文档的结构,并根据需要添加事件监听程序。在以上代码中,您声明文档将有一个 de >rssde > 根元素,并且它有一个 de >channelde > 子元素。然后,您声明 de >channelde > 将有一个 de >ITEMde > 子元素,并且开始添加监听程序。对于每个监听程序,您都使用了一个实现了特定接口(de >EndElementListnerde > 或 de >EndTextElementListenerde >)的匿名内部类。注意,您不需要跟踪字符数据。不仅仅因为这样会更加简单,更重要的是更加高效。***,在调用 Xml.parse 实用方法时,您将传递一个通过根元素生成的处理程序。
所有代码都是可选的。如果您习惯 Java 环境中的标准 SAX 解析代码,那么您可以坚持使用它。如果您希望尝试 android sdk 所提供的便捷的包装器,那么也可以使用它。如果您完全不希望使用 SAX 会怎样呢?可以使用一些备选方案。其中的***方法就是 DOM。
Android 完全支持 DOM 解析,就像在桌面机器或服务器上使用 Java 代码运行它一样。显示了一个基于 DOM 的解析器接口实现。
基于 DOM 的提要解析器实现
java代码:
- public class DomFeedParser extends BaseFeedParser {
- protected DomFeedParser(String feedUrl) {
- super(feedUrl);
- }
- public List< Message > parse() {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- List< Message > messages = new ArrayList< Message >();
- try {
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document dom = builder.parse(this.getInputStream());
- Element root = dom.getDocumentElement();
- NodeList items = root.getElementsByTagName(ITEM);
- for (int i=0;i< items.getLength();i++){
- Message message = new Message();
- Node item = items.item(i);
- NodeList properties = item.getChildNodes();
- for (int j=0;j< properties.getLength();j++){
- Node property = properties.item(j);
- String name = property.getNodeName();
- if (name.equalsIgnoreCase(TITLE)){
- message.setTitle(property.getFirstChild().getNodeValue());
- } else if (name.equalsIgnoreCase(LINK)){
- message.setLink(property.getFirstChild().getNodeValue());
- } else if (name.equalsIgnoreCase(DESCRIPTION)){
- StringBuilder text = new StringBuilder();
- NodeList chars = property.getChildNodes();
- for (int k=0;k< chars.getLength();k++){
- text.append(chars.item(k).getNodeValue());
- }
- message.setDescription(text.toString());
- } else if (name.equalsIgnoreCase(PUB_DATE)){
- message.setDate(property.getFirstChild().getNodeValue());
- }
- }
- messages.add(message);
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- return messages;
- }
- }