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

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)