您的位置:首页 > 移动开发 > Android开发

Android实战技巧之五十三:dom4j&xstream

2016-06-12 17:49 288 查看
Dom4J和XStream是Java平台上使用较广的XML开源包。

Dom4J的特点就是简单易用,而我选择XStream的原因就是XML转换Java类。

在Android平台上解析XML的手段有三种,DOM、SAX、PULL。但不论哪一种,解析一个XML都要写大篇的代码,

如果稍有改动,连杀人大心都有。

在移动平台上,内存和网络带宽是瓶颈。有些程序是为了追求性能的极致而不则手段,而有些程序繁重的编码是横在程序员面前大阻碍,在我们经历的项目中,使用简单易用的工具去简化繁重的XML和Json解析是当务之急。所以,上述两个工具用在Android平台是个不错的选择。另一个优势,我们大服务器端也是Java开发,前后两端使用相同的工具,对项目还是相当有益的。

版本要求

Dom4J和XStream都是开源项目,在github上均可找到源码,那么根据我们的要求,可以下载相应的版本编译。

XStream比较特殊,高版本为Java8编译,目前Android Studio尚不支持,我这里直接降版本使用,xstream-1.4.7可以平顺运行。

最简单需求

1、将下述xml内容存到一个map中

<access>
<access_token>243656dfjjfxcbb</access_token>
<expires_in>360</expires_in>
</access>


常见场景为解析这种一层的简单的xml,直接用最简单的版本解析出来,而不是像以前我的做法,对应写解析代码。

此时用Dom4J来对应,解析例子如下:

public Map<String, String> parseXml(String file) throws Exception {
Map<String, String> map = new HashMap<String, String>();

SAXReader reader = new SAXReader();
InputStream input = new FileInputStream(file);
Document document = reader.read(input);
Element root = document.getRootElement();

List<Element> elementList = root.elements();

for (Element e : elementList){
Log.d(TAG, "name: " + e.getName() + " text: " + e.getText());
map.put(e.getName(), e.getText());
}

return map;
}


2、将上述xml转成Java类

这个肯定要用XStream啦,例子如下:

private XStream mXStream = null;

public XStreamProcessor() {
mXStream = new XStream(new DomDriver());
}

public void parseXml(String file) throws Exception {
InputStream input = new FileInputStream(file);
mXStream.alias("access", Access.class);
Access access = (Access)mXStream.fromXML(input);
Log.d(TAG, access.toString());
}


个人感觉,这两个库用起来实在是太容易了。在应对复杂xml也许会有些不足,但是就目前我的应用场景来说,简单使用压倒一切。

其余代码

我建了两个类,上面的XStreamProcessor功能就是那么单一,xml文件生成的任务放在了Dom4jProcessor中。

public String buildXML(){
Log.d(TAG,"buildXML");
StringWriter xmlWriter = new StringWriter();
Access access = new Access("243656dfjjfxcbb", "360");

try {
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding("utf-8");

Element element = doc.addElement("access");
element.addAttribute("author", "linc");
element.addAttribute("date", "2016-06-11");
element.addComment("dom4j tester");

Element elementToken = element.addElement("access_token");
elementToken.addText(access.getAccess_token());

Element elementExpire = element.addElement("expires_in");
elementExpire.addText(access.getExpires_in());

OutputFormat outputFormat = new OutputFormat();
outputFormat.setEncoding("utf-8");
outputFormat.setIndent(false);
outputFormat.setNewlines(true);
outputFormat.setTrimText(true);

XMLWriter output = new XMLWriter(xmlWriter, outputFormat);
output.write(doc);
output.close();
} catch (Exception e) {
Log.e(TAG,"build failed: "+e.getMessage());
}
Log.d(TAG,xmlWriter.toString());
try {
saveToSDCard("access",xmlWriter.toString());
} catch (Exception e) {
e.printStackTrace();
}
return xmlWriter.toString();
}

private void saveToSDCard(String filename, String filecontent)throws Exception{
File file = new File(Environment.getExternalStorageDirectory(),filename);
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(filecontent.getBytes());
outStream.close();
}


后记

在程序性能与编码复杂度上,我们会根据实际情况做一个权衡,并不是运行性能压倒一切。

参考:

1、《XStream 读取文件内容转换成JAVA对象》:http://www.ibm.com/developerworks/cn/xml/x-xstream/

2、http://blog.csdn.net/sunboy_2050/article/details/7521605

3、《android 中XML和对象转换利器Xstream的使用》:http://blog.csdn.net/shimiso/article/details/7743639
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dom4j xstream