展会信息港展会大全

android XML的解析与生成
来源:互联网   发布日期:2016-01-13 21:57:29   浏览:2228次  

导读:本文使用SAX来解析XML,在Android里面可以使用SAX和DOM两种方法来解析XML,DOM方法需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结......

本文使用SAX来解析XML,在Android里面可以使用SAX和DOM两种方法来解析XML,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://www.android100.org/</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:id="@+id/btnSAX"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="使用SAX解析xml"

/>

<Button

android:id="@+id/btnOutput"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="生成xml"

/>

<EditText

android:id="@+id/EditText01"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="@+id/EditText01"

/>

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

}

}

}

}

}

赞助本站

人工智能实验室

相关热词: XML 解析 生成

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港