一.基础知识

在前面的学习过程中,我们基本上比较全面的学习了Android平台上读取XML文档的方法,介绍了使用Java SAXAndroid SAXDOMPull等各种方式来读取XML文档内容。

目前为止,我们一直专注于解析已有的XML文档,实际上我们也是需要读XML的情形比较多。但是我们可能也有写XML的需要,应用程序可能需要将 XML 发送到远程服务器,或者需要以XML的形式保存数据等。因此在这部分内容中我们就来学习下Android平台上创建XML的方法。

Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用来解析XMLPull方式解析器XmlPullParser,还提供了一个用于创建XMLXmlSerializerXmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStreamWriter中。XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,startTag开始元素,endTag结束元素,text添加文本等。

下面我们就用上面介绍的创建XML方式来实现把解析出来的USGS地震数据重新保存为一个更简单的XML文件的Demo例子。

二.实例开发

我们要完成的效果图如下图1所示:

1 创建XML

首先解析USGS的地震数据并以ListView的方式显示,然后点击最上方的“Create XML”按钮就会重新把解析获得的地震数据重新创建为一个XML文件。

新建一个Android工程AndroidXMLDemoSerialize

添加进之前Demo工程AndroidXMLDemoSaxII中的EarthquakeEntry.javaAndroidSaxEarthquakeHandler.java文件。如果需要从本地读取xml数据的话,同时在assets文件夹下添加保存为xml格式了的USGS地震数据USGS_Earthquake_1M2_5.xml,如果需要联网读取的话,在manifest.xml文件中添加权限:

<uses-permission android:name="android.permission.INTERNET" />

并修改res/layout下的main.xml为:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/serializeBtn" android:layout_width="fill_parent" android:layout_height="wrap_content" > </Button> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>

接下来就来新建添加一个类SerializeEarthquakeHandler,用来创建XML,内容如下:

