这篇博文正式发表于2015-02-16 14:20,现在显示的创建时间2015-02-05 10:07是当初写草稿的时间

一、SAX解析XML

1,首先展示一下要写入以及解析的xml的文件格式:

<?xml version="1.0" encoding="utf-8"?>
<dragon>
<header>
<code>200</code>
<time>20180123</time>
</header>
<body>
<luffy>
<id>001</id>
<name>蒙奇·D·路飞</name>
<price>8亿</price>
<dream>海贼王,我当定了</dream>
<ability>三色霸气及橡胶果实能力者</ability>
</luffy>
</body>
</dragon>

2,然后是两个简单的实体类:

DragonItem(父类):

import java.util.List;/*** @date: 2015年2月15日 下午4:27:58* * @email: 309997751@qq.com* * @version: V1.0* * @description: dragon,包含了luffy实体类* * @author: diyangxia* */
public class DragonItem {int code;String time;List<LuffyItem> list;public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getTime() {return time;}public void setTime(String msg) {this.time = msg;}public List<LuffyItem> getLuffy() {return list;}public void setLuffy(List<LuffyItem> list) {this.list = list;}}

LuffyItem(子类):

/*** @date: 2015年2月15日 下午4:27:58* * @email: 309997751@qq.com* * @version: V1.0* * @description: 路飞领导的草帽团* * @author: diyangxia* */
public class LuffyItem {private int id; // 编号private String name;// 姓名private String price;// 赏金private String dream;// 梦想private String ability;// 能力public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getDream() {return dream;}public void setDream(String dream) {this.dream = dream;}public String getAbility() {return ability;}public void setAbility(String ability) {this.ability = ability;}}

3,解析器接口,一个用来解析读取xml,一个用来把序列化后的xml字符串写入到文件

import java.io.InputStream;
import java.util.List;/*** @date: 2015年2月15日 下午1:32:42* * @email: 309997751@qq.com* * @version: V1.0* * @description: 蒙奇家族解析器接口* * @author: diyangxia* */
public interface MonkeyInterface {/*** 解析从本地文件获取的输入流得到list* @param is 输入流* @return List<DragonItem>* @throws Exception*/public List<DragonItem> parse(InputStream is) throws Exception;/*** 把list序列化成xml格式的字符串* @param luffys list* @return xml格式字符串* @throws Exception*/public String serialize(List<LuffyItem> luffys) throws Exception;}

4,MonkeySaxTool 解析器工具类,实现解析器接口,这个类很重要,很关键

/*** @date: 2015年2月15日 下午1:36:20* * @email: 309997751@qq.com * * @version: V1.0* * @description: sax解析工具类,实现解析器接口* * @author: diyangxia**/import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class MonkeySaxTool implements MonkeyInterface {@Overridepublic List<DragonItem> parse(InputStream is) throws Exception {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();MyHandler handler = new MyHandler();parser.parse(is, handler); // 根据自定义Handler规则解析输入流MonkeyDFamily.luffyList.clear();MonkeyDFamily.luffyList = handler.getLuffyList();return handler.getDragonList();}@Overridepublic String serialize(List<LuffyItem> luffyList) throws Exception {SAXTransformerFactory factory = (SAXTransformerFactory) TransformerFactory.newInstance();TransformerHandler handler = factory.newTransformerHandler();Transformer transformer = handler.getTransformer(); // 从handler获取Transformer实例transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 是否自动添加额外的空白transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // 是否忽略XML声明StringWriter writer = new StringWriter();Result result = new StreamResult(writer);handler.setResult(result);String uri = ""; // 代表命名空间的URI 当URI无值时 须置为空字符串String localName = ""; // 命名空间的本地名称(不包含前缀) 当没有进行命名空间处理时 须置为空字符串handler.startDocument();handler.startElement(uri, localName, "dragon", null);handler.startElement(uri, localName, "header", null);char[] ch1 = null;handler.startElement(uri, localName, "code", null);ch1 = String.valueOf(200).toCharArray();handler.characters(ch1, 0, ch1.length);handler.endElement(uri, localName, "code");handler.startElement(uri, localName, "time", null);ch1 = String.valueOf("20250519").toCharArray();handler.characters(ch1, 0, ch1.length);handler.endElement(uri, localName, "time");handler.endElement(uri, localName, "header");handler.startElement(uri, localName, "body", null);handler.startElement(uri, localName, "luffy", null);char[] ch = null;for (LuffyItem luffy : luffyList) {handler.startElement(uri, localName, "id", null);ch = String.valueOf(luffy.getId()).toCharArray();handler.characters(ch, 0, ch.length);handler.endElement(uri, localName, "id");handler.startElement(uri, localName, "name", null);ch = String.valueOf(luffy.getName()).toCharArray();handler.characters(ch, 0, ch.length);handler.endElement(uri, localName, "name");handler.startElement(uri, localName, "price", null);ch = String.valueOf(luffy.getPrice()).toCharArray();handler.characters(ch, 0, ch.length);handler.endElement(uri, localName, "price");handler.startElement(uri, localName, "dream", null);ch = String.valueOf(luffy.getDream()).toCharArray();handler.characters(ch, 0, ch.length);handler.endElement(uri, localName, "dream");handler.startElement(uri, localName, "ability", null);ch = String.valueOf(luffy.getAbility()).toCharArray();handler.characters(ch, 0, ch.length);handler.endElement(uri, localName, "ability");}handler.endElement(uri, localName, "luffy");handler.endElement(uri, localName, "body");handler.endElement(uri, localName, "dragon");handler.endDocument();return writer.toString();}// 需要重写DefaultHandler的方法private class MyHandler extends DefaultHandler {private List<DragonItem> dragonList;private DragonItem dragon;private StringBuilder builder;private List<LuffyItem> luffyList;private LuffyItem luffy;// 返回解析后得到的dragons对象集合public List<DragonItem> getDragonList() {return dragonList;}// 返回解析后得到的luffys对象集合public List<LuffyItem> getLuffyList() {return luffyList;}@Overridepublic void startDocument() throws SAXException {super.startDocument();dragonList = new ArrayList<DragonItem>();luffyList = new ArrayList<LuffyItem>();builder = new StringBuilder();}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);if (localName.equals("dragon")) {dragon = new DragonItem();}if (localName.equals("luffy")) {luffy = new LuffyItem();}builder.setLength(0); // 将字符长度设置为0 以便重新开始读取元素内的字符节点}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {super.characters(ch, start, length);builder.append(ch, start, length); // 将读取的字符数组追加到builder中}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(uri, localName, qName);if (localName.equals("code")) {dragon.setCode(Integer.parseInt((builder.toString())));} else if (localName.equals("time")) {dragon.setTime(builder.toString());} else if (localName.equals("dragon")) {dragonList.add(dragon);} else if (localName.equals("ability")) {luffy.setAbility(builder.toString());} else if (localName.equals("id")) {luffy.setId(Integer.parseInt((builder.toString())));} else if (localName.equals("dream")) {luffy.setDream(builder.toString());} else if (localName.equals("name")) {luffy.setName(builder.toString());} else if (localName.equals("price")) {luffy.setPrice(builder.toString());} else if (localName.equals("luffy")) {luffyList.add(luffy);}}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();}}}

5,功能实现的界面

/*** @date: 2015年2月16日 上午11:54:45* * @email: 309997751@qq.com* * @version: V1.0* * @description: xml解析功能实现界面* * @author: diyangxia**/
public class MonkeyDFamily extends Activity {private EditText idET;private EditText nameET;private EditText priceET;private EditText dreamET;private EditText abilityET;private Button saxWBtn;private Button saxRBtn;private TextView mTextView;// 展示结果类private MonkeySaxTool parser = null;private List<LuffyItem> luffys = new ArrayList<LuffyItem>();private String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;/*** 本地xml字符串,可以保存到xml文件再解析读取*/private String sampleReturn = "<?xml version=\"1.0\" encoding=\"utf-8\"?><dragon>    <header> <code>200</code>    <time>20180123</time> </header>     <body><luffy>            <id>001</id>            <name>蒙奇·D·路飞</name>            <price>8亿</price>            <dream>海贼王,我当定了</dream>            <ability>霸王色霸气</ability>      </luffy></body></dragon>";public static List<LuffyItem> luffyList = new ArrayList<LuffyItem>();@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_monkeydfamily);saxWBtn = (Button) findViewById(R.id.button1);saxRBtn = (Button) findViewById(R.id.button2);idET = (EditText) findViewById(R.id.monkey_d_id);abilityET = (EditText) findViewById(R.id.monkey_d_ability);dreamET = (EditText) findViewById(R.id.monkey_d_dream);priceET = (EditText) findViewById(R.id.monkey_d_price);nameET = (EditText) findViewById(R.id.monkey_d_name);mTextView = (TextView) findViewById(R.id.textView1);saxWBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubgenerateXMLData();writeXML();}});saxRBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub
//              saveStringToFile("diyangxiaR.xml", sampleReturn);readXML();}});}private void generateXMLData() {// TODO Auto-generated method stubluffys.clear();LuffyItem luffy = new LuffyItem();luffy.setId(Integer.parseInt(idET.getText().toString().trim()));luffy.setName(nameET.getText().toString().trim());luffy.setPrice(priceET.getText().toString().trim());luffy.setDream(dreamET.getText().toString().trim());luffy.setAbility(abilityET.getText().toString().trim());luffys.add(luffy);}private String writeXML() {// TODO Auto-generated method stubtry {File cacheFile = new File(rootPath + "diyangxiaW.xml");// 设置参数if (cacheFile.exists()) {cacheFile.delete();}cacheFile.createNewFile();// 生成文件parser = new MonkeySaxTool(); // 创建SaxBookParser实例String xml = parser.serialize(luffys); // 序列化@SuppressWarnings("resource")FileOutputStream fos = new FileOutputStream(cacheFile);fos.write(xml.getBytes("UTF-8"));Toast.makeText(MonkeyDFamily.this, "生成xml文件成功,可至SD卡根目录查看", Toast.LENGTH_SHORT).show();mTextView.setText(xml);Log.i("TAG", "发送给后台" + xml);return xml;} catch (Exception e) {Log.i("TAG", "Exception-" + e.toString());}return null;}private void readXML() {// TODO Auto-generated method stubtry {parser = new MonkeySaxTool(); // 创建SaxBookParser实例
//          InputStream in = new FileInputStream(new File(rootPath
//                  + "diyangxiaR.xml"));InputStream in = new FileInputStream(new File(rootPath+ "diyangxiaW.xml"));List<DragonItem> dragons = parser.parse(in); // 解析输入流for (DragonItem dragon : dragons) {Log.i("TAG", "Code--" + dragon.getCode());Log.i("TAG", "Time--" + dragon.getTime());}mTextView.setText("id==" + luffyList.get(0).getId() + "\nname=="+ luffyList.get(0).getName() + "\nprice=="+ luffyList.get(0).getPrice() + "\ndream=="+ luffyList.get(0).getDream() + "\nability=="+ luffyList.get(0).getAbility());} catch (Exception e) {Log.i("TAG", "Exception--" + e.toString());}}/*** 根据content生成fileName文件* @param fileName 文件名* @param content 要写入文件的内容*/public void saveStringToFile(String fileName, String content) {try {File root = new File(rootPath);if (!root.exists()) {root.mkdirs();}File f = new File(rootPath + fileName);if (f.exists()) {f.delete();}f.createNewFile();FileOutputStream out = new FileOutputStream(f);out.write(content.getBytes());out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}
}

6,写入到本地xml文件效果图如下:

7,解析读取本地xml文件效果图如下:

二、使用XML数据与服务器交互

new Thread(new Runnable() {@Overridepublic void run() {result = postXMLHttpString(MonkeyDFamily.this,"后台接收xml的接口地址", rootPath+ "diyangxiaW.xml");Log.i("TAG", "result==>" + result);if (result.contains("success")) {try {JSONObject object = new JSONObject(result);boolean success = object.getBoolean("success");if (!success) {mHandler.sendEmptyMessage(XML_POST_FAILURE);}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {mHandler.sendEmptyMessage(XML_POST_SUCCESS);}}}).start();

提交post请求方法,传递xml文件,获取输入流转化

public String postXMLHttpString(Context context, String urlStr,String fileName) {String result = null;try {URL url = new URL(urlStr);HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();InputStream is = new FileInputStream(new File(fileName));urlConn.setDoOutput(true);urlConn.setRequestMethod("POST");urlConn.setConnectTimeout(5000);urlConn.setRequestProperty("Content-type", "text/xml charset=UTF-8");urlConn.connect();OutputStream os = urlConn.getOutputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}byte[] data = baos.toByteArray();os.write(data);is.close();os.flush();os.close();if (urlConn.getResponseCode() == 200) {result = new String(readInputStream(urlConn.getInputStream()),"UTF-8");// 响应xml数据result = URLDecoder.decode(result, "UTF-8");}} catch (Exception e) {e.printStackTrace();JSONObject obj = new JSONObject();try {obj.put("success", "false");obj.put("reason", "无法连接到服务器");} catch (JSONException e1) {e1.printStackTrace();}return obj.toString();}return result;}public byte[] readInputStream(InputStream inStream) throws Exception {ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outStream.write(buffer, 0, len);}inStream.close();return outStream.toByteArray();}

使用dom4j解析xml的问题

SAXReader reader = new SAXReader();//得到解析器对象//通过解析器对象得到文档对象Document document = reader.read(new File("xml/book.xml"));//得到根节点(此处的根节点是“书架”)Element root = document.getRootElement();//得到子节点“书”的子节点“书名”Element bookname = root.element("书").element("书名");//得到节点的值或文本System.out.println(bookname.getText());作者:yjaal
链接:https://www.jianshu.com/p/e8561ea99d03

最后,提供一个简单的DEMO下载

声明:借鉴了这篇博文,传送门

Android使用SAX实现XML解析,使用text/xml格式与后台交互相关推荐

  1. 请利用SAX编写程序解析Yahoo的XML格式的天气预报,获取天气预报——python学习笔记

    1. 题目: 请利用SAX编写程序解析Yahoo的XML格式的天气预报,获取天气预报: 题目是廖雪峰老师的python教程中XML的练习. 本篇博文只是针对这一题目,没有做详细的介绍,如果看不懂可以在 ...

  2. java xml解析器_Java XML解析器

    java xml解析器 Java XML parser is used to work with xml data. XML is widely used technology to transpor ...

  3. XML 解析错误:XML 或文本声明不在实体的开头位置,有效的解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 昨天在测试APP接口返回XML数据的时候( http://my.oschina.net/woshixiaomayi/blog/ ...

  4. xml解析 java_Java的XML解析

    XML:(eXtensible Markup Language) 可扩展标记语言 是一种数据格式,用于存储和传输数据 声明一个xml文件 文档类型定义 book.dtd"> only: ...

  5. android用sax解析xml,详解android使用SAX解析XML文件

    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...

  6. iOS 中的 xml 解析

    在ios 中解析xml 的方法有很多种 1.苹果原生 NSXMLParser:SAX方式解析,使用简单 2.第三方框架 libxml2:纯c语言,默认包含在ios  sdk中,同时支持DOM 和 SA ...

  7. XML解析的四种方式

    1.说明 XML是EXtensible Markup Language, 即可扩展标记语言, 是一种通用的数据交换格式, 它的平台无关性.语言无关性.系统无关性, 给数据集成与交互带来了极大的方便. ...

  8. 常用 XML 解析技术

    现在的软件项目都不是独立的一个项目,都是多系统协调工作.这样的话就涉及到系统间的通讯,通讯就会跟报文传输挂上关系.系统间使用怎样的报文格式进行通讯呢?有的使用固定长度格式报文:有的使用变长格式报文:有 ...

  9. XML解析、JSON解析入门

    引言 NOKIA 有句著名的广告语:"科技以人为本".任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个 ...

最新文章

  1. linux 正则查找email_Linux生产环境上,最常用的一套“Sed“技巧
  2. 介绍一款开源的类Excel电子表格软件
  3. 互联网金融乱弹4:讨论金融系统日切处理
  4. 一个Java递归删除目录的方法
  5. 考研英语一2016年真题4篇阅读词汇句子积累(详细!!!)
  6. Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url 解决过程
  7. 【简便解法】1089 狼人杀-简单版 (20分)_25行代码AC
  8. 从Loagistic 到 SVM算法
  9. python进程的回收—wait
  10. libpng warning: iCCP: known incorrect sRGB profile
  11. js中 var a= b || c;
  12. 添加icon_(icon)冬季检查保养篇
  13. wdcp 开启某个Mysql数据库远程访问
  14. 微型计算机就是完全采用大规模集成电路,微型计算机就是完全采用大规模集成电路或超大规模集成电路芯片,使计算机的主要电路都集成在一块芯片上。...
  15. vue-事件修饰符-详解(.prevent .stop .once .capture .self)
  16. android8临时root,Android8.0怎么root,刷supersu无穷重启
  17. BUUCTF-[网鼎杯 2020 青龙组]虚幻2
  18. 最好的远程桌面破解软件frdpb_v2
  19. ArcGIS构建缓冲区,合并两个重叠的面
  20. Redis集群方案及实现

热门文章

  1. KYLIN问题收录(不定期更新)
  2. 川崎机器人零点调整_如何对FANUC机器人进行零点复位?
  3. mobilesdk实战(含代码)
  4. R语言:pheatmap R包做聚类分析热图
  5. 智鼎逻辑推理题及答案_联合利华2018年笔试真题(含答案和解析)
  6. 【Python从入门到进阶】21、爬虫相关概念介绍
  7. 代数余子式矩阵求行列式
  8. 大神指点:初级小白如何学好接口测试
  9. 黑龙江大学的计算机科学技术专业的,黑龙江大学计算机科学技术学院师资队伍...
  10. strptime python_python中时间方法总结(strptime、strftime)