当前位置: 首页 > news >正文

Android提高第七篇之XML解析与生成

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦。

本文要解析的test.xml文件如下:

<?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定义各种回调函数,“条件符合”的时候触发这些回调函数。

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代码如下:

<?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的源码如下:

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的源码如下:

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) {} } } } }

相关文章:

  • [汇总I]精选微软等公司数据结构+算法面试100题[第1-60题汇总]
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • LSPCI具体解释分析
  • urb传输的代码分析
  • 32位Windows 7环境安装Pydasm和Pydbg
  • usb学习有感
  • LoadImage()的使用
  • linux下删除.svn命令
  • 嵌入式开发资料集锦
  • Cassandra的事务支持及数据一致性解决方案
  • 表变量和临时表
  • 常见排序算法时间复杂度
  • 老子《道德经》第二十五章
  • SVN
  • sql自定义函数及C#中调用
  • angular2 简述
  • Django 博客开发教程 8 - 博客文章详情页
  • httpie使用详解
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • k个最大的数及变种小结
  • Rancher-k8s加速安装文档
  • 搭建gitbook 和 访问权限认证
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端存储 - localStorage
  • 什么软件可以剪辑音乐?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​MySQL主从复制一致性检测
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • ( 10 )MySQL中的外键
  • (2020)Java后端开发----(面试题和笔试题)
  • (5)STL算法之复制
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法)Game
  • (算法设计与分析)第一章算法概述-习题
  • (一)认识微服务
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)负载均衡,回话保持,cookie
  • .NET Framework .NET Core与 .NET 的区别
  • .net 提取注释生成API文档 帮助文档
  • .Net语言中的StringBuilder:入门到精通
  • .Net中wcf服务生成及调用
  • @JSONField或@JsonProperty注解使用
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [100天算法】-目标和(day 79)
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件