关于园子客户端实现的研究二

这篇博文介绍XML数据的解析,接上一篇博文:关于园子客户端实现的研究一

大家都知道实现XML文件解析有三种方式:DOM,SAX,PULL

为了实现学习的目的,都实现一遍,就是这么任性

》创建实体类

public class Blog {
    private String blogId; // id
    private String title; // 标题
    private String published; // 发表时间
    private String updated; // 更新时间
    private String urlPath; // 文章路径
    private String diggs; // 推荐数
    private String views; // 阅读数
    private String comments; // 评论数
    private Author author;//作者
    ...
}
public class Author {
    private String name;    //姓名
    private String uri;        //网址
    private String avatar;    //头像
    ...
}

有了实体就可以开始解析了

1、DOM方式

原理:解析器读入整个文档,将文件分为独立的元素、属性和注释等,然后构造一个驻留内存的树结构,通过节点树访问文档的内容;

优点:DOM在内存中以树形结构存放,因此检索和更新效率会更高。

缺点:对于特别大的文档,解析和加载整个文档将会很耗资源。

public class DomParser {

    public static List<Blog> getBlogs(InputStream is) throws Exception {
    List<Blog> blogs = new ArrayList<Blog>();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    // 创建DON解析器
    DocumentBuilder dombuild = factory.newDocumentBuilder();
    // 开始解析XML文档并且得到整个文档的对象模型
    Document dom = dombuild.parse(is);
    // 得到根节点
    Element root = dom.getDocumentElement();
    // 遍历根节点下所有的子节点
    NodeList nodeList = root.getElementsByTagName("entry");
    for (int i = 0; i < nodeList.getLength(); i++) {
        Blog blog = new Blog();

        Element element = (Element) nodeList.item(i);
        Element id = (Element) element.getElementsByTagName("id").item(0);
        blog.setBlogId(id.getFirstChild().getNodeValue());

        Element title = (Element) element.getElementsByTagName("title").item(0);
        blog.setTitle(title.getFirstChild().getNodeValue());

        Element author = (Element) element.getElementsByTagName("author").item(0);
        Element name = (Element) author.getElementsByTagName("name").item(0);
        Author auth = new Author();
        auth.setName(name.getFirstChild().getNodeValue());
        blog.setAuthor(auth);

        Element link = (Element) element.getElementsByTagName("link").item(0);
        blog.setUrlPath(link.getAttribute("href"));

        blogs.add(blog);
    }
    return blogs;
    }
}

2、SAX方式

原理:简单地说就是对文档进行顺序扫描

优点:SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

缺点:不知道

public class SaxParser extends DefaultHandler {

    private List<Blog> blogs = null;
    private Blog blog = null;
    private Author author = null;
    private String preTag = null;// 作用是记录解析时的上一个节点名称

    public static List<Blog> getBlogs(InputStream xmlStream) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();// 创建SAX解析工厂
    // 创建SAX解析器
    SAXParser parser = factory.newSAXParser();
    SaxParser handler = new SaxParser();
    // 开始解析
    parser.parse(xmlStream, handler);
    // 关闭输入流
    xmlStream.close();
    return handler.getBlogs();
    }

    public List<Blog> getBlogs() {
    return blogs;
    }

    // 遇到文档开始标记的时候的操作
    @Override
    public void startDocument() throws SAXException {
    blogs = new ArrayList<Blog>();
    }

    // 遇到元素节点开始时候的操作
    @Override
    public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    if ("entry".equals(qName)) {
        blog = new Blog();
    } else if ("author".equals(qName)) {
        author = new Author();
    } else if ("link".equals(qName)) {
        if (blog != null) {
        blog.setUrlPath(attributes.getValue(1));
        }
    }
    preTag = qName;// 将正在解析的节点名称赋给preTag
    }

    // 遇到文本节点时的操作
    @Override
    public void characters(char[] ch, int start, int length)
        throws SAXException {
    if (preTag != null) {
        String content = new String(ch, start, length);
        if ("id".equals(preTag)) {
        if (blog != null) {
            blog.setBlogId(content);
        }
        } else if (("title").equals(preTag)) {
        if (blog != null) {
            blog.setTitle(content);
        }
        } else if ("name".equals(preTag)) {
        if (author != null) {
            author.setName(content);
        }
        }
    }
    }

    // 遇到元素节点结束时候的操作
    @Override
    public void endElement(String uri, String localName, String qName)
        throws SAXException {
    if ("entry".equals(qName)) {
        blogs.add(blog);
        blog = null;
    } else if ("author".equals(qName)) {
        blog.setAuthor(author);
        author = null;
    }
    preTag = null;
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

}

