具有简单框架教程的Android XML绑定

尽管REST最近引起了极大的关注,但XML在Web服务领域仍然很重要。 通过Web服务公开的API是我必须在Android应用程序中处理XML内容的主要原因。 因此,即使过程繁琐,我也需要解析XML文档。

过去,我向您展示了如何使用SAX方法解析XML,以及如何使用XML Pull增强Android XML解析 。 这两种技术都可以工作,但是却很无聊,因为它们被称为“管道代码”。 在本教程中,我将向您展示如何使用Simple框架在Android中执行XML绑定。

XML数据绑定在Java中非常流行,并且有多个允许绑定的框架。 像JAXBXStream这样的解决方案已经很好地建立并且被大量使用。 但是,这些库占用大量资源,这使它们不适用于移动设备的资源约束世界。 好消息是,有一个新成员即将出现,即Simple framework 。 顾名思义,它努力在膨胀的XML世界中带来一些简化。

从官方的简单框架网站:

Simple是用于Java的高性能XML序列化和配置框架。 其目标是提供一个XML框架,该框架能够快速开发XML配置和通信系统。 该框架以最小的工作量和减少的错误帮助开发XML系统。 它提供完整的对象序列化和反序列化,从而维护遇到的每个引用。

非常好。 您可以通过访问文档页面开始使用该框架,并且还应该阅读JAXB与Simple的比较 。 简单可能会改变您在Java应用程序中处理XML的方式,请尝试一下。

最大的问题是Android的JVM是否支持简单。 Android使用Dalvik (针对移动设备进行了优化的专用虚拟机)。 此外,Dalvik将Apache Harmony项目的子集用作其类库的核心。 并非所有Java核心类都受支持。 例如,不包括某些javax.xml。*子软件包。

好吧,简单的CAN可以与Android一起使用。 更具体地说,我设法使用了2.3.2版本 ,该版本可以在Simple的下载页面中找到 。 相应的JAR大小为287KB。 该版本的发行说明中提到:

  • 添加DOM提供程序,以便StAX不是必需的依赖项
  • 进行了修复,以确保将属性默认值正确地应用于类

第一个问题非常重要,因为Android的SDK中未包含StAX API 。 请注意, 最新版本的Simple(v2.3.2之后)也可以使用,并且可以用于我们的目的。

让我们切入正题,看看如何执行绑定。 作为示例,我将使用一个XML文档,该文档作为TMDb API的响应返回,该XML文档将在我构建的示例完整Android应用程序中使用。 这是文档:

电影搜索“变形金刚”和(年份)“ 2007”

响应示例也可以在此处找到。

首先下载简单版本2.3.2,并将其包含在项目的类路径中。 然后快速浏览一下简单框架Javadocs

最重要的是创建我们的模型对象,并将其适当地映射到XML格式的文档。 如果看一下XML文件,我们将看到根元素称为OpenSearchDescription,它包含一个Query元素,一个“ totalResults”元素和许多电影。 这是我们的主模型类的样子:

package com.javacodegeeks.xml.bind.model;

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

@Root
public class OpenSearchDescription {
 
 @Element(name="Query")
 public Query query;
 
 @Element
 public int totalResults;
 
 @ElementList
 public List<Movie> movies;

}

Root注释表示特定类表示根XML元素。 我们还对嵌套元素使用ElementElementList批注。 请注意,Simple可以处理“获取/设置”方法和“公共字段”方法。 在本示例中,我将使用后者。 要注意的一件事是,我们使用名称字段(用于“查询”)来提供相应的XML元素名称。 当XML元素的名称与Java字段的名称不同时,应执行此操作,因为默认情况下,简单将查找与该字段具有相同名称的元素。

现在让我们看一下Query类:

package com.javacodegeeks.xml.bind.model;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;

@Element
public class Query {
 
 @Attribute
 public String searchTerms;
 
}

此类仅包含一个名为“ searchTerms”的属性,因此相关字段将使用Attribute进行注释。

到目前为止很容易。 让我们检查一下Movie类:

package com.javacodegeeks.xml.bind.model;

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;

@Element(name="movie")
public class Movie {
 
 @Element(required=false)
 public String score;
 
 @Element(required=false)
 public String popularity;
 
 @Element(required=false)
 public String name;
 
 @Element(required=false)
 public String id;
 
 @Element(required=false)
 public String biography;
 
 @Element(required=false)
 public String url;
 
 @Element(required=false)
 public String version;
 
 @Element(required=false)
 public String lastModifiedAt;
 
 @ElementList
 public List<Image> images;

}

唯一的新变化是,使用必填字段来声明不需要该字段(可以为null)。 这样做是因为API响应中的某些字段为空。

让我们看一下Image类:

package com.javacodegeeks.xml.bind.model;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;

@Element(name="image")
public class Image {

 @Attribute
 public String type;
 
 @Attribute
 public String url;
 
 @Attribute
 public String size;
 
 @Attribute
 public int width;
 
 @Attribute
 public int height;
 
 @Attribute
 public String id;

}

此类仅包含属性,因此我们会相应地注释字段。

最后一步是读取源XML,并让Simple连接所有类并填充字段。 这是通过使用Persister类完成的,该类提供了Serializer接口的实现。 我们将使用其read方法,该方法从提供的源中读取XML文档的内容,并将其转换为指定类型的对象。 请注意,我们已禁用严格模式。 这是在Android Activity中的外观:

package com.javacodegeeks.xml.bind;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.javacodegeeks.xml.bind.model.OpenSearchDescription;

public class SimpleExampleActivity extends Activity {
    
    private static final String url = 
        "http://dl.dropbox.com/u/7215751/JavaCodeGeeks/AndroidFullAppTutorialPart03/Transformers+2007.xml";
    
    private DefaultHttpClient client = new DefaultHttpClient();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        try {
            
            String xmlData = retrieve(url);
            Serializer serializer = new Persister();        
            
            Reader reader = new StringReader(xmlData);
            OpenSearchDescription osd = 
                serializer.read(OpenSearchDescription.class, reader, false);
            
            Log.d(SimpleExampleActivity.class.getSimpleName(), osd.toString());
            
        } 
        catch (Exception e) {
            Toast.makeText(this, "Error Occured", Toast.LENGTH_LONG).show();
        }
        
    }
    
    public String retrieve(String url) {

        HttpGet getRequest = new HttpGet(url);

        try {

            HttpResponse getResponse = client.execute(getRequest);
            final int statusCode = getResponse.getStatusLine().getStatusCode();

            if (statusCode != HttpStatus.SC_OK) {
                return null;
            }

            HttpEntity getResponseEntity = getResponse.getEntity();

            if (getResponseEntity != null) {
                return EntityUtils.toString(getResponseEntity);
            }

        } 
        catch (IOException e) {
            getRequest.abort();
            Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
        }

        return null;

    }
    
}

这是典型的Android活动 。 我们将XML文档作为Internet资源检索(请查看有关如何使用HTTP API的教程),然后从响应中创建StringReader 。 我们向序列化器提供数据,然后让Simple执行其魔术,并作为完整类返回,并填充所有适当的字段和嵌入式类。 特定的应用程序只会将类字符串表示形式转储到系统日志中,可以在DDMS视图中对其进行监视。

伙计们。 我不再需要手动进行XML解析。 与往常一样,您可以下载为本教程创建的Eclipse项目

快乐的Android编码! 别忘了分享!

相关文章:


翻译自: https://www.javacodegeeks.com/2011/02/android-xml-binding-simple-tutorial.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值