Android-Sax解析与生成xml数据
来源:互联网 发布:mac需要键盘膜吗 编辑:程序博客网 时间:2024/05/06 21:07
Android 使用Sax 解析与生成xml数据
MySaxHandler解析类,该类是DefaultHandler的子类startDocument:第一个分析点 事件方法。在该方法中创建了用于保存转换结果的ArrayList<Person>对象。startElement:第二个分析点事件方法。SAX引擎分析到每一个<Person>元素时,在该方法中都创建一个Person对象。endElement: 第三个分析点事件方法。该方法中的代码最复杂,但仔细看一下,其实很简单。 当SAX引擎分析完每一个XML元素后,会将该元素中的文本保存在Person对象的响应属性中。endDocument:第四个分析点事件方法。在该方法中什么都没有做,也没有覆盖这个方法。characters:第五个分析点事件方法。虽然该方法中的代码有开发人员编写的只有一行,但十分关键。 在该方法中将SAX引擎扫描到的内容保存在String变量中。而在endElement方法中要 使用该变量中的内容为Person对象中的属相赋值。
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/jiexi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="jiexi" android:text="sax解析xml" /> <Button android:id="@+id/shengcheng" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/jiexi" android:onClick="shengcheng" android:text="sax生成xml" /></RelativeLayout>MainActivity.java
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.yulongji.android3;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import org.xml.sax.helpers.AttributesImpl;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.sax.SAXTransformerFactory;import javax.xml.transform.sax.TransformerHandler;import javax.xml.transform.stream.StreamResult;public class MainActivity extends Activity { //声明装载Person对象的List private ArrayList<Person> pList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (pList == null) { pList = new ArrayList<>(); } } public void jiexi(View view) { getXml(); } public void shengcheng(View view) { shengchengXml(); } //从服务器中获取xml流 public void getXml() { new Thread() { @Override public void run() { String path = "http://172.16.20.206:8080/mytest/person.xml"; try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); if (conn.getResponseCode() == 200) { Log.v("tag", "链接成功"); InputStream is = conn.getInputStream(); jiexiSaxXml(is); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } //解析xml public void jiexiSaxXml(InputStream is) { try { //通过获取到的InputStream来得到InputSource实例 InputSource isour = new InputSource(is); //使用工厂方法初始化SAXParserFactory变量saxf SAXParserFactory saxf = SAXParserFactory.newInstance(); //通过SAXParserFactory得到SAXParser的实例 SAXParser saxp = saxf.newSAXParser(); //通过SAXParser得到XMLReader的实例 XMLReader xmlr = saxp.getXMLReader(); //初始化自定义的类MySaxHandler的变量mysax,将pList传递给它,以便装载数据 MySaxHandler mysax = new MySaxHandler(pList); //将对象mysax传递给xmlr xmlr.setContentHandler(mysax); //调用xmlr的parse方法解析输入流 xmlr.parse(isour); } catch (Exception e) { e.printStackTrace(); } for (Person person : pList) { System.out.println(person); } } public void shengchengXml() { try { FileWriter fw = new FileWriter( Environment.getExternalStorageDirectory() + File.separator + "person.xml"); //初始化SAXTransformerFactory SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler handler = factory.newTransformerHandler(); Transformer transformer = handler.getTransformer(); // 设置xml属性 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); transformer.setOutputProperty(OutputKeys.VERSION, "1.0"); StreamResult result = new StreamResult(fw); // 保存创建的xml handler.setResult(result); handler.startDocument(); AttributesImpl attr = new AttributesImpl(); attr.clear(); // attr.addAttribute("", "", "author", "", "yu_longji"); // attr.addAttribute("", "", "date", "", "2015/8/23"); handler.startElement("", "", "persons", attr); for (int i = 0; i < pList.size(); i++) { Person person = pList.get(i); attr.clear(); String id = String.valueOf(person.getId()); //添加属性id值 attr.addAttribute("", "", "id", "", id); handler.startElement("", "", "person", attr); attr.clear(); handler.startElement("", "", "name", attr); String name = person.getName(); //添加标签值 handler.characters(name.toCharArray(), 0, name.length()); handler.endElement("", "", "name"); attr.clear(); handler.startElement("", "", "age", attr); String age = String.valueOf(person.getAge()); //添加标签值 handler.characters(age.toCharArray(), 0, age.length()); handler.endElement("", "", "age"); handler.endElement("", "", "person"); } handler.endElement("", "", "persons"); handler.endDocument(); } catch (Exception e) { e.printStackTrace(); } }}</span><span style="font-family:KaiTi_GB2312;font-size:18px;"></span>MySaxHandler.java
package com.example.yulongji.android3;import android.util.Log;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import java.util.ArrayList;/** * Created by yulongji on 2015/8/23. * <p/> * MySaxHandler解析类,该类是DefaultHandler的子类 * <p/> * startDocument:第一个分析点 事件方法。在该方法中创建了用于保存转换结果的ArrayList<Person>对象。 * startElement:第二个分析点事件方法。SAX引擎分析到每一个<Person>元素时,在该方法中都创建一个Person对象。 * endElement: 第三个分析点事件方法。该方法中的代码最复杂,但仔细看一下,其实很简单。 * 当SAX引擎分析完每一个XML元素后,会将该元素中的文本保存在Person对象的响应属性中。 * endDocument:第四个分析点事件方法。在该方法中什么都没有做,也没有覆盖这个方法。 * characters:第五个分析点事件方法。虽然该方法中的代码有开发人员编写的只有一行,但十分关键。 * 在该方法中将SAX引擎扫描到的内容保存在String变量中。而在endElement方法中要 * 使用该变量中的内容为Person对象中的属相赋值。 */public class MySaxHandler extends DefaultHandler { //声明一个装载Beauty类型的List private ArrayList<Person> pList; //声明一个Beauty类型的变量 private Person person; //声明一个字符串变量 private String string; /** * MySaxHandler的构造方法 * * @param pList 装载返回结果的List对象 */ public MySaxHandler(ArrayList<Person> pList) { this.pList = pList; } // 当SAX解析器解析到XML文档开始时,会调用的方法 @Override public void startDocument() throws SAXException { super.startDocument(); Log.i("--start--", "文档开始"); } /** * 当SAX解析器解析到某个元素开始时,会调用的方法 * 其中localName记录的是元素属性名 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); string = localName; if ("person".equals(localName)) { //新建Person对象 person = new Person(); //添加person的id属性值 person.setId(new Integer(attributes.getValue(0))); } } /** * 当SAX解析器解析到某个属性值时,会调用的方法 * 其中参数ch记录了这个属性值的内容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); string = new String(ch, start, length); Log.v("string",string); } /** * 当SAX解析器解析到某个元素结束时,会调用的方法 * 其中localName记录的是元素属性名 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if ("name".equals(localName)) { person.setName(string); } else if ("age".equals(localName)) { person.setAge(Integer.parseInt(string)); } else if ("person".equals(localName)) { pList.add(person); } } // 当SAX解析器解析到XML文档结束时,会调用的方法 @Override public void endDocument() throws SAXException { super.endDocument(); }}
0 0
- Android-Sax解析与生成xml数据
- Android SAX解析与生成XML
- Android sax解析XML数据
- Android sax解析XML数据
- java解析与生成xml(二): SAX
- Android中的XML解析与生成——SAX解析XML
- android 学习笔记 SAX 解析XML数据
- android sax dom pull 解析xml 和生成xml
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- android SAX解析XML
- Android SAX解析XML
- android SAX解析XML
- android xml-----Sax解析
- VBA中实现数组排序的多种方法
- request
- 【JS】JavaScript引擎的内部运行机制
- 在线填写--关于时间的内容
- CDH 维护日志,集群查看
- Android-Sax解析与生成xml数据
- QWaitCondition解决打印日志卡的问题
- block回调的一点个人理解
- 给中国学生的第三封信:成功、自信、快乐
- Edit Distance
- 软工视频总结Part Three
- Objective-C中的浅拷贝和深拷贝
- SourceInsight 的一些小技巧
- android 学习笔记 将数据存储到SharedPreferences中 并且读取数据