Android解析xml文件的3种方式

        Android解析XML文件的的方式(其一)

    在android手机中处理XML数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能要使用XML,XML是和平台无关的,被广泛用于数据通信中,那么在android中如何解析XML数据呢?

    通常有三种方式:DOM,SAX,PULL。

DOM方式处理XML数据:

    DOM方式解析XML,是先把XML文档读到内存中去,然后在用DOM API访问树形结构,并获取数据的,但是这样一来,如果XML文件很大呢?手机CPU当然不能和PC机相比,因此处理效率方面就差了很多,当然这是相对于其他处理XML数据而言。

    解析XML文档,当然得有XML文档,下面是一个参考river的例子,放在assets目录下:

  <?xml version="1.0" encoding="utf-8"?> <rivers>   <river name="灵渠" length="605">      <introduction>        灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。      </introduction>       <imageurl>        http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg      </imageurl>    </river>          <river name="胶莱运河" length="200">      <introduction>        胶莱运河南起黄海灵山海口,北抵渤海三山岛,流经现胶南、胶州、平度、高密、昌邑和莱州等,全长200公里,流域面积达5400平方公里,南北贯穿山东半岛,沟通黄渤两海。胶莱运河自平度姚家村东的分水岭南北分流。南流由麻湾口入胶州湾,为南胶莱河,长30公里。北流由海仓口入莱州湾,为北胶莱河,长100余公里。      </introduction>       <imageurl>        http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg      </imageurl>    </river>
<river name="苏北灌溉总渠" length="168">       <introduction>        位于淮河下游江苏省北部,西起洪泽湖边的高良涧,流经洪泽,青浦、淮安,阜宁、射阳,滨海等六县(区),东至扁担港口入海的大型人工河道。全长168km。      </introduction>       <imageurl>        http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg      </imageurl>    </river>  </rivers>

那么如何处理呢?

具体的思路是;

*首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例。

*然后利用DocumentBuilderFactory创建DocumentBuilder对象。

*然后加载XML文档(Document)

*然后获取文档的根节点(Element)

*然后获取根节点中所有子节点的列表(NodeList)

*然后使用再获取子节点列表中需要读取的节点。

当我们观察节点,我们需要一个River对象来保存数据,抽象出River类。

public class River implements Serializable {       private static final long serialVersionUID = 1L;      private String name;     public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getLength() {         return length;     }      public void setLength(int length) {         this.length = length;     }      public String getIntroduction() {         return introduction;     }      public void setIntroduction(String introduction) {         this.introduction = introduction;     }      public String getImageurl() {         return imageurl;     } 
   
    public void setImageurl(String imageurl) {         this.imageurl = imageurl;     }      private int length;      private String introduction;     private String imageurl;  }

下面我们就开始读取XML文档对象,并添加进List。代码如下:

我们这里是使用assets中River.xml文件,那么就需要读取这个XML文件,返回输入流。

读取的方法是:inputStream=this.context.getResources().getAssets().open(fileName);

参数是XML文件的路径。当然默认的是Assets的根目录。

然后可以利用DocumentBuilder对象的parse方法解析输入流,并返回document对象,然后再遍历document对象的节点属性。

//获取全部河流数据     /**       * 参数fileName:为xml文档路径      */      public List<River> getRiversFromXml(String fileName){         List<River> rivers=new ArrayList<River>();         DocumentBuilderFactory factory=null;         DocumentBuilder builder=null;         Document document=null;         InputStream inputStream=null;         //首先找到xml文件          factory=DocumentBuilderFactory.newInstance();         try {              //找到xml,并加载文档              builder=factory.newDocumentBuilder();              inputStream=this.context.getResources().getAssets().open(fileName);             document=builder.parse(inputStream);             //找到根Element               Element root=document.getDocumentElement();              NodeList nodes=root.getElementsByTagName(RIVER);             //遍历根节点所有子节点,rivers 下所有river              River river=null;               for(int i=0;i<nodes.getLength();i++){                      river=new River();                       //获取river元素节点                       Element riverElement=(Element)(nodes.item(i));                      //获取river中name属性值                       river.setName(riverElement.getAttribute(NAME));                       river.setLength(Integer.parseInt(riverElement.getAttribute(LENGTH)));                      //获取river下introduction标签 
   
                     Element introduction=(Element)riverElement.getElementsByTagName(INTRODUCTION).item(0);                       river.setIntroduction(introduction.getFirstChild().getNodeValue());                      Element imageUrl=(Element)riverElement.getElementsByTagName(IMAGEURL).item(0); 
                     river.setImageurl(imageUrl.getFirstChild().getNodeValue());                   rivers.add(river);              }          }catch (IOException e){             e.printStackTrace();         } catch (SAXException e) {             e.printStackTrace();         }           catch (ParserConfigurationException e) {             e.printStackTrace();         }finally{             try {                  inputStream.close();             } catch (IOException e) {                     e.printStackTrace();             }         }          return rivers;     }

在这里添加到List中,然后我们使用ListView来把它们显示出来。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值