首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

Android--SAX解析方式

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/53759507 Pull 解析方式虽然非常的好用,但它并不是我们唯一的选择。SAX解析也是一种特别常 用的 XML 解析方式,虽然它的用法比 Pull解析要复杂一些,但在语义方面会更加的清楚。 通常情况下我们都会新建一个类继承自 DefaultHandler,并重写父类的五个方法,如下 所示: public class MyHandler extends DefaultHandler { @Override public void startDocument() throws SAXException { } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { } @Override public void characters(char[] ch, int start, int length) throws SAXException { } @Override public void endElement(String uri, String localName, String qName) throws SAXException { } @Override public void endDocument() throws SAXException { } } 这五个方法一看就很清楚吧?startDocument()方法会在开始 XML 解析的时候调用, startElement()方法会在开始解析某个结点的时候调用,characters()方法会在获取结点中内容 的时候调用,endElement()方法会在完成解析某个结点的时候调用,endDocument()方法会在 完成整个 XML 解析的时候调用。其中,startElement()、characters()和 endElement()这三个方 法是有参数的,从 XML 中解析出的数据就会以参数的形式传入到这些方法中。需要注意的 是,在获取结点中的内容时,characters()方法可能会被调用多次,一些换行符也被当作内容 解析出来,我们需要针对这种情况在代码中做好控制。 那么下面就让我们尝试用 SAX 解析的方式来实现和上一小节中同样的功能吧。新建一 个 ContentHandler类继承自 DefaultHandler,并重写父类的五个方法,如下所示: public class ContentHandler extends DefaultHandler { private String nodeName; private StringBuilder id; private StringBuilder name; private StringBuilder version; @Override public void startDocument() throws SAXException { id = new StringBuilder(); name = new StringBuilder(); version = new StringBuilder(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 记录当前结点名 nodeName = localName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { // 根据当前的结点名判断将内容添加到哪一个StringBuilder对象中 if ("id".equals(nodeName)) { id.append(ch, start, length); } else if ("name".equals(nodeName)) { name.append(ch, start, length); } else if ("version".equals(nodeName)) { version.append(ch, start, length); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("app".equals(localName)) { Log.d("ContentHandler", "id is " + id.toString().trim()); Log.d("ContentHandler", "name is " + name.toString().trim()); Log.d("ContentHandler", "version is " + version.toString().trim()); // 最后要将StringBuilder清空掉 id.setLength(0); name.setLength(0); version.setLength(0); } } @Override public void endDocument() throws SAXException { } } 可以看到,我们首先给 id、name 和 version 结点分别定义了一个 StringBuilder 对象,并 在 startDocument()方法里对它们进行了初始化。 每当开始解析某个结点的时候, startElement() 方法就会得到调用,其中 localName 参数记录着当前结点的名字,这里我们把它记录下来。 接着在解析结点中具体内容的时候就会调用 characters()方法, 我们会根据当前的结点名进行 判断,将解析出的内容添加到哪一个 StringBuilder对象中。最后在 endElement()方法中进行 判断,如果 app结点已经解析完成,就打印出 id、name 和 version的内容。需要注意的是, 目前 id、name 和 version中都可能是包括回车或换行符的,因此在打印之前我们还需要调用 一下 trim()方法,并且打印完成后还要将 StringBuilder的内容清空掉,不然的话会影响下一 次内容的读取。 接下来的工作就非常简单了,修改 MainActivity中的代码,如下所示: public class MainActivity extends Activity implements OnClickListener { …… private void sendRequestWithHttpClient() { new Thread(new Runnable() { @Override public void run() { try { HttpClient httpClient = new DefaultHttpClient(); // 指定访问的服务器地址是电脑本机 HttpGet httpGet = new HttpGet("http://10.0.2.2:8080/ get_data.xml"); HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 请求和响应都成功了 HttpEntity entity = httpResponse.getEntity(); String response = EntityUtils.toString(entity, "utf-8"); parseXMLWithSAX(response); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } …… private void parseXMLWithSAX(String xmlData) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlReader = factory.newSAXParser().getXMLReader(); ContentHandler handler = new ContentHandler(); // 将ContentHandler的实例设置到XMLReader中 xmlReader.setContentHandler(handler); // 开始执行解析 xmlReader.parse(new InputSource(new StringReader(xmlData))); } catch (Exception e) { e.printStackTrace(); } } } 在得到了服务器返回的数据后,我们这次去调用 parseXMLWithSAX()方法来解析 XML 数据。parseXMLWithSAX()方法中先是创建了一个 SAXParserFactory的对象,然后再获取到 XMLReader对象,接着将我们编写的 ContentHandler的实例设置到 XMLReader中,最后调 用 parse()方法开始执行解析就好了。 现在重新运行一下程序,点击 Send Request 按钮后观察 LogCat 中的打印日志,你会看 到和图 10.7中一样的结果。 除了 Pull 解析和 SAX 解析之外,其实还有一种 DOM 解析方式也算挺常用的,不过这 里我们就不再展开进行讲解了,感兴趣的话你可以自己去查阅一下相关资料。

优秀的个人博客,低调大师

android 线上项目 MysqlConsole

http://shouji.baidu.com/software/9835321.html 开发工具,手机端查询mysql数据库 *查看数据库,表,数据 注意:本地mysql需要分享无限网络连接,阿里数据库,需要连接数据流量不支持代理 ssl 表数据 可以左右滑动查看所有属性 捐助开发者 在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。 谢谢您的赞助,我会做的更好!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册