-1

私はいくつかのデータXmlを持っています..

<main>
  <TabNavigator x="27" y="11" width="455" height="376" id="gh" backgroundColor="#A4B6E9">
    <NavigatorContent width="100%" height="100%" label="Client" id="clientTab"></NavigatorContent>
    <NavigatorContent width="100%" height="100%" label="Admin" id="adminTab"></NavigatorContent></TabNavigator>
    <TitleWindow x="521" y="84" width="377" height="234">
      <DataGrid x="0" y="0" width="375" height="163" borderVisible="true" id="details">
        <columns>
          <ArrayList>
            <GridColumn dataField="Name" id="arrayName"/><GridColumn dataField="Address" headerText="Address"/>
            <GridColumn dataField="Phone_Number" headerText="Phone_Number"/>
          </ArrayList>
        </columns>
      </DataGrid>
      <Button x="139" y="167" height="28" label="Export"/>
    </TitleWindow>
</main>

次のコードを使用して、指定された XML の子の名前を取得します。

private function urlLdr_complete(event:Event):void{
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);                       
for each (var t:XML in xmlData.children()) 
{
   Alert.show(t.Name);
}

しかし、2 つの子 (TabNavigator と TitleWindow) しか取得できません。各親ノードで他の子を取得するにはどうすればよいですか? 親ごとに別々の子供が欲しい。どうすれば入手できますか?

4

1 に答える 1

1

ツリーをたどるには、再帰関数を使用する必要があります。alert() の代わりに trace() を使用する:

private function urlLdr_complete(event:Event):void
{
    var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
    showNodeName(xmlData);
}

private function showNodeName($node:XML):void
{
    // Trace the current node
    trace($node.name());
    if($node.hasChildNodes)
    {
        for each (var child:XML in $node.children())
        {
            // Recursively call this function on each child
            showNodeName(child);
        }
    }
}

または、E4X の子孫() 関数を使用します。

private function urlLdr_complete(event:Event):void
{
    var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
    // Trace the root node:
    trace(xmlData.name());
    // And trace all its descendants:
    for each(var child:XML in xmlData.descendants())
    {
        trace(child.name());
    }
}

どちらも同じ結果を生成する必要があります。

main
TabNavigator
NavigatorContent
NavigatorContent
TitleWindow
DataGrid
columns
ArrayList
GridColumn
GridColumn
GridColumn
Button

私はテストしていませんが、組み込みの descendants() 関数がより効率的であると期待しています。

于 2012-08-27T11:25:46.450 に答える