XML圖檔

  由於在 android 架構下的資料大多都是直接使用 XML 格式,所以當你要去讀取資料時就需要去解析這些 XML 檔,在下將會在下面舉例以 dom 實作一個簡單的 XML 分析APP。

  首先是需要 import 的函式庫,不過要是使用 eclipse 編寫漏了也沒關係,該編譯器會自動幫你在有問題的地方標紅線,你只要右鍵點選加入建議的函式庫就好,超貼心的

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

 

  在來先講一個好用的東西,那就是訊息視窗 Message Box,由於很多地方只要建一個訊息視窗作提示而不用處理事情,因此建議使用一個函式將它包起來,之後只要一行就可以建立訊息視窗了,不管是在實機 debug 或是提醒使用者操作都很好用!

private void MessageBox( String sTitle, String sMsg  )
{
	new AlertDialog.Builder(MainActivity.this)
	.setTitle(sTitle)
	.setMessage(sMsg)
	.setPositiveButton("OK", new DialogInterface.OnClickListener()
	{
		public void onClick( DialogInterface d, int i )
		{}
	}
	).show();
}

 

  接下來就是正是講如何使用 dom 來解析 XML 檔了,這邊建立一個可以輸入路徑資料夾跟檔案名稱的函式,可以將只定路徑的 XML 檔案做解析,值得注意的是該檔案權限必須是666或是自身APP所建立或自帶的檔案。

private void ReadFile( String sFilePath, String sFileName )
{		
	try{
	File file = new File(sFilePath+sFileName);
	inStream = new FileInputStream(file);
	//inStream = MainActivity.class.getClassLoader().getResourceAsStream(FileName);	//讀取APP自身資源內的檔案
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	DocumentBuilder builder = factory.newDocumentBuilder();
	Document document = builder.parse(inStream);	//以樹狀格式存於記憶體中﹐比較耗記憶體
	Element root = document.getDocumentElement();	//取得檔案的"根"標籤
	NodeList nodes = root.getElementsByTagName("string");	//尋找"根"標籤下的目標名稱的物件並製作成表			
			
	for(int i=0;i<nodes.getLength();i++)	//for迴圈檢查每一物件的內容
	{
		Element levelElement = (Element)nodes.item(i);
		TempStr = levelElement.getAttribute("name");	//檢查物件內叫做name的區塊內容
		if( FilterStr.equals(TempStr) )	//若內容和過濾文字一致,則進行解析過濾
		{	//由於xml內的結構可以是巢狀式的,所以每一物件內可以再有其他節點物件,此例子只取第一節點物件分析內容
			FileFilter( levelElement.getChildNodes().item(0).getNodeValue().trim() );
		}
	}
	}catch (Exception er)
	{
	MessageBox( "Analysis Fail!", er.getMessage()  );
	}
}

 

  上述例子,應該會有人注意到在下沒有在函式內宣告 FilterStr 這個參數,那是因為在下以在外部廣域定義該參數為 "MH_CACHE_RUNTIME_DATA_CURRENT_FLOOR_WAVES" ,看到這串字應該會人已經認出那是現在台灣當紅的轉珠遊戲 "神魔之塔" 的後台關卡資料的關鍵字,沒錯!在下拿來當範例的 XML 正是 "神魔之塔" 的後台 XML 資料檔。

  另外,底下將會講解在下上面用來解析資料的函式 FileFilter ,這個函式只是個過濾符號的簡單函式,並且會將過濾完的各字串存成一個列表,方便之後取出來解析翻譯出人可以看得懂得格式。

private List<String> list = new ArrayList<String>();
private List<String> Symbol = new ArrayList<String>();
private void FileFilter( String FileData )
{
	list.clear();
	Symbol.clear();
// Add Symbol of  {} [] () " , : ;
	Symbol.add( "\"" );
	Symbol.add( ";" );
	Symbol.add( ":" );
	Symbol.add( "," );
	Symbol.add( "[" );
	Symbol.add( "]" );
	Symbol.add( "{" );
	Symbol.add( "}" );
	Symbol.add( "(" );
	Symbol.add( ")" );

	int FileLength = FileData.length();
	int SymbolLength = Symbol.size();
	String FilterStr;
	String TokenStr = "";
	list.clear();
		
	for( int i = 0; i < FileLength; ++i )
	{
		FilterStr = "" + FileData.charAt(i);
			
		boolean bIsSymbol = false;
		for( int j = 0; j < SymbolLength; ++j )
		{
			if( FilterStr.equals(Symbol.get( j )) )
				bIsSymbol = true;
		}
			
		if( bIsSymbol )
		{
			if( !TokenStr.equals("") )
			{
				list.add(TokenStr);
				TokenStr = "";			
			}
		}
		else
		{
			TokenStr = TokenStr + FilterStr;
		}
	}
}

  而將取出來的字串列表做簡單的關鍵字判斷分析就可以做成類似下圖的簡報。

XML分析例子

 

  最後要如何處理取出來的字串就看各位的喜好需求了,以上就是使用 dom 解析 "神魔之塔" 的後台 XML 資料檔解說範例,不過只講讀檔而不講如何輸出 XML 檔好像有點怪怪的,所以下面簡單列一下輸出 XML 檔的程式碼。

DocumentBuilder builder = factory.newDocumentBuilder();	// 創建一個新的文件產生器
Document document = docbuilder.newDocument();	// 創建文件

Element root = document.createElement("marsray");	// 建立marsray的標籤
document.appendChild(root);	 // 將標籤物件加入文件中
			
TransformerFactory MyTranFactory = TransformerFactory.newInstance(); 
Transformer MyTransformer = MyTranFactory.newTransformer(); 
File outfile = new File("MyFile.xml");
MyTransformer.transform(new DOMSource(document), new StreamResult(outfile));

 

  這邊建構出來的 XML 檔會在該APP資料夾下。
  以下不開放詢問如何讀取 /data/data/ 底下的檔案,因為在下會在另一篇 [Android 開發] 文中講解, /data/data/ 底下的各資料夾基本上只有該創建的 APP 有權限可以寫讀檔,所以基本上外部 APP 要做外掛去寫讀檔案,那手機一定要是有 root 過的!

創作者介紹

折翼之流

G毛 發表在 痞客邦 PIXNET 留言(0) 人氣()