Android提高之XML解析与生成实例详解
GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
【 如果你想靠AI翻身,你先需要一个靠谱的工具! 】
本文实例讲述了使用SAX来解析XML。通常来说在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX是基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。
本文要解析的test.xml文件如下:
1 2 3 4 5 6 7 8 | <? xml version = "1.0" encoding = "utf-8" ?> < test > < title >testSAX</ title > < content aa = "1" bb = "2" > < name >hellogv</ name > < url >http://blog.csdn.net/hellogv</ url > </ content > </ test > |
解析如上XML的结果如下图所示:
使用SAX解析,需要定义SAXParserFactory(使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档),SAXParser(从各种输入源解析 XML),XMLReader(使用回调函数读取 XML 文档),其中XMLReader是个关键。XMLReader可以为解析XML定义各种回调函数,“条件符合”的时候触发这些回调函数。
1 2 3 4 5 6 | SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setContentHandler(handler); reader.parse( new InputSource(testSAX. this .getResources() .openRawResource(R.raw.test))); |
在这段代码里,XMLReader就调用继承DefaultHandler的SAXHandler。DefaultHandler已实现ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常见读取XML的操作,具体请看下面的SAXHandler.java源码。
最终生成XML的结果如下图所示:
上图是读取各节点之后,使用XmlSerializer重新组合并输出XML字符串。
本文的main.xml代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | <? 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:layout_height = "wrap_content" android:layout_width = "fill_parent" android:id = "@+id/btnSAX" android:text = "使用SAX解析XML" ></ Button > < Button android:layout_height = "wrap_content" android:layout_width = "fill_parent" android:text = "生成XML" android:id = "@+id/btnOutput" ></ Button > < EditText android:text = "@+id/EditText01" android:id = "@+id/EditText01" android:layout_width = "fill_parent" android:layout_height = "fill_parent" ></ EditText > </ LinearLayout > |
SAXHandler.java的源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package com.testSAX; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; public class SAXHandler extends DefaultHandler{ private ArrayList<String> keys = new ArrayList<String>(); //保存字段名称 private ArrayList<Object> values = new ArrayList<Object>(); //保存值 @Override public void startDocument() throws SAXException { super .startDocument(); } @Override public void endDocument() throws SAXException { super .endDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //保存开始标记 keys.add( "startTag" ); values.add(localName); Log.e( "startTag" ,localName); //保存属性值 for ( int i = 0 ; i < attributes.getLength(); i++ ){ keys.add( "Attr" ); String[] str= new String[ 2 ]; str[ 0 ]=attributes.getLocalName(i); str[ 1 ]=attributes.getValue(i); values.add(str); Log.e( "Attr" ,str[ 0 ]+ "=" +str[ 1 ]); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //保存结束标记 keys.add( "endTag" ); values.add(localName); Log.e( "endTag" ,localName); } @Override public void characters( char [] ch, int start, int length) throws SAXException { String value = new String(ch, start, length); value = value.trim(); if (value.length() == 0 ) return ; keys.add( "text" ); values.add(value); Log.e( "text" ,value); } public ArrayList<String> GetKeys() { return keys; } public ArrayList<Object> GetValues() { return values; } } |
testSAX.java的源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package com.testSAX; import java.io.StringWriter; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xmlpull.v1.XmlSerializer; import android.app.Activity; import android.os.Bundle; import android.util.Xml; import android.view.View; import android.widget.Button; import android.widget.EditText; public class testSAX extends Activity { /** Called when the activity is first created. */ Button btnSAX, btnOutput; EditText memo; SAXHandler handler = new SAXHandler(); @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); btnSAX = (Button) this .findViewById(R.id.btnSAX); btnSAX.setOnClickListener( new ClickEvent()); btnOutput = (Button) this .findViewById(R.id.btnOutput); btnOutput.setOnClickListener( new ClickEvent()); memo = (EditText) this .findViewById(R.id.EditText01); } class ClickEvent implements View.OnClickListener { @Override public void onClick(View v) { if (v == btnSAX) { //解析XML,并保存标记,属性等值 try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setContentHandler(handler); reader.parse( new InputSource(testSAX. this .getResources() .openRawResource(R.raw.test))); } catch (Exception ee) {} } else if (v == btnOutput) { //生成XML try { XmlSerializer serializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); try { serializer.setOutput(writer); serializer.startDocument( "UTF-8" , true ); for ( int i= 0 ;i<handler.GetKeys().size();i++) { if (handler.GetKeys().get(i).equals( "startTag" )) { serializer.startTag( "" , (String) handler.GetValues().get(i)); } else if (handler.GetKeys().get(i).equals( "Attr" )){ String[] str= (String[]) handler.GetValues().get(i); serializer.attribute( "" ,str[ 0 ],str[ 1 ]); } else if (handler.GetKeys().get(i).equals( "text" )) serializer.text((String)handler.GetValues().get(i)); else if (handler.GetKeys().get(i).equals( "endTag" )) { serializer.endTag( "" , (String) handler.GetValues().get(i)); } } serializer.endDocument(); String text=writer.toString(); text=text.replace( "><" , ">/r/n<" ); memo.setText(text); //输出到文本框 } catch (Exception e) { throw new RuntimeException(e); } } catch (Exception e) {} } } } } |
感兴趣的读者可以自己动手调试运行一下本实例代码,希望能对大家的Android项目开发起到参考借鉴作用。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
相关文章
android shape的使用及渐变色、分割线、边框、半透明阴影
这篇文章主要介绍了android shape的使用及渐变色、分割线、边框、半透明阴影,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-08-08基于Fedora14下自带jdk1.6版本 安装jdk1.7不识别的解决方法
本篇文章是对Fedora14下自带jdk1.6版本,安装jdk1.7不识别的解决方法进行了详细的分析介绍,需要的朋友参考下2013-05-05Android 限制edittext 整数和小数位数 过滤器(详解)
下面小编就为大家带来一篇Android 限制edittext 整数和小数位数 过滤器(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-04-04
最新评论