Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1028763
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: Java

2012-05-28 16:30:00

最近在学习android 的网络编程,其中有一部分很重要的就是如何解析xml文件,android 平台下推荐的解析器是XmlPullParser,官方文档称该解析器是集高效与可维护性的解析器。原文如下:
We recommend XmlPullParser, which is an efficient and maintainable way to parse XML on Android.
下午去官方那里研究了一下它给的教程,发现这个玩意用起来确实挺简单的,对于解析一些简单常用的xml文件,确实帮助很大。下面我就官方的教程来深入浅出一下这个XmlPullParser

   下面,我们尝试者来解析类似与下面的一个xml文件。

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed>
  3.     <entry>
  4.         <title type="text">Where is my data file?</title>
  5.         <link rel="alternate" href="http://stackoverflow.com/questions/9439999/where-is-my-data-file" />
  6.         <summary type="html">
  7.          I have an Application that requires a data file..
  8.         </summary>
  9.     </entry>

  10. </feed>
如上所示:
首先,我们要先初始化一个解析器,parser,然后指定其开始的标签

点击(此处)折叠或打开

  1. public class StackOverflowXmlParser {
  2.     // We don't use namespaces
  3.     private static final String ns = null;
  4.    
  5.     public List parse(InputStream in) throws XmlPullParserException, IOException {
  6.         try {
  7.             XmlPullParser parser = Xml.newPullParser(); //创建一个xml 的解析器
  8.             parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); //指定命名空间
  9.             parser.setInput(in, null); //设置输入的文件流
  10.             parser.nextTag();
  11.             return readFeed(parser); //开始读取xml文件
  12.         } finally {
  13.             in.close();
  14.         }
  15.     }
  16.  ...
  17. }
开始读取xml里面的实体内容,并把他们放入一个list里面

点击(此处)折叠或打开

  1. private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
  2.     List entries = new ArrayList();

  3.     parser.require(XmlPullParser.START_TAG, ns, "feed"); //feed是根标签,只有一个
  4.     while (parser.next() != XmlPullParser.END_TAG) {
  5.         if (parser.getEventType() != XmlPullParser.START_TAG) {
  6.             continue;
  7.         }
  8.         String name = parser.getName();
  9.         // Starts by looking for the entry tag
  10.         if (name.equals("entry")) { //entry 我们定义的实体的信息的开始标签
  11.             entries.add(readEntry(parser));
  12.         } else {
  13.             skip(parser); //对于不敢兴趣的标签,跳过
  14.         }
  15.     }
  16.     return entries;
  17. }
下面就对你感兴趣的标签,分别定义方法去读取他们。
首先定义一个代表xml里面实体的标签的类

点击(此处)折叠或打开

public static class Entry {
   
public final String title;
   
public final String link;
   
public final String summary;

   
private Entry(String title, String summary, String link) {
       
this.title = title;
       
this.summary = summary;
       
this.link = link;
   
}
}
然后定义一个读取这个实体的方法,里面对应了读取各个字标签的方法。

点击(此处)折叠或打开

  1. // Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them off
  2. // to their respective "read" methods for processing. Otherwise, skips the tag.
  3. private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
  4.     parser.require(XmlPullParser.START_TAG, ns, "entry");
  5.     String title = null;
  6.     String summary = null;
  7.     String link = null;
  8.     while (parser.next() != XmlPullParser.END_TAG) {
  9.         if (parser.getEventType() != XmlPullParser.START_TAG) {
  10.             continue;
  11.         }
  12.         String name = parser.getName();
  13.         if (name.equals("title")) {
  14.             title = readTitle(parser);
  15.         } else if (name.equals("summary")) {
  16.             summary = readSummary(parser);
  17.         } else if (name.equals("link")) {
  18.             link = readLink(parser);
  19.         } else {
  20.             skip(parser);
  21.         }
  22.     }
  23.     return new Entry(title, summary, link);
  24. }

  25. // Processes title tags in the feed.
  26. private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException {
  27.     parser.require(XmlPullParser.START_TAG, ns, "title");
  28.     String title = readText(parser);
  29.     parser.require(XmlPullParser.END_TAG, ns, "title");
  30.     return title;
  31. }
  32.   
  33. // Processes link tags in the feed.
  34. private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException {
  35.     String link = "";
  36.     parser.require(XmlPullParser.START_TAG, ns, "link");
  37.     String tag = parser.getName();
  38.     String relType = parser.getAttributeValue(null, "rel");
  39.     if (tag.equals("link")) {
  40.         if (relType.equals("alternate")){
  41.             link = parser.getAttributeValue(null, "href");
  42.             parser.nextTag();
  43.         }
  44.     }
  45.     parser.require(XmlPullParser.END_TAG, ns, "link"); //这里是设置它的结束标签
  46.     return link;
  47. }

  48. // Processes summary tags in the feed.
  49. private String readSummary(XmlPullParser parser) throws IOException, XmlPullParserException {
  50.     parser.require(XmlPullParser.START_TAG, ns, "summary");
  51.     String summary = readText(parser);
  52.     parser.require(XmlPullParser.END_TAG, ns, "summary");
  53.     return summary;
  54. }

  55. // For the tags title and summary, extracts their text values.
  56. private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
  57.     String result = "";
  58.     if (parser.next() == XmlPullParser.TEXT) {
  59.         result = parser.getText(); //读取文本内容
  60.         parser.nextTag();
  61.     }
  62.     return result;
  63. }
  64.   ...
  65. }

跳过你不感到兴趣的标签。

点击(此处)折叠或打开

  1. private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
  2.     if (parser.getEventType() != XmlPullParser.START_TAG) {
  3.         throw new IllegalStateException();
  4.     }
  5.     int depth = 1;
  6.     while (depth != 0) {
  7.         switch (parser.next()) {
  8.         case XmlPullParser.END_TAG:
  9.             depth--;
  10.             break;
  11.         case XmlPullParser.START_TAG:
  12.             depth++;
  13.             break;
  14.         }
  15.     }
  16.  }
注意到,其实用
XmlPullParser解析xml文件的时候,如果文件里面的格式有一点错时,就会发生异常, 但是,用它来解析xml文件,确实轻量级的,也是简单的,容易上手的,很适合手机平台。










阅读(4198) | 评论(0) | 转发(0) |
0

上一篇:Spring fror android

下一篇:android 网络编程

给主人留下些什么吧!~~