3、PULL方式

原理:PULL解析器的运行方式和SAX类似,都是基于事件的模式。

优点:PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。

缺点:不知道

public class PullParser {

    public static List<Blog> getBlogs(InputStream is) throws Exception {
    List<Blog> blogs = null;
    Blog blog = null;
    Author author = null;
    //得到Pull解析器
    XmlPullParser parser = Xml.newPullParser();
    //设置输入流的编码
    parser.setInput(is, "UTF-8");
    //得到第一个事件类型
    int eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
        case XmlPullParser.START_DOCUMENT://如果是文档开始事件
        blogs = new ArrayList<Blog>();
        break;
        case XmlPullParser.START_TAG:// 如果遇到标签开始
        String sName = parser.getName();// 获得解析器当前元素的名称
        if ("entry".equals(sName)) {
            blog = new Blog();
        } else if ("author".equals(sName)) {
            author = new Author();
        } else if ("link".equals(sName)) {
            if (blog != null) {
            blog.setUrlPath(parser.getAttributeValue(1));
            }
        } else if ("id".equals(sName)) {
            if (blog != null) {
            blog.setBlogId(new String(parser.nextText()));
            }
        } else if (("title").equals(sName)) {
            if (blog != null) {
            blog.setTitle(new String(parser.nextText()));
            }
        } else if ("name".equals(sName)) {
            if (author != null) {
            author.setName(new String(parser.nextText()));
            }
        }
        break;
        case XmlPullParser.END_TAG:// 如果遇到标签结束
        String eName = parser.getName();// 获得解析器当前元素的名称
        if ("entry".equals(eName)) {
            blogs.add(blog);
            blog = null;
        } else if ("author".equals(eName)) {
            blog.setAuthor(author);
            author = null;
        }
        break;
        }
        eventType = parser.next();//进入下一个事件处理
    }
    return blogs;
    }
}

4、解析完之后就是展示数据了

listview + adapter组合,这不是个事

===========================================

成功展示,接下来就是修修改改的事了,构思一下界面的设计

时间: 2024-11-04 03:20:45

关于园子客户端实现的研究二的相关文章

关于园子客户端实现的研究四

接着学习研究制作:关于园子客户端实现的研究一 这篇博文不讲技术方面的东西,纯粹的界面学习 1.经过一线码农的辛苦劳作,终于可以看到界面了: >头部是共用的布局,通过include加载到每一个页面 >首页是个GridView控件,充当了大家常用的底部菜单 >“被自己帅醒”是个小动画,网上找的图画 >列表ListView页显示了部分数据,感觉不是很美观 >内容详细页相当凑合,就是一个WebView显示网页链接,适配什么的木有 >博友搜索界面还要优化,显示太简单了 2.从前天

(转载)Fiddler实战深入研究(二)

原文来源于:http://www.cnblogs.com/tugenhua0707/p/4637771.html,作者:涂根华 !个人觉得文章写的特别好,故收藏于此,感谢原作者的分享 Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选项卡断点调式 Fiddler 中的Stave插件 回到顶部 Fiddler不能捕获chrome的session的设置

