过去,我向您展示了如何使用SAX方法解析XML,以及如何使用XML Pull增强Android XML解析 。 这两种技术都可以工作,但是却很无聊,因为它们被称为“管道代码”。 在本教程中,我将向您展示如何使用Simple框架在Android中执行XML绑定。
XML数据绑定在Java中非常流行,并且有多个允许绑定的框架。 像JAXB和XStream这样的解决方案已经很好地建立并且被大量使用。 但是,这些库占用大量资源,这使它们不适用于移动设备的资源约束世界。 好消息是,有一个新成员即将出现,即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应用程序中使用。 这是文档:
响应示例也可以在此处找到。
首先下载简单版本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元素。 我们还对嵌套元素使用Element和ElementList批注。 请注意,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