Android开发中获取assets文件夹下Xml文件的问题

来源:互联网 发布:java web开发实战经典 编辑:程序博客网 时间:2024/05/21 21:46


这是我的一个测试类中的部分代码。我在assets文件夹下放了一个xml文件,名称:whitelist.xml

parentcontext就是传入的主activity。

InputStream open = parentcontext.getResources().getAssets().open("whitelist.xml");

XmlResourceParser xlr = parentcontext.getResources().getAssets().openXmlResourceParser("whitelist.xml");

System.out.println("open:"+open);

System.out.println("xlr:"xlr);

这时候一般来说你会以为都会输出地址或者都不输出地址。

但是真实的结果让我们很是惊讶,

输出结果竟然是

open:android.content.res.AssetManager$AssetInputStream@45fc7030

xlr:null

首先肯定排除文件名输错的,否则第一个不会输出地址。

这时候我们就应该想到assets文件夹的特殊之处了,是的,assets文件里面的文件在工程被运行的时候是不会被编译的。

而openXmlResourceParser能打开的是已经编译好的xml文件,所以自然就找不到这个xml文件了。

好了。接着我们来说一说解决方式。

第一种,使用SAXReader

[java] view plaincopy
  1. InputStream in = DBHelper.getDBHelper().getContext().getResources()  
  2.                     .getAssets().open("province.xml");  
  3.             InputStream is = IOHelper.fromInputStreamToInputStreamInCharset(in,"utf-8");  
  4.             SAXReader sr = new SAXReader();// 获取读取xml的对象。  
  5.             Document document = sr.read(is);  
  6.             Element root = document.getRootElement();  

当然,使用这种方法还是比较麻烦的,因为需要引入dom4j的jar包。

第二种,直接使用XmlPullParser

我们查看XmlResourceParser源码的时候,就会发现XmlResourceParser实现了两个接口,AttributeSet和XmlPullParser,而实际上XmlPullParser就是帮助我们去读xml文件的。

当然还是需要获得inputstream流,但是优势就是不用引入jar包而已。

[java] view plaincopy
  1. public void test(InputStream in) {  
  2.         XmlPullParserFactory factory;  
  3.         try {  
  4.             factory = XmlPullParserFactory.newInstance();  
  5.             factory.setNamespaceAware(true);  
  6.             XmlPullParser xpp = factory.newPullParser();  
  7.             xpp.setInput(in, "UTF-8");  
  8.             int evtType = xpp.getEventType();  
  9.             // 一直循环,直到文档结束  
  10.             while (evtType != XmlPullParser.END_DOCUMENT) {  
  11.                 switch (evtType) {  
  12.                 case XmlPullParser.START_TAG:  
  13.                     String tag = xpp.getName();  
  14.                     System.out.println(tag);  
  15.                     break;  
  16.                 case XmlPullParser.END_TAG:  
  17.                     break;  
  18.                 default:  
  19.                     break;  
  20.                 }  
  21.                     //获得下一个节点的信息  
  22.                 evtType = xpp.next();  
  23.             }  
  24.         } catch (Exception e) {  
  25.             // TODO Auto-generated catch block  
  26.             e.printStackTrace();  
  27.         }  
  28.     }  


转:http://blog.csdn.net/rzleilei/article/details/11069587
0 0
原创粉丝点击