自学Android之解析XML与Json-程序员宅基地

技术标签: dom  xml  android  试水  

Android端与服务器端交互主要依靠XML预Json,所以解析XML与Json是Android程序员必备的的技能。

解析XML主要有三种方法:

1.DOM解析

DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,

然后才可以检索和更新节点信息。

    由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。

2.SAX解析

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,

调用事件处理器相 应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,

这样事件处理器才能够根据提供的事件信 息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

3.Pull解析

PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,

而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,

Android系统内部在解析各种XML时也是用PULL解析器


首先新建Activity与布局。布局的代码为

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_parse_xml"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.myapplication.ParseXmlActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="parseXML"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/application"
        />


</LinearLayout>


由于解析XML是耗时操作,所以我们在异步任务类中解析XML

URL url=new URL("http://192.168.43.169:8080/AndroidManifest.xml");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //设置请求方式‘
                connection.setRequestMethod("GET");
                //设置请求连接超时的时间(优化)
                connection.setConnectTimeout(5000);

                //获取结果码
                int code=connection.getResponseCode();
                if(code==200){
                    //获取服务器返回过来的结果
                    InputStream is=connection.getInputStream();
}
首先我们获取网络数据,然后开始解析XML

DOM解析的代码为

//01.使用DOM解析
                    DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
                    DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
                    Document document=documentBuilder.parse(is);
                    //获取跟标签
                    Element root=document.getDocumentElement();
                    Log.i("test","根标签:"+root.getNodeName());

                    Element application=(Element)root.getElementsByTagName("application").item(0);
                    NodeList nodeList = application.getElementsByTagName("activity");

                    for (int i = 0; i <nodeList.getLength() ; i++) {
                        //获取单个
                        //Node
                        //Element
                        Element personElement= (Element) nodeList.item(i);
                        //获取<person>属性id的值
                        String name=personElement.getAttribute("android:name");
                        Log.i("android:name",name);

                        //获取<person>下面的子标签<name><age><image>的值
                        Element intent_filter= (Element) personElement.getElementsByTagName("intent-filter").item(0);
                        String intent_filter_content=intent_filter.getTextContent();

                        Log.i("test",intent_filter_content+"     "+intent_filter.getPrefix());
                    }

SAX解析的代码为

02.SAX(边读边解析,基于事件(方法)驱动方式)

                    SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
                    SAXParser saxParser=saxParserFactory.newSAXParser();

                    saxParser.parse(is,new DefaultHandler(){
                        @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 {
                            super.startElement(uri, localName, qName, attributes);
                            cuurentTag=localName;
                            //获取开始标签的名字
                            if("activity".equals(localName)){
                                //取属性的值
                                String android_name=attributes.getValue(0);
                                Log.i("android:name",android_name);
                            }


                        }

                        @Override
                        public void endElement(String uri, String localName, String qName) throws SAXException {
                            super.endElement(uri, localName, qName);
                            cuurentTag=null;
                        }

                        @Override
                        public void characters(char[] ch, int start, int length) throws SAXException {
                            super.characters(ch, start, length);
                            if("intent-filter".equals(cuurentTag)){
                                //获取<name>的值
                                String intent_filter=new String(ch,start,length);
                                Log.i("intent-filter", "   "+intent_filter);
                            }
                        }
                    });

PUll解析的代码为

//03.使用PULL解析(类似SAX)
                    XmlPullParser xmlPullParser= Xml.newPullParser();
                    xmlPullParser.setInput(is,"UTF-8");

//                    //获取解析的标签的类型
                    int type=xmlPullParser.getEventType();

                    while(type!= XmlPullParser.END_DOCUMENT){
                        switch (type) {
                            case XmlPullParser.START_TAG:
                                //获取开始标签名字
                                String starttagName=xmlPullParser.getName();

                                if("activity".equals(starttagName)){
                                    //获取id的值
                                    String android_name=xmlPullParser.getAttributeValue(0);
                                    Log.i("android:name",android_name);
                                }

                                if("application".equals(starttagName)){
                                    for (int i = 0; i < xmlPullParser.getAttributeCount(); i++) {
                                       str+=xmlPullParser.getAttributeName(i)+"=\""+ xmlPullParser.getAttributeValue(i)+"\"\n";
                                    }
                                }

                                cuurentTag=starttagName;
                                break;
                            case 4:
                                //获取id的值
                                if ("intent-filter".equals(cuurentTag)) {
                                    String intent_filter=xmlPullParser.getText();
                                    Log.i("intent_filter",intent_filter);
                                }
                                break;
                            case XmlPullParser.END_TAG:
                                cuurentTag=null;
                                break;
                        }
                        //细节:
                        type=xmlPullParser.next();
                    }





版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xwq1996/article/details/56273307

智能推荐

安装和初步使用 nn-Meter_nn-meter部署-程序员宅基地

文章浏览阅读396次。安装和初步使用 nn-Meter_nn-meter部署

消息队列RabbitMQ介绍和使用_rabbitmq消费端 使用 class-程序员宅基地

文章浏览阅读634次。消息队列RabbitMQ介绍和使用_rabbitmq消费端 使用 class

