Android网络编程之解析XML格式数据
来源:互联网 发布:赛平 淘宝 编辑:程序博客网 时间:2024/05/12 18:27
Android网络编程之解析XML格式数据
XML(Extensible Markup Language) 即可扩展标记语言,其和HTML类似,但又和HTML有很多不同之处。
**
- XML简化数据分享
- XML简化数据传输
- XML简化平台的变更
- XML使数据更有用
- XML可用于创建新的Internet语言
- XML最大的特点是标签没有被预定义,需要自定义标签,不像HTML那样必须使用固定的预定义元素集。
**
SAX(Simple API for XML)是基于事件驱动的,边加载边解析。在用SAX解析XML文档的时候,在读取到文档开始和结束标签的时候会回调一个事件,在读取到其他节点与内容的时候也会回调一个事件。
以下为代码示例:
public class MainActivity extends Activity { TextView textView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); textView = (TextView) findViewById(R.id.textView); //调用解析XML数据的方法 ParserXMLwithSAX(); } private void ParserXMLwithSAX(){ //XML数据 String XML_DATA="<root>" + " <Book>" + " <name>《老人与海》</name>" + " <author>海明威</author>" + " <price>26.5</price>" + " </Book>" + "</root>"; //读取XML数据到输入流中 InputStream stream = new ByteArrayInputStream(XML_DATA.getBytes()); // InputSource source = new InputSource(stream); try { //实例化SAXParserFactory 对象 SAXParserFactory factory = SAXParserFactory.newInstance(); //实例化一个解析器对象SAXParser SAXParser parser = factory.newSAXParser(); //获取事件源对象XMLReader XMLReader reader = parser.getXMLReader(); //创建一个ContentHandler对象,此类的具体定义在下一个代码块 ContentHandler handler = new ContentHandler(); //解析器注册事件 reader.setContentHandler(handler); //解析数据 reader.parse(source); textView.setText(handler.getData()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
public class ContentHandler extends DefaultHandler { String name ; //存放书名 String author ; //存放作者 String price ; //存放价格 String currentTag ; //获得当前标签//在开始XML解析的时候调用 @Override public void startDocument() throws SAXException { super.startDocument(); }//完成整个XML解析的时候调用 @Override public void endDocument() throws SAXException { super.endDocument(); }//开始解析某个节点的时候调用 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //获取到当前标签 currentTag = qName; }//完成解析某个节点的时候调用 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); //完成某个节点解析后将当前标签字符串设置为null currentTag = null; }//获取节点中的内容的时候调用 @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); //判断正在解析哪个节点,然后获取当前节点的数据 if ("name".equals(currentTag)) { name = "书名: " + new String(ch, start, length)+ " "; } if ("author".equals(currentTag)) { author = "作者: " + new String(ch, start, length)+ " "; } if ("price".equals(currentTag)) { price = "价格: " + new String(ch, start, length); } } public String getData() { //将解析出来的数据返回给MainActivity后用TextView显示出来 return name + author + price; }}
结果如图:
PULL解析XML的方式与SAX解析XML的方式一样,它也是基于事件驱动的。
代码示例如下:
public class MainActivity extends Activity { TextView textView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); textView = (TextView) findViewById(R.id.textView); //调用解析XML的方法 ParserXMLwithPULL(); } private void ParserXMLwithPULL(){ //XML数据 String XML_DATA="<root>" + " <Book>" + " <name>《老人与海》</name>" + " <author>海明威</author>" + " <price>26.5</price>" + " </Book>" + "</root>"; try { String name = ""; String author = ""; String price = ""; //实例化XmlPullParserFactory对象 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); //将XML数据读入XmlPullParser解析器中 parser.setInput(new StringReader(XML_DATA)); //定义PULL解析常用事件类型 int eventType = parser.getEventType(); //判断是否为数据的逻辑末尾,输入流的末尾 while (eventType != XmlPullParser.END_DOCUMENT) { //获得节点的标签名称 String nodeName = parser.getName(); switch (eventType) { //开始解析某个节点 case XmlPullParser.START_TAG: { if ("name".equals(nodeName)) { name = parser.nextText(); } else if ("author".equals(nodeName)) { author = parser.nextText(); } else if ("price".equals(nodeName)) { price = parser.nextText(); } } break; } eventType = parser.next(); } textView.setText("书名: "+name + " 作者:"+author + " 价格:"+ price); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
除了PULL解析和SAX解析之外,其实还有一种DOM解析方式也算挺常用的,DOM解析XML文件时,会将XML文件的所有内容以文档树的方式存放在内存中,然后允许用户使用DOM API遍历XML树、检索所需的数据。因为DOM需要将XML文件的所有内容以文档树的方式存放在内存中,所以内存的消耗比较大,所以建议还是使用SAX或者PULL来解析XML文件。
0 0
- Android网络编程之解析XML格式数据
- Android之网络编程(四)解析 JSON 格式数据
- Android网络编程之sax解析xml
- Android网络编程之pull解析xml
- Android网络编程之XML解析
- android之网络编程解析XML
- Android 网络获取数据之XML解析
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android网络之数据解析----SAX方式解析XML数据
- Android中级之网络数据解析一之xml解析
- 网络编程--xml数据解析
- android解析xml格式数据
- Android 解析XML格式数据
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- uva11426GCD - Extreme (II)
- 【Poj 2531】 Network Saboteur dfs
- 初来乍到
- 学习 ui-router - 管理状态
- R语言实战k-means聚类和关联规则算法
- Android网络编程之解析XML格式数据
- 网易公开课《Linux内核分析》学习心得-分析system_call中断处理过程
- [XML]学习笔记(一)XML简介
- 【Unity】Shader Forge 使用手记
- 类学习五
- StringBuffer与StringBuilder详解
- poj Big Number 1423 (数学 取对数&技巧)
- AngularJS HTML DOM
- PHP中字符串比较的常用方法