当前位置:首页 » 安卓系统 » android读写xml文件

android读写xml文件

发布时间: 2024-07-06 18:16:51

❶ Android灏哖PT镙煎纺镄刋ML鏁版嵁瑙f瀽锛屽苟瀹炵幇婕旂ず

涓銆俿imple-xml绗涓夋柟jar鍖呰В鏋恱ml镙煎纺鏁版嵁
simple-xml鏄涓涓獂ml鍜屽硅薄浜掕浆镎崭綔宸ュ叿鍖咃纴瀹樻柟缃戝潃涓猴细http://simple.sourceforge.net/锛宩ar鍖呭彲浠ュ埌瀹樼绣涓娄笅杞斤纴绗旇呬娇鐢ㄧ殑鏄鐩鍓嶆渶鏂扮増链镄刯ar鍖咃纴钖崭负simple-xml-2.7.1.jar锛涘帘璇濅笉澶氲翠简锛屼唬镰佹墠鏄链鐪熷疄闱犺氨镄勫姏璇併
涓嬮溃鏄鏁翠釜Demo宸ョ▼鏂囦欢鎴锲撅纴濡备笅锲撅细

璇Demo涓昏佹槸阃氲繃simple-xml瑙f瀽assets鐩褰曚腑镄刣ata.xml鏂囦欢鍐呭规暟鎹锛岀劧钖庢樉绀哄嚭𨱒ワ绂
1.data.xml鏂囦欢鍐呭瑰备笅锛

