Android之XML解析

   对于许多网站和论坛来说,传输数据主要是通过XML形式和JSON形式两种。在下面我对两者进行了对比:

1.       在可读性方面,JSONXML的数据可读性基本相同。JSONXML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式(通过Schema和DTD两种约束形式),很难分出胜负。

2.       在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,在许多JavaEE框架中大都采用XML文件的形式,JSON是不能的。

3.       在编码难度方面,XML有丰富的编码工具(Dom、Sax等)JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

4.       在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

5.       在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

6.       JSONXML同样拥有丰富的解析手段。

7.       JSON相对于XML来讲,数据的体积小。

8.       JSONJavaScript的交互更加方便。

9.       JSON对数据的描述性比XML较差。

10.   JSON的速度要远远快于XML

两种方式难分伯仲,大家可以根据实际业务需要来进行选择。

今天的主要内容是Android的如何解析本地的XML文档,对于拥有过JavaEE编程经验的同学来说,可能会产生固定思维,认为直接在本地磁盘上进行读取,在初学Android的时候我也是这样认为的,毕竟Android借用了Java的API,可是后来发现无法读取到文件内容,到后来才发现,XML文件必须放到Android的程序中,本人常用的方法是在res这个文件夹下面,创建一个raw的子文件夹,将所解析的XML文件拷贝到该文件夹下面。下面是解析代码:

解析代码:

              //获得一个解析工厂
                SAXParserFactory sf = SAXParserFactory.newInstance();
                //通过SaxParser获取一个XMLReader解析器
                XMLReader xr  = sf.newSAXParser().getXMLReader();
                //设置解析所用的Handler对象
                xr.setContentHandler(new MyHandler());
                //获取一个输入流,输入流中包含未被解析的数据
                InputStream is = MainActivity.this.getResources().openRawResource(R.raw.test);
                //将数据进行解析
                xr.parse(new InputSource(is));

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<workers>
   <worker id="0001">
      <name>Mary</name>
      <sex>W</sex>
      <status>K</status>
   </worker>
   <worker id="0002">
      <name>Jack</name>
      <sex>M</sex>
      <status>Q</status>
   </worker>
   <worker id="0003">
      <name>Mars</name>
      <sex>M</sex>
      <status>A</status>
   </worker>
</workers>

Handler类中的代码:

DefaultHandler实现了ContentHandler DTDHandler EntityResolver ErrorHandler类,此处Android采用了Adaptor的设计模式,继承者可以自由选择实现其中的方法,而不必去实现无用的方法

public class MyHandler extends DefaultHandler{
    String tagName;
    String name,sex,status;
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("开始解析文档------------------------------>");
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        tagName = localName;
        //如果标签的名字为Worker的话,循环它的属性
        if(localName.equals("worker")){
            for (int i = 0; i < attributes.getLength(); i++) {
                System.out.println(attributes.getLocalName(i)+":"+attributes.getValue(i));
            }
        }        
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if(tagName.equals("name")){
            name = new String(ch,start,length);
        }else if(tagName.equals("sex")){
            sex = new String(ch,start,length);
        }else if(tagName.equals("status")){
            status = new String(ch,start,length);
        }
    }
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("文档解析结束------------------------>");
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        //代表解析结束,输出解析的值
        if(localName.equals("worker")){
            System.out.println("name------------>"+name);
            System.out.println("sex------------>"+sex);
            System.out.println("status------------>"+status);
        }
    } 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值