android讀取xml
A. android中怎麼讀取xml節點文本然後一條一條地顯示在TextView中
首先這是兩個問題
讀取xml節點是一個問題,顯示在textview中又是一個問題
先以以已經讀出來了一條xml文件的節點為例
textview的顯示詳細說明一下
首先在textview上下加入ScrollView以便有滾動條顯示
設置好之後節點內的信息就會分行的顯示出來了。並且有換行的,每個節點顯示一行
B. android怎麼從xml文件裡面提取數據
一、環境:
主機:WIN8
開發環境:Eclipse
二、說明:
1.打開sd卡中的xml文件,如果不存在,這新建一個,並寫入默認配置
2.讀取xml文件
三、xml文件格式:
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<config>
<title>遠程視頻會見系統</title>
<local_port>12600</local_port>
<schele_service_ip>10.58.1.59</schele_service_ip>
<schele_service_port>12601</schele_service_port>
</config>
四、源代碼:
package com.example.helloanychat;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import android.os.Environment;
import android.util.Log;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
/**
* 配置信息類
* 新建日期:2014/12/8 by jdh
*/
public class Config implements IF_Config {
//配置信息
private Config_Info config_info = new Config_Info();
/**
* 構造函數
*/
public Config() {
boolean ok;
File sd_path;
File file_cfg_dir;
File file_cfg;
FileOutputStream out;
String str;
FileInputStream in;
//得到本機ip地址
config_info.local_ip = getLocalIpAddress();
System.out.printf("本機ip:%s\n", config_info.local_ip);
//獲取SD卡目錄
sd_path = Environment.getExternalStorageDirectory();
//判斷文件夾是否存在
file_cfg_dir = new File(sd_path.getPath() + "//Remote_Meeting");
if (!file_cfg_dir.exists() && !file_cfg_dir.isDirectory()) {
System.out.println("配置文件夾Remote_Meeting不存在!");
ok = file_cfg_dir.mkdirs();
if (ok) {
System.out.println("創建文件夾成功!");
} else {
System.out.println("創建文件夾失敗!");
}
}
//判斷配置文件是否存在
file_cfg = new File(file_cfg_dir.getPath(),"cfg.xml");
if (!file_cfg.exists())
{
System.out.println("配置文件cfg.xml不存在!");
try {
file_cfg.createNewFile();
System.out.println("創建文件cfg.xml成功!");
//生成初始化的配置數據
try {
out = new FileOutputStream(file_cfg);
//保存默認配置
config_info.title = "遠程視頻會見系統";
config_info.local_port = 12600;
config_info.schele_server_ip = "10.58.1.59";
config_info.schele_server_port = 12601;
str = proce_xml_string(config_info);
out.write(str.getBytes());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
config_info.title = "遠程";
config_info.local_port = 126;
config_info.schele_server_ip = "10.5";
config_info.schele_server_port = 12;
System.out.printf("----222222222%s,%d,%s,%d\n",config_info.title,config_info.local_port,
config_info.schele_server_ip,config_info.schele_server_port);
//解析xml文件
try {
in = new FileInputStream(file_cfg);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(in);
// 獲取根節點
Element root = document.getDocumentElement();
NodeList node = root.getChildNodes();
//獲得第1子節點:標題
config_info.title = node.item(0).getFirstChild().getNodeValue();
//獲得第2子節點:本機埠
config_info.local_port = Integer.parseInt(node.item(1).getFirstChild().getNodeValue());
//獲得第3子節點:調度伺服器ip
config_info.schele_server_ip = node.item(2).getFirstChild().getNodeValue();
//獲得第4子節點:調度伺服器埠
config_info.schele_server_port = Integer.parseInt(node.item(3).getFirstChild().getNodeValue());
System.out.printf("----222222222%s,%d,%s,%d\n",config_info.title,config_info.local_port,
config_info.schele_server_ip,config_info.schele_server_port);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Config_Info get_config_info() {
return config_info;
}
/**
* 得到本機ip地址
* @return 本機ip地址
*/
private String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
//if (!inetAddress.isLoopbackAddress()) {
if (!inetAddress.isLoopbackAddress() && !(inetAddress instanceof Inet6Address)) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
/**
* 生成xml配置文件的String數據流
* Config_Info的本機ip信息不會保存
* @param info:配置信息
* @return xml的String數據流
*/
private String proce_xml_string(Config_Info info) {
StringWriter stringWriter = new StringWriter();
try {
// 獲取XmlSerializer對象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer xmlSerializer = factory.newSerializer();
// 設置輸出流對象
xmlSerializer.setOutput(stringWriter);
//開始標簽
xmlSerializer.startDocument("utf-8", true);
xmlSerializer.startTag(null, "config");
//標題
xmlSerializer.startTag(null, "title");
xmlSerializer.text(info.title);
xmlSerializer.endTag(null, "title");
//本機埠
xmlSerializer.startTag(null, "local_port");
xmlSerializer.text(Integer.toString(info.local_port));
xmlSerializer.endTag(null, "local_port");
//調度伺服器ip
xmlSerializer.startTag(null, "schele_service_ip");
xmlSerializer.text(info.schele_server_ip);
xmlSerializer.endTag(null, "schele_service_ip");
//調度伺服器埠
xmlSerializer.startTag(null, "schele_service_port");
xmlSerializer.text(Integer.toString(info.schele_server_port));
xmlSerializer.endTag(null, "schele_service_port");
xmlSerializer.endTag(null, "config");
xmlSerializer.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
return stringWriter.toString();
}
}
C. android裡面怎麼解析xml
Android解析xml文件總共有三種方法,分別是:
SAX解析XML文件:SAX是一個解析速度快並且佔用內存少的xml解析器,非常適合用於Android等移動設備。SAX解析XML文件採用的是事件驅動,也就是說,它並不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字元是否合法XML語法中的某部分,如果符合就會觸發事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler介面。如下代碼:
publicstaticList<Person>readXML(InputStreaminStream){
try{
//創建解析器
SAXParserFactoryspf=SAXParserFactory.newInstance();
SAXParsersaxParser=spf.newSAXParser();
//設置解析器的相關特性,true表示開啟命名空間特性
saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandlerhandler=newXMLContentHandler();
saxParser.parse(inStream,handler);
inStream.close();
returnhandler.getPersons();
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
//SAX類:DefaultHandler,它實現了ContentHandler介面。在實現的時候,只需要繼承該類,重載相應的方法即可。
{
privateList<Person>persons=null;
privatePersoncurrentPerson;
privateStringtagName=null;//當前解析的元素標簽
publicList<Person>getPersons(){
returnpersons;
}
//接收文檔開始的通知。當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
@Override
publicvoidstartDocument()throwsSAXException{
persons=newArrayList<Person>();
}
//接收元素開始的通知。當讀到一個開始標簽的時候,會觸發這個方法。其中namespaceURI表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);qName表示元素的限定名(帶前綴);atts表示元素的屬性集合
@Override
publicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)throwsSAXException{
if(localName.equals("person")){
currentPerson=newPerson();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}
this.tagName=localName;
}
//接收字元數據的通知。該方法用來處理在XML文件中讀到的內容,第一個參數用於存放文件的內容,
//後面兩個參數是讀到的字元串在這個數組中的起始位置和長度,使用newString(ch,start,length)就可以獲取內容。
@Override
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
if(tagName!=null){
Stringdata=newString(ch,start,length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}elseif(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
//接收文檔的結尾的通知。在遇到結束標簽的時候,調用這個方法。其中,uri表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);name表示元素的限定名(帶前綴)
@Override
publicvoidendElement(Stringuri,StringlocalName,Stringname)throwsSAXException{
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson=null;
}
this.tagName=null;
}
}DOM解析XML文件: DOM解析XML文件時,會將XML文件的所有內容讀取到內存中,然後允許您使用DOM API遍歷XML樹、檢索所需的數據。使用DOM操作XML的代碼看起來比較直觀,並且,在某些方面比基於SAX的實現更加簡單。但是,因為DOM需要將XML文件的所有內容讀取到內存中,所以內存的消耗比較大,特別對於運行Android的移動設備來說,因為設備的資源比較寶貴,所以建議還是採用SAX來解析XML文件,當然,如果XML文件的內容比較小採用DOM是可行的。
Pull解析器解析XML文件: Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值
D. 如何獲取android 下的StreamingAssets文件夾中的xml文件
assets文件夾裡面的文件都是保持原始的文件格式,需要用AssetManager以位元組流的形式讀取文件。
assets的讀取方式:
1. 先在Activity裡面調用getAssets() 來獲取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法則指定讀取的文件以及訪問模式就能得到輸入流InputStream。
3. 然後就是用已經open file 的inputStream讀取文件,讀取完成後記得inputStream.close() 。
4.調用AssetManager.close() 關閉AssetManager。
需要注意的是,來自Resources和Assets 中的文件只可以讀取而不能進行寫的操作
E. android 讀取多層XML
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.content.Context;
import android.util.Log;
import android.util.Xml;
class Formation {
int id;//為了簡單,不寫get,set方法
Type type;
}
class Type {
int id;
String name;
}
public class XMLPaser {
static final String TAG = "XMLPaser";
private static final String ns = null;
private Context context;
public XMLPaser(Context context) {
this.context = context;
}
public List<Formation> parse(String xmlPath) {
List<Formation> forList = new ArrayList<Formation>();
Formation formation = null;
InputStream stream = null;
XmlPullParser xmlParse = Xml.newPullParser();
try {
stream = this.context.getResources().getAssets().open(xmlPath);//xml文件放在Assert目錄
xmlParse.setInput(stream, "utf-8");
int evnType = xmlParse.getEventType();//事件驅動
while (evnType != XmlPullParser.END_DOCUMENT) {//文檔結束
switch (evnType) {
case XmlPullParser.START_TAG:/啟動標簽
String tag = xmlParse.getName();
if (tag.equalsIgnoreCase("formation")) {//找到formation
formation = new Formation();
formation.id = Integer.parseInt(xmlParse
.getAttributeValue(ns, "id"));//得到id屬性
} else if (formation != null) {//進入formation裡面
if (tag.equalsIgnoreCase("type")) {//找到type
formation.type = new Type();
formation.type.id = Integer.parseInt(xmlParse
.getAttributeValue(ns, "id"));
}
if (formation.type != null) {//進到type裡面
if (tag.equalsIgnoreCase("name")) {//得到name值
formation.type.name = xmlParse.nextText();
}
}
}
break;
case XmlPullParser.END_TAG:
if (xmlParse.getName().equalsIgnoreCase("formation")
&& formation != null) {
forList.add(formation);
formation = null;
}
break;
default://第一次
break;
}
evnType = xmlParse.next();
}
} catch (Exception e) {
Log.d(TAG, e.toString());
}
return forList;
}
}
F. android 怎麼讀取一個xml
關於具體使用方法,舉例如下:
1、updatelog.xml文件位於res/xml/文件夾下:
<?xml version="1.0" encoding="utf-8"?>
<updatelog>
<release
version="1.0"
versioncode="1.1">
<log>1、這個文件在res/xml文件夾下;</log>
<log>2、這個文件的名字是「updatelog.xml」</log>
<log>3、這是一個xml文件</log>
</release>
</updatelog>
2、在代碼中調用方法如下:
public class ResourcesActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.resources_layout );
mTextView = ( TextView )findViewById( R.id.textId );
getFileResources( );
}
private void getFileResources( ){
String packageName = getPackageName( );
try {
Resources resources = this.getPackageManager( ).getResourcesForApplication( packageName );
int resId = resources.getIdentifier( "updatelog", "xml", packageName );
String log = getUpdatelog( resId, resources );
int appId = resources.getIdentifier( "action_settings", "string", packageName );
String appName = resources.getString( appId );
mTextView.setText( appName + "\n" + log );
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
private String parseTag( XmlResourceParser xml ) throws XmlPullParserException, IOException {
String result = "Version: "+ xml.getAttributeValue(null, "version") + "\n" + "VersionCode: " + xml.getAttributeValue(null, "versioncode") + "\n";
int eventType = xml.getEventType( );
while( ( eventType != XmlPullParser.END_TAG ) || ( xml.getName( ).equals( "log" ) ) ) {
if( (eventType == XmlPullParser.START_TAG) && ( xml.getName( ).equals( "log" ) ) ) {
eventType = xml.next( );
result = result + xml.getText( ) + "\n";
}
eventType = xml.next( );
}
return result;
}
private String getUpdatelog( int resourceId, Resources resource ) {
String result = "";
XmlResourceParser xmlResParser = resource.getXml( resourceId );
try {
int eventType = xmlResParser.getEventType( );
while ( eventType != XmlPullParser.END_DOCUMENT ) {
if ( ( eventType == XmlPullParser.START_TAG ) && ( xmlResParser.getName( ).equals( "release" ) ) ) {
result = result + parseTag( xmlResParser );
}
eventType = xmlResParser.next( );
}
} catch (XmlPullParserException e) {
System.out.println( e.getMessage( ) );
} catch (IOException e) {
System.out.println( e.getMessage( ) );
} finally {
xmlResParser.close( );
}
return result;
}
private TextView mTextView = null;
}
G. 如何獲取android 下的StreamingAssets文件夾中的xml文件
assets文件夾裡面的文件都是保持原始的文件格式,需要用AssetManager以位元組流的形式讀取文件。
assets的讀取方式:
1. 先在Activity裡面調用getAssets() 來獲取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法則指定讀取的文件以及訪問模式就能得到輸入流InputStream。
3. 然後就是用已經open file 的inputStream讀取文件,讀取完成後記得inputStream.close() 。
4.調用AssetManager.close() 關閉AssetManager。
需要注意的是,來自Resources和Assets 中的文件只可以讀取而不能進行寫的操作
H. 如何獲取android 下的StreamingAssets文件夾中的xml文件
assets文件夾裡面的文件都是保持原始的文件格式,需要用AssetManager以位元組流的形式讀取文件。
assets的讀取方式:
1. 先在Activity裡面調用getAssets() 來獲取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法則指定讀取的文件以及訪問模式就能得到輸入流InputStream。
3. 然後就是用已經open file 的inputStream讀取文件,讀取完成後記得inputStream.close() 。
4.調用AssetManager.close() 關閉AssetManager。
需要注意的是,來自Resources和Assets 中的文件只可以讀取而不能進行寫的操作。
I. android 怎麼讀取res下的xml
相當於讀取res下面的文件,讀取成string類型,然後在通過xml解析器解析就行。下面是讀取res下面文件的例子,請看截圖,例子來自android學習手冊,android學習手冊,裡面有源碼。android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼採用android studio目錄結構,高亮顯示代碼,文檔都採用文檔結構圖顯示,可以快速定位。360手機助手中下載,圖標上有貝殼
方法一、將要讀取的txt文件拷貝到Android工程目錄下的assets文件夾下
方法二、在res文件夾下新建raw文件夾,將txt拷貝到該目錄下
本方法是從assets中讀取
/**
* 從assets中讀取txt
*/
private void readFromAssets() {
try {
InputStream is = getAssets().open("qq.txt");
String text = readTextFromSDcard(is);
textView.setText(text);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
本方法是從raw中讀取
/**
* 從raw中讀取txt
*/
private void readFromRaw() {
try {
InputStream is = getResources().openRawResource(R.raw.qq);
String text = readTextFromSDcard(is);
textView.setText(text);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
本方法是解析輸入流,返回txt中的字元串
/**
* 按行讀取txt
*
* @param is
* @return
* @throws Exception
*/
private String readTextFromSDcard(InputStream is) throws Exception {
InputStreamReader reader = new InputStreamReader(is);
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuffer buffer = new StringBuffer("");
String str;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
buffer.append("
");
}
return buffer.toString();
}