[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<resources>
<?xml version="1.0" encoding="utf-8"?>
<dataContent>
<group>
<groupID>1</groupID>
<groupName>绗涓缁</groupName>
<member>
<name>寮犱笁</name>
<age>22</age>
</member>
<member>
<name>𨱒庡洓</name>
<age>24</age>
</member>
<member>
<name>娆ч槼闆</name>
<age>18</age>
</member>
</group>
<group>
<groupID>2</groupID>
<groupName>绗浜岀粍</groupName>
<member>
<name>鍙稿缅闱</name>
<age>19</age>
</member>
<member>
<name>鍙剁瑱</name>
<age>26</age>
</member>
<member>
<name>𨱒ㄩ</name>
<age>25</age>
</member>
</group>
<group>
<groupID>3</groupID>
<groupName>绗涓夌粍</groupName>
<member>
<name>鐜嬮緳</name>
<age>32</age>
</member>
<member>
<name>瑗块棬鑳灭敺</name>
<age>21</age>
</member>
<member>
<name>寮犻摤</name>
<age>45</age>
</member>
</group>
</dataContent>

</resources>
阃氲繃涓婇溃镄勬枃浠跺唴瀹癸纴鎴戜滑鐭ラ亾锛岃繖涓鏂囦欢鍐呭逛富瑕佹湁涓夌粍鏁版嵁锛屾疮缁勬暟鎹链変釜涓変釜鎴愬憳缁勶纴姣忎釜鎴愬憳缁勯兘链夊悕瀛楀拰骞撮缎杩欎袱涓瀛愬厓绱犮侱emo涓灏呜繖浜涜В鏋愬嚭𨱒ュ唴瀹归氲繃ExpandableListView鏄剧ず鍑烘潵銆

2.涓婚〉闱MainActivity浠g爜濡备笅锛

[java] view plain
package com.steven.android.simple.xml.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.simpleframework.xml.core.Persister;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.widget.ExpandableListView;
import com.steven.android.simple.xml.adapter.ExpandAdapter;
import com.steven.android.simple.xml.parse.DataParseResponse;
/**
* 鎻忚堪锛氢富椤甸溃
* @author stevenhu223
*
*/
public class MainActivity extends Activity {

private final String TAG = "MainActivity";
private ExpandableListView mExpandableListView;
private ExpandAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExpandableListView = (ExpandableListView) findViewById(R.id.expanlist_content);
try {
matchAndParseData();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

/**
* 鍖归厤銮峰彇鍜岃В鏋恱ml鏂囦欢鍐呭
* @throws Exception
*/
private void matchAndParseData() throws Exception {
InputStream inputStream = getResources().getAssets().open("data.xml");
String dataContent = convertStreamToString(inputStream);
String content = "";
//姝e垯琛ㄨ揪寮忓尮閰
Pattern DATA_PATTERN= Pattern.compile("[\\S\\s]*(<dataContent>[\\s\\S]*</dataContent>)[\\s\\S]*");
Matcher matcher = DATA_PATTERN.matcher(dataContent);
if (matcher.matches()) {
//銮峰彇鍖呭惈dataContent鍏幂礌镄勫唴瀹
content = matcher.group(1);
}
if (!TextUtils.isEmpty(content)) {
DataParseResponse dataResponse = parseToBean(DataParseResponse.class, content);
mAdapter = new ExpandAdapter(this, dataResponse.mGroupEntities);
mExpandableListView.setAdapter(mAdapter);
}
}

/**
* 灏唜ml鏂囦欢鍐呭硅В鏋愭垚瀹炰綋绫

❷ 怎么打开android项目里的 main.xml文件

从源文件!打开方式用记事本!或者导入到开发工具里面双击就打开了。

main.xml在源代码源码如下:

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//R.layout.main,就是在R.java中的R类定义的layout中main,格式为:R.layout.<layout的xml文件名字>,就是对应的res/layout/main.xml文件。
setContentView(R.layout.main);
TextView myTextView = (TextView) findViewById(R.id.myTextView);
myTextView.setText("我的Activity");
Button myButton = (Button) findViewById(R.id.myButton);
myButton.setText("我的按钮");
}

❸ 在android中怎么使用pullparse解析.xml文件

Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

按以下步骤进行操作:
[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="20110806100">
<name>小明</name>
<age>22</age>
<sex>男</sex>
</student>
<student id="20110806101">
<name>小李</name>
<age>24</age>
<sex>男</sex>
</student>
<student id="20110806102">
<name>小丽</name>
<age>21</age>
<sex>女</sex>
</student>
</students>

[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。
[html] view plain
package com.andyidea.entity;

public class Student {

private String id;
private String name;
private int age;
private String sex;

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}

[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。
[html] view plain
package com.andyidea.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Xml;

import com.andyidea.entity.Student;

public class ParserByPULL {

//采用XmlPullParser来解析XML文件
public static List<Student> getStudents(InputStream inStream) throws Throwable
{
List<Student> students = null;
Student mStudent = null;

//========创建XmlPullParser,有两种方式=======
//方式一:使用工厂类XmlPullParserFactory
XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = pullFactory.newPullParser();
//方式二:使用Android提供的实用工具类android.util.Xml
//XmlPullParser parser = Xml.newPullParser();

//解析文件输入流
parser.setInput(inStream, "UTF-8");
//产生第一个事件
int eventType = parser.getEventType();
//只要不是文档结束事件,就一直循环
while(eventType!=XmlPullParser.END_DOCUMENT)
{
switch (eventType)
{
//触发开始文档事件
case XmlPullParser.START_DOCUMENT:
students = new ArrayList<Student>();
break;
//触发开始元素事件
case XmlPullParser.START_TAG:
//获取解析器当前指向的元素的名称
String name = parser.getName();
if("student".equals(name))
{
//通过解析器获取id的元素值,并设置student的id
mStudent = new Student();
mStudent.setId(parser.getAttributeValue(0));
}
if(mStudent!=null)
{
if("name".equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudent.setName(parser.nextText());
}
if("age".equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudent.setAge(new Short(parser.nextText()));
}
if("sex".equals(name))
{
//获取解析器当前指向元素的下一个文本节点的值
mStudent.setSex(parser.nextText());
}
}
break;
//触发结束元素事件
case XmlPullParser.END_TAG:
//
if("student".equals(parser.getName()))
{
students.add(mStudent);
mStudent = null;
}
break;
default:
break;
}
eventType = parser.next();
}
return students;
}

❹ Android绯荤粺涓镄勬暟鎹瀛桦偍链夊摢浜涙柟寮


Android绯荤粺涓镄勬暟鎹瀛桦偍链夊摢浜涙柟寮忥纻
Android鏄鐩鍓嶅叏鐞冧娇鐢ㄦ渶骞挎硾镄勭Щ锷ㄦ搷浣灭郴缁熶箣涓锛屽叾寮哄ぇ镄勬暟鎹瀛桦偍链哄埗浣垮缑寮鍙戣呭彲浠ヨ交𨱒惧湴灏嗙敤鎴锋暟鎹淇濆瓨鍦ㄨ惧囦腑锛屼互渚垮簲鐢ㄧ▼搴忛殢镞跺彲浠ヨ诲彇鍜屽啓鍏ャ傞偅涔埚湪Android涓锛屾暟鎹瀛桦偍鍙堟湁鍝浜涙柟寮忓憿锛
1.SharedPreferences
SharedPreferences鏄疉ndroid涓鐢ㄤ簬淇濆瓨杞婚噺绾ч敭鍊煎规暟鎹镄勫伐鍏凤纴鍙浠ョ敤浜庝缭瀛樼敤鎴风殑棣栭夐”璁剧疆銆佺橱褰曚俊鎭銆佸簲鐢ㄧ▼搴忛厤缃绛夐渶姹伞傚畠锘轰簬XML鏂囦欢瀹炵幇锛屽彲浠ュ疄鐜板揩阃熺殑璇诲啓镎崭綔锛岄傚悎瀛桦偍涓浜涚亩鍗旷殑鏁版嵁銆
2.SQLite鏁版嵁搴
SQLite鏄涓绉嶈交鍨嬫暟鎹搴掳纴甯哥敤浜庡湪绉诲姩璁惧囦腑瀛桦偍缁撴瀯鍖栨暟鎹锛屽寘𨰾鐢ㄦ埛璐︽埛淇℃伅銆佽仈绯讳汉銆佹秷鎭璁板綍銆佹棩铡嗙瓑銆係QLite鏁版嵁搴揿唴缃浜峣ndroid绯荤粺涓锛屾彁渚涗简澶ч噺镄𪞝PI鎺ュ彛锛屼娇寰楀紑鍙戜汉锻桦彲浠ヨ交𨱒惧湴杩涜屾暟鎹镄勫瓨鍌ㄥ拰璁块梾銆
3.鏂囦欢瀛桦偍
Android鎻愪緵浜嗕竴绉嶅熀浜庢枃浠剁殑鏁版嵁瀛桦偍鏂规硶锛屽彲浠ュ皢鏁版嵁淇濆瓨鍦ㄨ惧囩殑鍐呯疆瀛桦偍鍣ㄦ垨澶栭儴瀛桦偍鍣ㄤ笂锛屼互鏂囦欢褰㈠纺杩涜屽瓨鍌ㄣ傛ょ嶆柟寮忛傜敤浜庡瓨鍌ㄤ竴浜涢潪缁撴瀯鍖栨暟鎹锛屼緥濡傚浘鐗囥侀煶棰戙佽嗛戠瓑銆
4.ContentProvider
ContentProvider鏄涓绉嶅疄鐜痨ndroid鏁版嵁鍏变韩镄勬満鍒讹纴鍏佽镐笉钖屽簲鐢ㄧ▼搴忎箣闂村叡浜鏁版嵁銆备篃鍙浠ュ湪澶氢釜缁勪欢涔嬮棿鍏变韩鏁版嵁锛屼緥濡傚湪Activity鍜孲ervice涔嬮棿鍏变韩鏁版嵁銆侰ontentProvider阃氩父鐢ㄤ簬瀛桦偍闱炲父閲嶈佺殑鏁版嵁锛屼緥濡傝仈绯讳汉淇℃伅銆佹棩铡嗕簨浠躲佸獟浣撴枃浠剁瓑銆
5.RoomPersistenceLibrary
RoomPersistenceLibrary鏄疓oogle鍦ˋndroid骞冲彴涓娄负寮鍙戜汉锻樻彁渚涚殑涓绉嶈交閲忕骇銆佺亩娲佺殑ORM妗嗘灦锛岀敤浜庣$悊SQLite鏁版嵁搴扑腑镄勭粨鏋勫寲鏁版嵁銆俣oom搴撶亩鍖栦简Android搴旂敤绋嫔簭涓鏁版嵁镄勫勭悊锛屼粠钥屼娇寰楀紑鍙戜汉锻桦彲浠ヨ交𨱒惧湴杩涜屽畨鍏ㄣ佷竴镊村拰楂樻晥镄勬暟鎹瀛桦偍镎崭綔銆
缁间笂镓杩帮纴Android鎻愪緵浜嗗氱嶆暟鎹瀛桦偍鏂瑰纺锛屽紑鍙戜汉锻桦彲浠ユ牴鎹闇姹傝繘琛岄夋嫨锛屼緥濡係haredPreferences阃傜敤浜庡瓨鍌ㄨ交閲忕骇镄勬暟鎹锛孲QLite鏁版嵁搴挞傜敤浜庡瓨鍌ㄧ粨鏋勫寲鏁版嵁锛屾枃浠跺瓨鍌ㄩ傜敤浜庡瓨鍌ㄥぇ鍨嫔獟浣撴枃浠讹纴ContentProvider阃傜敤浜庡疄鐜板叡浜鏁版嵁锛岃孯oomPersistenceLibrary鍒欐槸涓绉岖亩渚跨殑ORM妗嗘灦锛岄傜敤浜庣$悊SQLite鏁版嵁搴扑腑镄勭粨鏋勫寲鏁版嵁銆傞夋嫨钖堥傜殑鏁版嵁瀛桦偍鏂瑰纺鍙浠ユ洿濂藉湴绠$悊鍜岀淮鎶Android搴旂敤绋嫔簭涓镄勬暟鎹銆

❺ android中怎么解析复杂的xml文件

本文主要讲解Android开发中如何对XML文件的解析,由于XML文件具有与平台无关,广泛应用于数据通信中,因此解析XML文件就显得很有意义。Android对XML文件解析的方法主要有3种。 通常有三种方式:DOM、SAX和PULL,下面就分别针对这三种方式来进行讨论。

文件内容如下所示:
那么就是要对此XML文件做解析。下面我们就分别用DOM,SAX和PULL三种方式,分别对此XML文件做解析。

DOM方式

DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。由DOM解析的方式可以知道,如果XML文件很大的时候,处理效率就会变得比较低,这也是DOM方式的一个缺点。
现在我们来解析上文中提到的有关天气预报信息相关的xml文件。什么是解析呢?说的通俗一点,就是将这个带标签的XML文件识别出来,并抽取一些相关的,对我们有用的信息来给我们使用。那在这个文件里,时间,天气,温度,以及图标对我们来说是需要得到的。我们要对其做解析。
解析的具体思路是:
1. 将XML文件加载进来。
2. 获取文档的根节点
3. 获取文档根节点中所有子节点的列表
4. 获取子节点列表中需要读取的节点信息
根据这4个步骤,我们进行开发:
首先就是如何加载XML文件,假设此文件来源于网络。

SAX方式

SAX是Simple API for XML的缩写。是一个包也可以看成是一些接口。
相比于DOM而言SAX是一种速度更快,更有效,占用内存更少的解析XML文件的方法。它是逐行扫描,可以做到边扫描边解析,因此SAX可以在解析文档的任意时刻停止解析。非常适用于Android等移动设备。
SAX是基于事件驱动的。所谓事件驱动就是说,它不用解析完整个文档,在按内容顺序解析文档过程中,SAX会判断当前读到的字符是否符合XML文件语法中的某部分。如果符合某部分,则会触发事件。所谓触发事件,就是调用一些回调方法。当然android的事件机制是基于回调方法的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口。
这四个接口的详细说明如下:

事件处理器名称

事件处理器处理的事件

XMLReader注册方法

ContentHander

XML文档的开始与结束,
XML文档标签的开始与结束,接收字符数据,跳过实体,接收元素内容中可忽略的空白等。

setContentHandler(ContentHandler h)

DTDHander

处理DTD解析时产生的相应事件

setDTDHandler(DTDHandler h)

ErrorHandler

处理XML文档时产生的错误

setErrorHandler(ErrorHandler h)

EntityResolver

处理外部实体

setEntityResolver(EntityResolver e)

我们用来做内容解析的回调方法一般都定义在ContentHandler接口中。
ContentHandler接口常用的方法:
startDocument()
当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()
当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName,String qName, Attributes atts)
当读到开始标签的时候,会调用这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。
endElement(String uri, String localName, String name)
在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)
这个方法用来处理在XML文件中读到的内容。例如:<high data="30"/>主要目的是获取high标签中的值。
第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
注意:
SAX的一个重要特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下之前所碰到的标签,即在startElement()方法中,所有能够知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不知道的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM方便。
现在我们截取一段XML文件来做解析,其调用方法是这样的:
<?xml version="1.0"?> ----------> startDocument()
<weather> ----------> startElement
<forecast_information> ----------> startElement
<city> ----------> startElement
beijing ----------> characters
</city> ----------> endElement
</forecast_information > ----------> endElement
</weather > ----------> endElement
文档结束 ----------> endDocument()
SAX的解析步骤:
首先需要注意的是:
SAX还为其制定了一个Helper类:DefaultHandler它实现了ContentHandler这个接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重载相应的方法即可。
使用SAX解析XML文件一般有以下五个步骤:
1、创建一个SAXParserFactory对象;
2、调用SAXParserFactory中的newSAXParser方法创建一个SAXParser对象;
3、然后在调用SAXParser中的getXMLReader方法获取一个XMLReader对象;
4、实例化一个DefaultHandler对象
5、连接事件源对象XMLReader到事件处理类DefaultHandler中
6、调用XMLReader的parse方法从输入源中获取到的xml数据
7、通过DefaultHandler返回我们需要的数据集合。
我们仍然来解析上述那个天气预报的XML文件。
编写代码如下:

[java] view plain
mySAX.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
try{
String url = "http://www.google.com/ig/api?&weather=beijing";
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest req = new HttpGet(url);
HttpResponse resp = client.execute(req);
HttpEntity ent = resp.getEntity();
InputStream stream = ent.getContent(); //将文件导入流,因此用InputStream

SAXParserFactory saxFactory = SAXParserFactory.newInstance(); //获取一个对象
SAXParser saxParser = saxFactory.newSAXParser();//利用获取到的对象创建一个解析器
XMLContentHandler handler = new XMLContentHandler();//设置defaultHandler
saxParser.parse(stream, handler);//进行解析
stream.close();//关闭流
/*XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); //获取一个XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(stream));
stream.close();*/
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public class XMLContentHandler extends DefaultHandler {
private static final String TAG = "XMLContentHandler";

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.i(TAG, "解析内容:"+new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i(TAG, "文档解析完毕。");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG, localName+"解析完毕");
}
@Override
public void startDocument() throws SAXException {
Log.i(TAG, "开始解析... ...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "解析元素:"+localName);

if(localName.equals("high")){
Log.i(TAG, "解析元素:"+localName);
i++;
if(i==2){
highestTmp.setText(String.valueOf((Integer.parseInt(attributes.getValue(0))-32)*5/9));
}
}
}
}

上面的那段注释:

[java] view plain
/*XMLReader xmlReader =saxFactory.newSAXParser().getXMLReader(); //获取一个XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(newInputSource(stream));
stream.close();*/

是用XMLReader来做解析的另外一种方法。效果是一样的。这里可以传流,也可以传一个字符串,如下所示:是传字符串。
[java] view plain
xmlReader.parse(new InputSource(new StringReader(xmlStr)));
PULL方式
除了可以使用 SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它也是事件触发的。Pull解析方式让应用程序完全控制文档该怎么样被解析。比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。
Pull解析是一个遍历文档的过程,每次调用next(),nextTag(), nextToken()和nextText()都会向前推进文档,并使Parser停留在某些事件上面,但是不能倒退。然后把文档设置给Parser。
Android中对Pull方法提供了支持的API,主要是
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserFactory;
二个类,其中主要使用的是XmlPullParser,XmlPullParserFactory是一个工厂,用于构建XmlPullParser对象。
应用程序通过调用XmlPullParser.next()等方法来产生Event,然后再处理Event。
我们仍然拿上述天气预报的XML文件的一部分来做例子。
例如:需要解析的XML文件是:

[java] view plain
<forecast_conditions>
<day_of_week data="周三"/>
<low data="22"/>
<high data="29"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="可能有雨"/>
</forecast_conditions>

这部分XML文件中day_of_week,low,high等是TAG,data是ATTRIBUTEA。当然,如果有<></>夹在开始和结束符号之间的部分,则为TXET。
要想解析文档先要构建一个XmlPullParser对象。

[java] view plain
final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
final XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader("xmlStr");

这里的xmlStr就是上边的XML文件。
此时,文档刚被初始化,所以它应该位于文档的开始,事件为START_DOCUMENT,可以通过XmlPullParser.getEventType()来获取。然后调用next()会产生
START_TAG,这个事件告诉应用程序一个标签已经开始了,调用getName()会返回" day_of_week ";若有TEXT,则再next()会产生TEXT事件,调用getText()会返回TEXT,由于此处没有,所以再next(),会产生END_TAG,这个告诉你一个标签已经处理完了,再next()直到最后处理完TAG,会产生END_DOCUMENT,它告诉你整个文档已经处理完成了。除了next()外,nextToken()也可以使用,只不过它会返回更加详细的事件,比如COMMENT, CDSECT, DOCDECL, ENTITY等等非常详细的信息。如果程序得到比较底层的信息,可以用nextToken()来驱动并处理详细的事件。需要注意一点的是TEXT事件是有可能返回空白的White Spaces比如换行符或空格等。
nextTag()--会忽略White Spaces,如果可以确定下一个是START_TAG或END_TAG,就可以调用nextTag()直接跳过去。通常它有二个用处:当START_TAG时,如果能确定这个TAG含有子TAG,那么就可以调用nextTag()产生子标签的START_TAG事件;当END_TAG时,如果确定不是文档结尾,就可以调用nextTag()产生下一个标签的START_TAG。在这二种情况下如果用next()会有TEXT事件,但返回的是换行符或空白符。
nextText()--只能在START_TAG时调用。当下一个元素是TEXT时,TEXT的内容会返回;当下一个元素是END_TAG时,也就是说这个标签的内容为空,那么空字串返回;这个方法返回后,Parser会停在END_TAG上。

小结一下,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正合适。
当点击三种方式的任何一个按钮时,均能够得到相同的结果

❻ android中用xmlpullparser解析xml文件,以及res/raw和assets的不同

XML:可扩展标记语言
读XML,XML文件的解析

三种解析XML的文件的方式
1.SAX事件驱动不是一次性加载到内存
2.DOM一次加载到内存,性能较差适合服务器端编程
3.XMLPULL适应嵌入式设备,占用内存较小API相对简单

OpenAPI

JSON:相对于XML格式,更节省空间。
1)大括号开始结束{}
2)内容部分每条数据以“,”分隔
3)每条数据由键值对构成,key必须是字符串“”
4)值可以是:String、double、int、long、boolean、
jsonObject、jsonArray

