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