C++的开源跨平台日志库glog学习研究(二)--宏的使用

上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. 日志输出宏 这里我们以一条最简单的日至输出为例说明: LOG(WARNING) << "This is a warning message"; 这里LOG是一个宏,其定义如下(logging.h line 487): #define LOG(severity) COMPACT

智力题研究二

[IT思想类] 1. 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?(中级) 2. 共有三类药,分别重1g,2g,3g,放到若干个瓶子中,现在能确定每个瓶子中只有其中一种药,且每瓶中的药片足够多,能只称一次就知道各个瓶子中都是盛的哪类药吗? 如果有4类药呢?5类呢?N类呢(N可数)?(高级) 如果是共有m个瓶子盛着n类药呢(m,n为正整数,药的质量各不相同但各种药的质量已知)?你能只称一次就知道每瓶的药是什么吗?

Nginx源码研究二:NGINX的网络IO

NGINX作为服务端的应用程序,在客户端发出数据后,服务端在做着这样一些处理,数据先会经过网卡,网卡会和操作系统做交互,经过操作系统的协议栈处理,再和不同的应用程序交互. 在这里面涉及两个概念,一个是用户态,一个是内核态.应用程序通过系统调用函数进入内核空间,内核运行进行数据准备和数据拷贝等工作.对于NGINX来说,他是作为应用程序和操作系统交互,即是用户态和内核态的之间的交互,NGINX和内核交互方式有很多,例如open(),read() 等都是在和内核交互,而对于网络IO来说,我们知道lin

Windows客户端开发简介(二)

一个典型的Windows客户端程序要有哪几部分构成呢?下面我会以一个国内比较流行的互联网客户端程序的基本架构来跟大家逐步展开分析,由于涉及到知识产权的问题,请大家不要问我是什么产品,当然,如果你能猜到,那我就管不着了^_^. 某视频影音互联网PC客户端产品基本架构 如上只是个粗略的分层架构图,没有更细致的划分,但是有几个地方是需要特别关注的,比如最上层的那几个部分,音视频解码引擎,UI引擎,WebKit浏览器内核,内核通信模块,日志系统. 因为音视频解码引擎和内核通信模块只是对于视频客户端和P2

王爽-汇编语言-综合研究二-使用寄存器

(一) 研究概述 我们为什么必须使用变量?因为我们在编程时必须存储数据.那么如果可以使用别的方法存储数据,我们就可以不必因此目的而使用变量. 用什么方法来存储数据呢?在学习汇编语言是.我们把数据存储在寄存器和内存空间中.那么,在本次试验中,我们研究的是C语言中如何使用寄存器. (二) 研究过程 (1) 编写一个程序url.c 编译链接完成,用debug加载. -u查看如下: 这里的语句比较整齐有逻辑,像是某些功能的实现语句,但是往下-u,几次都看不到所写的语句. 这里,main函数的代码应该是在

mysql高可用研究(二) 主从+MHA+Atlas

关于Atlas的详细介绍请访问:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md 为什么要使用Atlas?应用程序直连数据库不好吗?还要在前面加上一层代理,会不会降低应用的读写性能?会不会增加维护管理的成本?我想这是每个使用atlas之前的疑问. 1.为什么要使用Atlas? 我们使用atlas,主要使用它的读写分离和从库负载均衡功能.因为咱们这读业务远远多于写,故采用读写分离的架构再合适不过了.之前实现读写分离,一般都是通过应

iOS开发网络篇—实现一个视频播放客户端小应用(二)

转自:http://www.cnblogs.com/wendingding/p/3815211.html 一.实现视频播放功能 实现效果: 启动项目后,点击对应的cell,即可播放视频.     代码示例: 主控制器代码如下: 1 // 2 // YYViewController.m 3 // 01-文顶顶客户端 4 // 5 // Created by apple on 14-6-29. 6 // Copyright (c) 2014年 itcase. All rights reserved.