MySQL_DQL语句(分组,筛选)_数据库的备份/还原/约束_mysql备份筛选数据-程序员宅基地

文章浏览阅读118次。DQL语句之分组查询:group byselect 字段列表 from 表名 group by 分组字段名称;注意事项:1) 查询的字段列表中可以使用 分组字段 ;2) group by之后不能使用聚合函数 ;3) 带条件分组查询的语法: where 条件必须放在group by 之前,否则语法错误! ;4) select 字段列表包含分组字段,聚合函数.. from 表名 where 条件 group by 分组字段 ;DQL语句之筛选查询:havingselect 字段列_mysql备份筛选数据

用DataReader还是DataSet?-程序员宅基地

文章浏览阅读74次。我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优..._使用datareader类或dataset类从该表中查询所有学生的所有信息

logback.xml 在控制台可以看到sql 执行情况_logback.xml sql ???-程序员宅基地

文章浏览阅读2.4k次。新建一个名为 logback.xml 的文件 内容如下 :&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;configuration&gt; &lt;include resource="org/springframework/boot/logging/logback/base.xml"/&gt; &lt;l_logback.xml sql ???

大数据-Flume(分布式日志收集框架)_远程分布式日志收集框架-程序员宅基地

文章浏览阅读1k次。Flume安装前置条件 Java Runtime Environment - Java 1.7 or later Memory - Sufficient memory for configurations used by sources, channels or sinks Disk Space - Sufficient disk space for configurations..._远程分布式日志收集框架

随便推点

动态规划之0-1背包问题_0-1背包满足最优子结构特性-程序员宅基地

文章浏览阅读940次。问题描述 0−1背包问题是应用动态规划设计求解的典型例题 已知n种物品和一个可容纳c重量的背包,物品i的重量为w[i],产生的效益为p[i]。在装包时物品i可以装入,也可以不装,但不可拆开装。 问如何装包,所得装包总效益最大。算法分析 最优子结构特性 0−1背包的最优解具有最优子结构特性。 与一般背包问题不同,0−1背包问题要求 即物品i不能折开,或者整体装入,或者不装。当约定每件物品_0-1背包满足最优子结构特性

Hybrid移动应用在多页面大数据复杂业务背景下的优化实践方案_hybrid 大数据-程序员宅基地

文章浏览阅读2.7k次。前言对于混合应用而言,性能问题一直被吐槽,虽然设备的内存的不断增大,很大程度上缓解了这个一问题,但是和原生应用来讲还是有很大区别,本人从Phonegap2.x开始,一直的探索和使用混合应用技术。当时的2.x性能真是不怎么样,首次加载时间也比较长,后来phonegap被apache纳入旗下以后,更名为Cordova,可以说从此以后,性能问题得到了很大的改善,占用内存也越来越小,到如今使用的版本已经变为_hybrid 大数据

炬力北方AM8360D无线图传介绍_am8360d升级-程序员宅基地

文章浏览阅读73次。为了优化和普及无线显示,炬力北方提供具有高质量图像、小 尺寸、低延迟、低功耗以及更具性价比的无线显示解决方案。AM8360D支持1080P60Hz以及4K30Hz.AM8360D是炬力北方为无线化图传提供解决方案。支持即插即用,兼容多种设备,复制或者拓展屏幕。不论您是在家庭娱乐、办公会议,还是教育演示,这款投屏器能轻松应对各种场景。稳定可靠,兼容性强,让您的投屏体验更上一层楼。开发与支持服务:QQ: 670976930 微信号:X4263478。_am8360d升级

Opencv(C++)学习 之RV1126平台的OPENCV交叉编译_cmake rv1126-程序员宅基地

文章浏览阅读1k次,点赞22次,收藏20次。1、使用cmake-gui工具,在ubuntu18x64环境下,交叉编译RV1126平台的OPENCV4.7_cmake rv1126

推荐收藏 | 论文写作步骤大拆解-程序员宅基地

文章浏览阅读119次。摘要,又称内容提要,顾名思义,是对文章提纲挈领的简要陈述,是全文的高度概括和浓缩。有些论文,为了国际交流,还应有外文(主要是英文)摘要。摘要的基本要素包括该项研究的背景、目的、内容、方法、结果、结论及其意义等,但不一定面面俱到,一般应以背景和内容为主。如果有突破性的创新观点和见解,是应该重点提及的。摘要应该内容精练、语义准确、结构严谨、前后呼应,可以独立成篇。语言应简洁明快、言简意赅,多用单句,慎用长句。

python毕设 坦克大战小游戏设计与实现 (源码)_用python做射击游戏附代码-程序员宅基地

文章浏览阅读130次。 Hi,各位同学好呀,这里是L学长!今天向大家分享一个今年(2022)最新完成的毕业设计项目作品python小游戏毕设 坦克大战小游戏设计与实现 (源码) 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分)难度系数:3分工作量:3分创新点:4分《坦克大战》是由日本南梦宫Namco游戏公司开发的一款平面射击游戏,于1985年发售。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。_用python做射击游戏附代码

推荐文章

热门文章

相关标签