把要解析的XML文件放在assets目录下,这里解释下

res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
读取文件资源:
1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
·InputStreamis=getResources().openRawResource(R.id.filename);
2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作
·AssetManageram=null;
·am=getAssets();
·InputStreamis=am.open("filename");
注意1:Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常,raw没这个限制可以放个4MB的Mp3文件没问题。

注意2:assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片,html,js,css等文件。
解析如下文件


1

2

3

4

5

6

7

8<TextView

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_alignTop="@+idtton1"

android:text="LargeText"

android:textAppearance="?android:attr/textAppearanceLarge"/>

代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20XmlPullParserpullParser=Xml.newPullParser();//得到XML解析器

AssetManagerassetManager=getAssets();//文件保存在assets目录下,得到assetManager管理器

InputStreamis;

try

{

is=assetManager.open("activity_main.xml");//打开文件,得到输入流

pullParser.setInput(is,"utf-8");//StringinputEncoding格式

inteventType=pullParser.getEventType();//得到事件类型

while(eventType!=XmlPullParser.END_DOCUMENT)//文档的末尾

{//遍历内部的内容

Stringname=pullParser.getName();

if("TextView".equals(name))

{

Stringvalue=pullParser.getAttributeValue(2);//得到属性值(位置)

textView.setText("显示结果为:"+value);

break;/到就返回

}

eventType=pullParser.next();//读取下一个标签

}

}


显示结果为:

热点内容
上传gif搜索 发布:2024-11-26 06:27:05 浏览:762
linux用户组文件 发布:2024-11-26 06:26:58 浏览:88
java接口编程 发布:2024-11-26 06:25:23 浏览:154
幂等编程 发布:2024-11-26 06:24:45 浏览:535
数独游戏编程 发布:2024-11-26 06:16:08 浏览:584
平板锁屏密码是什么 发布:2024-11-26 06:16:06 浏览:218
安卓怎么看应用程序数量 发布:2024-11-26 06:11:51 浏览:376
海信u7a怎么调出配置 发布:2024-11-26 06:06:05 浏览:90
无法查找服务器ip地址 发布:2024-11-26 06:03:34 浏览:539
租用云服务器需要专业知识吗 发布:2024-11-26 05:58:04 浏览:560