Android提高之XML解析与生成实例详解

作者:shichen2014 时间:2022-12-06 16:45:50 

本文实例讲述了使用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的结果如下图所示:

Android提高之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的结果如下图所示:

Android提高之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项目开发起到参考借鉴作用。

标签:Android,XML
0
投稿

猜你喜欢

  • Java数组传递及可变参数操作实例详解

    2023-08-26 21:21:59
  • Apache和Tomcat有什么区别_动力节点Java学院整理

    2023-08-15 08:49:44
  • C#异步编程详解

    2023-02-13 13:10:39
  • Android自定义View绘图实现渐隐动画

    2022-07-04 19:41:34
  • C#在子线程中更新窗口部件的写法

    2022-04-01 09:57:50
  • 二叉搜索树实例练习

    2022-09-20 22:03:06
  • Java安全 ysoserial CommonsCollections3示例分析

    2022-01-19 05:08:19
  • 解析Java的Spring框架的BeanPostProcessor发布处理器

    2021-11-21 17:16:13
  • java发送get请求和post请求示例

    2022-01-30 10:45:52
  • Java 遍历list和map的方法

    2023-02-06 22:23:40
  • 深入理解Android手势识别

    2021-08-12 11:05:16
  • Java实现FIFO任务调度队列策略

    2021-09-19 09:05:37
  • 使用SSM+Layui+Bootstrap实现汽车维保系统的示例代码

    2023-11-28 18:30:04
  • C#设计模式之Singleton模式

    2022-03-28 09:01:31
  • 简单了解springboot的jar包部署步骤

    2021-07-02 14:22:48
  • Intellij IDEA创建spring-boot项目的图文教程

    2022-06-15 01:09:59
  • 单点登录的三种方式和JWT的介绍与使用

    2023-05-19 22:10:59
  • 简单了解Java编程中抛出异常的方法

    2023-08-07 17:31:49
  • 详解java中static关键词的作用

    2023-12-02 00:32:00
  • c#生成随机数示例分享

    2023-10-04 06:54:50
  • asp之家 软件编程 m.aspxhome.com