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

来源:互联网 发布:平定四方巾 知乎 编辑:程序博客网 时间:2024/05/22 04:36

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

1 0
原创粉丝点击