2009
01.23

從XML中取出資料當作另一個XML的篩選條件

恩…這個題目很饒舌,別這樣,我也是想了30秒鐘才決定取這個題目的,緣由來自於icemilk在留言板的留言,老實說我看了很久才知道他想做什麼,因為這實在是不好解釋。

留言內容如下:

老師 我想問一個關於XML的問題
小弟現在得到一串位子的字串,例如photos.photo.@name
如何可以使用這個字串搜尋xml的值
大概的樣子如下:
var x:XML=new XML(xxxxx);
var value:String = x.photos.photo.@name.toString();
如果直接打的話可以取到值,但如果是字串就沒辦法讀直,是否需要split之後丟進來或是有可以直接轉屬性的方法?
搜尋了線上文件之後 有看到類似的訪問方式
訪問屬性: value = x.photos.photo.@["name"];
或是訪問節點的值: value = x.photos["photo"];
但小弟嘗試用
value = x["photos"]["photo"].@["name"];
value = x["photos.photo.@name"] 都拿不到值
所以上來請老師幫忙看一下 謝謝


另一篇留言是:

真的很感謝你
目前有兩份xml,其中一份是記錄如何從另外一份xml拿資料,
行為大致如下:
var axml:XML = 方法.xml;
var bxml:XML = 目標.xml;
var a:String= axml.從b讀取資料的位置.toString();
//ex. a = photos.photo.@name var b:String= bxml.a.toString();
目的是要拿到b的值
在麻煩老師看一下


其實解法不難,這個示範是用Flex寫的,但是其實在Flash中使用ActionScript 3.0的寫法也都是一模一樣的,答案就在下面的程式碼示範中:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
	creationComplete="init()">
 
	<mx:Script>
		<![CDATA[
 
			private var source:XML;
			private var apply:XML;
 
			private function init():void
			{
				this.source=<root>
					<method>method1</method>
					<method>method2</method>
					<method>method3</method>
					<method>method4</method>
				</root>;
				this.leftXML.text=this.source;
 
				this.apply=<root>
					<method1>anistar</method1>
					<method2>mary</method2>
					<method3>katy</method3>
					<method4>Frances</method4>
				</root>;
				this.rightXML.text=this.apply;
			}
 
			private function clickHandler():void
			{
				var fromSource:String=this.source.method[0];
				this.answer.text=this.apply[fromSource];
			}
		]]>
	</mx:Script>
 
	<mx:HBox>
		<mx:TextArea id="leftXML" width="200" height="150"/>
		<mx:TextArea id="rightXML" width="200" height="150"/>
	</mx:HBox>
	<mx:Button label="Get Result" click="clickHandler()"/>
	<mx:Label id="answer" text=""/>
 
</mx:Application>


順便放上執行的示意圖,這樣讓你更容易知道是如何運作的:
Flex e4x


相關文章:
  • Bitmap與BitmapData
  • Flex/Flash/AIR 如何開啟bmp圖檔
  • iPhone上的ActionScript 3.0 API參考程式
  • Flash/Flex上傳檔案前顯示圖片內容
  • ActionScript3.0的Roll Over vs. Mouse Over有什麼不一樣?
  • 本文引用:
    文章內容由宋志峰[ANISTAR]撰寫,引用分享請以鏈結形式註明出處與原始作者。

    9 comments so far

    Add Your Comment
    1. 老師你好,我有買你的書哦(先打關係一下)
      我正試著用 flex + air + xml 做些東西
      只是,還是不知若我想新增資料進入 xml 檔案中,怎麼做最好?

      我有查了一下資料,應該是可以用 fileStream類的可以做到,只是,還是不知怎麼做比較好

      老師可否給些提示??

      • 是否可以請你說明一下你現在目前是用Flex還是AIR再做XML檔寫入的動作,因為解法是不同的。

    2. 所以有解決的方法嗎@@

      • 沒輒….要自己寫特別的操作方法去處理喔。

    3. 不知道老師是否有收到信呢?

      • 我看到你給的sample了,你不能這樣做,因為[]的寫法跟eval不一樣,他只能填入單一屬性而不是一連串的路徑描述法。

    4. 阿 tag被擋掉了,不知道老師知不知道我的意思@@

    5. 嗯嗯 不好意思 老師,我又來了
      老師的解法的確是我要問的問題,不過目前遇到的困難是,如果apply的資料不是在第一層的話,我拿不到,拿老師的sample我改一下

      this.source=
      method1.data.@id
      method2.data.@id
      method3.data.@id
      method4.data.@id
      ;

      this.apply=

      ;

      後面的寫法一樣
      var fromSource:String=this.source.method[0];
      this.answer.text=this.apply[fromSource];
      但是結果得不到
      再麻煩老師開釋一下