2011-02-24 70 views
8

我正在編寫一個應用程序,它將從web服務(可能通過kSOAP2)讀取XML。我對SAX解析非常滿意,因爲我已經完成了XML解析iPhone應用程序的工作。Android:從本地資源讀取XML(用於測試)

不幸的是,web服務尚未公開,所以對於初始測試我有一些文件包含我需要解析的XML。在這個早期開發階段我只需要從文件中讀取XML並把它傳遞到XML解析器

Xml.parse(this.testXML, root.getContentHandler()); 

我如何從文件中讀取/資源XML轉換成字符串傳遞到這個方法。我想破解並測試解析器,但是這個簡單的步驟讓我很擔心。

感謝

回答

12

下創建資源

一個原料文件夾把你的XML文件中出現,例如。 testXML.xml:

/res/raw/testXML.xml

您應該能夠使用作爲InputStream使用您的XML解析器:

Xml.parse(getResources().openRawResource(R.raw.testXML), Xml.Encoding.UTF_8, root.getContentHandler()); 

嘗試。

2

我找到了解決方案。使用資產。 以下是我如何做到的簡單代碼示例。 我知道我可以使用XmlPullParser來簡單地從res加載一個xml文件,但我想使用SAX解析。這允許我在插入webservice之前簡單地將一個XML字符串放入SAX解析器中進行測試。

它只是使用帶Button的簡單視圖來啓動文件加載,並使用TextView來顯示現在的XML。我可以與我的解析器:)

package com.martins.XmlParserTest 
import java.io.IOException; 
import java.io.InputStream; 

import android.app.Activity; 
import android.content.res.AssetManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class Main extends Activity { 

Button btn; 
TextView tvXml; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button btn = (Button) findViewById(R.id.button1); 

    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // Load XML for parsing. 
      AssetManager assetManager = getAssets(); 
      InputStream inputStream = null; 
      try { 
       inputStream = assetManager.open("textxml.xml"); 
      } catch (IOException e) { 
       Log.e("tag", e.getMessage()); 
      } 

      String s = readTextFile(inputStream); 
      TextView tv = (TextView)findViewById(R.id.textView1); 
      tv.setText(s); 
     } 
    }); 
} 


private String readTextFile(InputStream inputStream) { 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

    byte buf[] = new byte[1024]; 
    int len; 
    try { 
     while ((len = inputStream.read(buf)) != -1) { 
      outputStream.write(buf, 0, len); 
     } 
     outputStream.close(); 
     inputStream.close(); 
    } catch (IOException e) { 

    } 
    return outputStream.toString(); 
} 
} 
+0

哦,忘了提。 XML文件需要進入項目中的/ assets文件夾。希望有一天別人覺得這有用。 – MartinS 2011-02-25 19:43:56

+2

Martin,您是否嘗試將XML轉換爲原始格式?我做了一個測試項目,發現它可以工作,如果你把XML放到一個名爲'raw'的文件夾中而不是'xml'。我不確定它爲什麼會有所作爲,但確實如此。我只是喜歡高效的解決方案,其中一條線肯定是非常高效的:) – Kevin 2011-02-25 22:02:00

+0

我相信'原始'xml文件作爲文件存儲在資產中,'xml'xml文件作爲預解析xml(通過XmlResourceParser)存儲。 – phreed 2011-08-19 14:18:27

0

引發由於不正確的XML(線1,POS0)例外。

您告訴解析器編碼是UTF-8,如果不是,您可能會得到各種錯誤(取決於解析器)。如果您使用非xml編輯器來編輯您的XML,它可能會以不同的編碼保存文件,無論您聲明它在XML文檔中。