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());
}
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);
}
}
});
//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();
}
文章浏览阅读396次。安装和初步使用 nn-Meter_nn-meter部署
文章浏览阅读634次。消息队列RabbitMQ介绍和使用_rabbitmq消费端 使用 class
文章浏览阅读118次。DQL语句之分组查询:group byselect 字段列表 from 表名 group by 分组字段名称;注意事项:1) 查询的字段列表中可以使用 分组字段 ;2) group by之后不能使用聚合函数 ;3) 带条件分组查询的语法: where 条件必须放在group by 之前,否则语法错误! ;4) select 字段列表包含分组字段,聚合函数.. from 表名 where 条件 group by 分组字段 ;DQL语句之筛选查询:havingselect 字段列_mysql备份筛选数据
文章浏览阅读74次。我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优..._使用datareader类或dataset类从该表中查询所有学生的所有信息
文章浏览阅读2.4k次。新建一个名为 logback.xml 的文件 内容如下 :<?xml version="1.0" encoding="UTF-8"?><configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <l_logback.xml sql ???
文章浏览阅读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..._远程分布式日志收集框架
文章浏览阅读940次。问题描述 0−1背包问题是应用动态规划设计求解的典型例题 已知n种物品和一个可容纳c重量的背包,物品i的重量为w[i],产生的效益为p[i]。在装包时物品i可以装入,也可以不装,但不可拆开装。 问如何装包,所得装包总效益最大。算法分析 最优子结构特性 0−1背包的最优解具有最优子结构特性。 与一般背包问题不同,0−1背包问题要求 即物品i不能折开,或者整体装入,或者不装。当约定每件物品_0-1背包满足最优子结构特性
文章浏览阅读2.7k次。前言对于混合应用而言,性能问题一直被吐槽,虽然设备的内存的不断增大,很大程度上缓解了这个一问题,但是和原生应用来讲还是有很大区别,本人从Phonegap2.x开始,一直的探索和使用混合应用技术。当时的2.x性能真是不怎么样,首次加载时间也比较长,后来phonegap被apache纳入旗下以后,更名为Cordova,可以说从此以后,性能问题得到了很大的改善,占用内存也越来越小,到如今使用的版本已经变为_hybrid 大数据
文章浏览阅读73次。为了优化和普及无线显示,炬力北方提供具有高质量图像、小 尺寸、低延迟、低功耗以及更具性价比的无线显示解决方案。AM8360D支持1080P60Hz以及4K30Hz.AM8360D是炬力北方为无线化图传提供解决方案。支持即插即用,兼容多种设备,复制或者拓展屏幕。不论您是在家庭娱乐、办公会议,还是教育演示,这款投屏器能轻松应对各种场景。稳定可靠,兼容性强,让您的投屏体验更上一层楼。开发与支持服务:QQ: 670976930 微信号:X4263478。_am8360d升级
文章浏览阅读1k次,点赞22次,收藏20次。1、使用cmake-gui工具,在ubuntu18x64环境下,交叉编译RV1126平台的OPENCV4.7_cmake rv1126
文章浏览阅读119次。摘要,又称内容提要,顾名思义,是对文章提纲挈领的简要陈述,是全文的高度概括和浓缩。有些论文,为了国际交流,还应有外文(主要是英文)摘要。摘要的基本要素包括该项研究的背景、目的、内容、方法、结果、结论及其意义等,但不一定面面俱到,一般应以背景和内容为主。如果有突破性的创新观点和见解,是应该重点提及的。摘要应该内容精练、语义准确、结构严谨、前后呼应,可以独立成篇。语言应简洁明快、言简意赅,多用单句,慎用长句。
文章浏览阅读130次。 Hi,各位同学好呀,这里是L学长!今天向大家分享一个今年(2022)最新完成的毕业设计项目作品python小游戏毕设 坦克大战小游戏设计与实现 (源码) 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分)难度系数:3分工作量:3分创新点:4分《坦克大战》是由日本南梦宫Namco游戏公司开发的一款平面射击游戏,于1985年发售。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。_用python做射击游戏附代码