2012-02-02 56 views
0

我想創建一個需要動態訪問XML子節點的實用程序函數。動態訪問XML子節點E4X ActionScript 3

示例XML:

var xml:XML = 
<root> 
    <section> 
     <lt target='foo'/> 
     <lt target='foo1'/> 
     <lt target='foo2'/> 
    </section> 
    <section1> 
     <lt target='foo'/> 
     <lt target='foo1'/> 
     <lt target='foo2'/> 
    </section1> 
</root>; 

我希望能夠訪問所有的「LT」節點,而不管其父節點。通常情況下,你會是這樣做的:

var xList:XMLList = xml..lt; 

//Output 

xList = 
<lt target='foo'/> 
<lt target='foo1'/> 
<lt target='foo2'/> 
<lt target='foo'/> 
<lt target='foo1'/> 
<lt target='foo2'/> 

這工作正常,但是,我需要訪問「LT」節點不知道名字前面。例如...

var nodeName:String = 'lt'; 
var xList:XMLList = xml..[nodeName]; //<-- Does not work. 

我希望能夠在不使用for循環的情況下完成此操作。有任何想法嗎?

感謝,

維克多

+1

沒關係。我計算出來並將其作爲答案,但我不得不等待8個小時。但是,如果其他人正在尋找,語法如下: 'var xList:XMLList = new XMLList(xml.descendants(node));' – 2012-02-02 22:50:02

+0

啊,你覺得它幾乎是相同的東西。但我認爲你不需要使用'new XMLList'。 – 2012-02-03 01:09:50

回答

1

你可能只需要:

var nodeName:String = "lt"; 
var xList:XMLList = xml.descendants(nodeName); 
1

假設他們都是一樣的深度到你的XML,你可以使用*作爲通配符。例如:

var xml:XML = <root> 
    <obj1> 
     <test>a</test> 
    </obj1> 
    <obj2> 
     <test>b</test> 
    </obj2> 
    <obj2> 
     <lala> 
      <test>c</test> 
     </lala> 
    </obj2> 
</root>; 
trace(xml.*.test); 

描繪出:

<test>a</test> 
<test>b</test> 

xml.children().test會做同樣的事情,順便說一句。

+0

這也適用... var list:XMLList = xml。* [node];謝謝! – 2012-02-03 14:41:11

+0

順便說一句如何獲得' c'? – 2013-12-18 10:28:54

1

你想使用E4X括號運營商,也被稱爲過濾器。還可以使用通配符運算符來返回所有子項。非常強大,它將允許您使用字符串進行搜索。

trace("trace",xml..*.(localName() =='lt')); 
+0

酷! var list:XMLList = xml .. *。(localName()== node) – 2012-02-03 14:42:08