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

2024-02-29 05:18

本文主要是介绍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) {} } } } }

这篇关于Android提高第七篇之XML解析与生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757673

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的