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开发,前后两端使用相同的工具,对项目还是相当有益的。
XStream比较特殊,高版本为Java8编译,目前Android Studio尚不支持,我这里直接降版本使用,xstream-1.4.7可以平顺运行。
常见场景为解析这种一层的简单的xml,直接用最简单的版本解析出来,而不是像以前我的做法,对应写解析代码。
此时用Dom4J来对应,解析例子如下:
2、将上述xml转成Java类
这个肯定要用XStream啦,例子如下:
个人感觉,这两个库用起来实在是太容易了。在应对复杂xml也许会有些不足,但是就目前我的应用场景来说,简单使用压倒一切。
参考:
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的原因就是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
相关文章推荐
- XStream使用方法总结附实例代码
- 使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题
- java使用dom4j操作xml示例代码
- java基于dom4j包实现对XML解析的方法
- 深入dom4j使用selectSingleNode方法报错分析
- dom4j从jar包中读取xml文件的方法
- java dom4j解析xml用到的几个方法
- java使用xpath和dom4j解析xml
- 在java中使用dom4j解析xml(示例代码)
- XStream解析复杂XML
- xStream 学习笔记 - Java对象与XML相互转换简单示例
- SpringMVC XStream 返回Xml时完美支持List,Map输出
- Dom4j的使用(全而好的文章)
- Java dom4j saxReader解析xml
- dom4j读写xml文件
- 解决dom4j解析xml文件时访问DTD文件问题
- 学习:Dom4j
- dom4j的快速入门——冰云编写
- DOM4J合并多个xml文件到一个Document
- XStream处理既有属性又有值的xml节点