public class SerializeEarthquakeHandler { //写Xml数据 public String writeXml(ArrayList<EarthquakeEntry> earthquakeEntryList) { StringWriter xmlWriter = new StringWriter(); try { //创建XmlSerializer,有两种方式 XmlPullParserFactory pullFactory; //方式一:使用工厂类XmlPullParserFactory的方式 pullFactory = XmlPullParserFactory.newInstance(); XmlSerializer xmlSerializer = pullFactory.newSerializer(); //方式二:使用Android提供的实用工具类android.util.Xml // XmlSerializer xmlSerializer = Xml.newSerializer(); xmlSerializer.setOutput(xmlWriter); //开始具体的写xml //<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> xmlSerializer.startDocument("UTF-8", true); //<feed number="25"> xmlSerializer.startTag("", "feed"); xmlSerializer.attribute("", "number", String.valueOf(earthquakeEntryList.size())); for(EarthquakeEntry earthquakeEntry : earthquakeEntryList) { //<entry> xmlSerializer.startTag("", "entry"); //<title>Vanuatu</title> xmlSerializer.startTag("", "title"); xmlSerializer.text(earthquakeEntry.getPlace()); xmlSerializer.endTag("", "title"); //<magnitude>5.3</magnitude> xmlSerializer.startTag("", "magnitude"); xmlSerializer.text(String.valueOf(earthquakeEntry.getMagnitude())); xmlSerializer.endTag("", "magnitude"); //<updated>2010-09-26 06:44:37</updated> xmlSerializer.startTag("", "updated"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(earthquakeEntry.getDate()); xmlSerializer.text(dateString); xmlSerializer.endTag("", "updated"); //<link>http://earthquake.usgs.gov/earthquakes/recenteqsww/Quakes/us2010brar.php</link> xmlSerializer.startTag("", "link"); xmlSerializer.text(earthquakeEntry.getLink()); xmlSerializer.endTag("", "link"); //<latitude>-14.3009</latitude> xmlSerializer.startTag("", "latitude"); xmlSerializer.text(String.valueOf(earthquakeEntry.getLocation().getLatitude())); xmlSerializer.endTag("", "latitude"); //<longitude>167.9491</longitude> xmlSerializer.startTag("", "longitude"); xmlSerializer.text(String.valueOf(earthquakeEntry.getLocation().getLongitude())); xmlSerializer.endTag("", "longitude"); //<elev>-80100.0</elev> xmlSerializer.startTag("", "elev"); xmlSerializer.text(String.valueOf(earthquakeEntry.getElev())); xmlSerializer.endTag("", "elev"); //</entry> xmlSerializer.endTag("", "entry"); } //</feed> xmlSerializer.endTag("", "feed"); xmlSerializer.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return xmlWriter.toString(); } }

在创建XML的方法中

//Xml数据

publicString writeXml(ArrayList<EarthquakeEntry> earthquakeEntryList)

首先创建XmlSerializer

//创建XmlSerializer,有两种方式 XmlPullParserFactory pullFactory; //方式一:使用工厂类XmlPullParserFactory的方式 pullFactory = XmlPullParserFactory.newInstance(); XmlSerializer xmlSerializer = pullFactory.newSerializer(); //方式二:使用Android提供的实用工具类android.util.Xml // XmlSerializer xmlSerializer = Xml.newSerializer();

创建XmlSerializer有两种方式,一种是使用我们介绍的org.xmlpull.v1包中的工厂类XmlPullParserFactory。除了这种方式外,还可以使用Android SDK提供的实用工具包android.util中的类XmlnewSerializer()方法直接创建。

接着为XmlSerializer设置一个输出的Writer

xmlSerializer.setOutput(xmlWriter);

这里将事件推送到了一个 java.io.StringWriter 实例中。

然后就可以使用具体的startDocument开始文档,endDocument结束文档,startTag开始元素,endTag结束元素,text添加文本等方法来创建具体的XML文档内容,具体方法参考上面的代码部分。从代码中我们可以看到,使用XmlSerializer创建XML还是相当直观和方便的。

最后添AndroidXMLDemoSerialize.java文件中的内容为:

public class AndroidXMLDemoSerialize extends Activity { /** Called when the activity is first created. */ //定义显示的List相关变量 ListView list; Button serializeBtn; ArrayAdapter<EarthquakeEntry> adapter; ArrayList<EarthquakeEntry> earthquakeEntryList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //用于创建XML的按钮 serializeBtn = (Button)findViewById(R.id.serializeBtn); serializeBtn.setEnabled(false); //获取地震数据流 InputStream earthquakeStream = readEarthquakeDataFromFile(); //Android Sax方式进行解析 AndroidSaxEarthquakeHandler androidSaxHandler = new AndroidSaxEarthquakeHandler(); earthquakeEntryList = androidSaxHandler.parse(earthquakeStream); //用ListView进行显示 list = (ListView)this.findViewById(R.id.list); adapter = new ArrayAdapter<EarthquakeEntry>(this, android.R.layout.simple_list_item_1, earthquakeEntryList); list.setAdapter(adapter); serializeBtn.setEnabled(true); //点击按钮开始创建XML serializeBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //构造xml SerializeEarthquakeHandler serializeHandler = new SerializeEarthquakeHandler(); String earthquakeXml = serializeHandler.writeXml(earthquakeEntryList); //Log打印写成的xml数据 Log.v("XmlSerialize", earthquakeXml); //把写成的xml数据输出到文件 OutputStream outStream; try { outStream = openFileOutput("earthquake.xml", MODE_PRIVATE); OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream); outStreamWriter.write(earthquakeXml); outStreamWriter.close(); outStream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } private InputStream readEarthquakeDataFromFile() { //从本地获取地震数据 InputStream inStream = null; try { inStream = this.getAssets().open("USGS_Earthquake_1M2_5.xml"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return inStream; } private InputStream readEarthquakeDataFromInternet() { //从网络上获取实时地震数据 URL infoUrl = null; InputStream inStream = null; try { infoUrl = new URL("http://earthquake.usgs.gov/earthquakes/catalogs/1day-M2.5.xml"); URLConnection connection = infoUrl.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection)connection; int responseCode = httpConnection.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK) { inStream = httpConnection.getInputStream(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return inStream; } }

程序前部分是使用Android SAX的方式解析XML文档,然后在按钮的点击回调函数中把解析获得的地震数据重新创建为XML文档的形式,并分别用Log打印和保存为文件。

//点击按钮开始创建XML serializeBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //构造xml SerializeEarthquakeHandler serializeHandler = new SerializeEarthquakeHandler(); String earthquakeXml = serializeHandler.writeXml(earthquakeEntryList); //Log打印写成的xml数据 Log.v("XmlSerialize", earthquakeXml); //把写成的xml数据输出到文件 OutputStream outStream; try { outStream = openFileOutput("earthquake.xml", MODE_PRIVATE); OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream); outStreamWriter.write(earthquakeXml); outStreamWriter.close(); outStream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } });

完成了,可以保存运行看下效果。

当点击屏幕上方的“Create XML”按钮时,程序就会创建一个形式更加简单的XML文档,同时在DDMSLogCat里打印出创建的XML文档内容,如下图2所示:

2 Log打印出的创建的XML文档内容

同时还会把创建的XML以文件的形式保存在系统中,我们可以在DDMSFile Explorerdata/data/com.ichliebephone.xml.serialize/files文件夹下看到,如下图3所示:

3 保存着的创建出来的XML文件

并且我们可以把这个文件导出到电脑上,可以看到里面的内容为:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <feed number="25"> <entry> <title>Vanuatu</title> <magnitude>5.3</magnitude> <updated>2010-09-26 06:44:37</updated> <link>http://earthquake.usgs.gov/earthquakes/recenteqsww/Quakes/us2010brar.php</link> <latitude>-14.3009</latitude> <longitude>167.9491</longitude> <elev>-80100.0</elev> </entry> <entry> <!-- 还有entry条目,省略--> </entry> </feed>

就是我们解析获得的所有地震条目,并且其中的各个元素及其内容、属性等按我们在SerializeEarthquakeHandler中指定的组织方式保存。

三.总结

在这块内容中我们学习了Android平台上创建XML的方法,从以上的Demo例子中我们可以发现Android上不仅解析XML方式多,并且方便,而且创建XML也是很方便直观,好理解和实现的。

到这块为止,我们就学习完了Android平台上和XML相关的内容,包括解析和创建XML等和XML相关的读与写两个方面,有了这些基础,我想处理Android上的XML文档等基本可以轻松应付了,希望以上的学习内容对你也有所帮助,感谢你一直的关注!

注:

参考资料:http://www.ibm.com/developerworks/cn/xml/x-android/

更多相关文章

  1. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  2. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  3. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  4. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  5. Android(安卓)进阶13:几种进程通信方式的对比总结
  6. [最全]Android安卓架构MVC、MVP、MVVM之间的区别和联系(图解+案
  7. android 插件总结
  8. Study on Android【四】--显示控件使用
  9. android apk 防止反编译技术第三篇-加密(转)

随机推荐

  1. Android(安卓)SimpleDateFormat 日期时间
  2. Android(安卓)ButterKnife8.2.1 使用
  3. 数据结构基础知识核心归纳(二)
  4. Android中Toolbar的使用
  5. Android(安卓)X迁移
  6. Android(安卓)NDK: WARNING: APP_PLATFOR
  7. 【转】android 属性动画之 ObjectAnimato
  8. Android(安卓)Sensor 适配层的书写--主要
  9. Android开发中图表的使用
  10. Android(安卓)解决 adapter.notifyDataSe