问题
Possible Duplicate:
how I get child node from each parent node seperately?
I have Some XML data..I want to create certain component based on this XML.My XML data is given below
<main>
<TabNavigator x="27" y="11" width="455" height="376" id="gh" backgroundColor="#A4B6E9"> <NavigatorContent width="100%" height="100%" label="Client" id="clientTab">
<Label x="10" y="30" width="52" height="25" text="Name:"/>
<Label x="10" y="127" width="52" height="28" text="Addres"/>
<TextInput id="name_client" x="69" y="18" width="188" height="37" restrict="[A-Z a-z]"/>
<TextArea id="address_client" x="70" y="70" height="126"/>
<Label x="10" y="230" width="84" height="32" text="Phone:"/>
<TextInput id="phone_client" x="70" y="218" width="188" height="30" restrict="0-9" maxChars="10"/>
<Button x="100" y="291" height="28" label="Submit" click="submitClick()"/>
<Label id="errorClient" x="59" y="270" width="171" height="27" text="please fill the blank fields" color="red" visible="false"/>
</NavigatorContent><NavigatorContent width="100%" height="100%" label="Admin" id="adminTab">
<Label x="23" y="48" width="52" height="25" text="Name:"/>
<Label x="26" y="148" width="52" height="28" text="Addres"/><TextInput id="name_admin" x="105" y="33" width="188" height="37"/>
<TextArea id="address_admin" x="105" y="93" height="126"/>
<Label x="26" y="257" width="84" height="32" text="Phone:"/>
<TextInput id="phone_admin" x="104" y="246" width="188" height="30" restrict="0-9" maxChars="10"/>
<Button x="137" y="305" height="28" label="Submit"/>
<Label id="errorAdmin" x="100" y="286" width="171" height="17" color="red" fontSize="14" text="please fill the blank fields" visible="false"/>
<Button x="335" y="60" height="34" label="Admin Details"/>
<Button x="335" y="180" height="34" label="Client Details"/>
</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>
I am using the following code for finding the child nodes from the above XML.
private function loadXML(targetURL:String):void
{
urlLdr.load(new URLRequest(targetURL));
urlLdr.addEventListener(Event.COMPLETE,urlLdr_complete);
}
private function urlLdr_complete(event:Event):void
{
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
for each (var t:XML in xmlData.children())
{
Alet.show(t.Name());
}
}}
But I only 2 Children nodes(TabNavigator and NavigatorContent).How i get all the children Nodes? Can any one help me please???
My code is given below. I got only child nodes now.. haven't got the parent node.please help me for getting the parent and child nodes..
<fx:Script>
<![CDATA[
import flashx.textLayout.elements.BreakElement;
import flashx.textLayout.formats.BackgroundColor;
import mx.charts.chartClasses.DataDescription;
import mx.collections.ArrayCollection;
import mx.collections.XMLListCollection;
import mx.containers.Canvas;
import mx.containers.TabNavigator;
import mx.controls.Alert;
import mx.controls.Button;
import mx.controls.Label;
import mx.controls.Text;
private var urlLdr:URLLoader=new URLLoader;
private var childName:String;
private var i:int=0;
private var arrayCollection:ArrayCollection=new ArrayCollection;
private function loadXML(targetURL:String):void
{
urlLdr.load(new URLRequest(targetURL));
urlLdr.addEventListener(Event.COMPLETE,urlLdr_complete);
}
private function urlLdr_complete(event:Event):void
{
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
handleOneNode(xmlData);
}
private function handleOneNode(node:XML,parent:XML=null):void
{
var children:XMLList=node.children();
if(children.length()==0)
{i++;
childName=node.name();
switch(childName.toString())
{
case "Button":
{
var myButton:Button=new Button();
myButton.x=node..@x;
myButton.y=node..@y;
myButton.height=node..@height;
myButton.width=node..@width;
myButton.label=node..@label;
myCanvas.addChild(myButton);
break;
}
case "TabNavigator":
{
var myTabNavigator:TabNavigator=new TabNavigator();
myTabNavigator.x=node..@x;
myTabNavigator.y=node..@x;
myTabNavigator.height=node..@height;
myTabNavigator.id=node..@id;
myTabNavigator.width=node..@width;
break;
}
case "Datechooser":
{
break;
}
case "Label":
{
var myLabel:Label=new Label();
myLabel.x=node..@x;
myLabel.y=node..@x;
myLabel.height=node..@height;
myLabel.id=node..@id;
myLabel.width=node..@width;
myLabel.text=node..@text;
myCanvas.addChild(myLabel);
}
case "TextInput":
var myText:Text=new Text;
myLabel.x=node..@x;
myLabel.y=node..@x;
myLabel.height=node..@height;
myLabel.id=node..@id;
myLabel.width=node..@width;
myLabel.text=node..@text;
myCanvas.addChild(myLabel);
case "TitleWindow":
{
}
default:
{
}
}
}
else
{
for each(var child:XML in children)
{
handleOneNode(child,node);
}
}
}
]]>
</fx:Script>
回答1:
The children() method of class XML only returns the direct children of the current object. If you want to go through the whole document you need to recursively call your method on each children.
So you need to write something like:
private function handleOneNode(node:XML):void {
var children:XMLList = node.children();
if ( children.length() == 0 ) {
//Handle Leaf node -> Create ui object, or whatever
} else {
//Non terminal node, check children
for each (var child:XML in children ) {
handleOneNode(child);
}
}
}
And in your handler you call it:
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
handleOneNode(xmlData)
EDIT In order to access the parent node you simply have to add an additional parameter to the handleOneNode function.
private function handleOneNode(node:XML, parent:XML=null):void {
var children:XMLList = node.children();
if ( children.length() == 0 ) {
//Handle Leaf node -> Create ui object, or whatever
} else {
//Non terminal node, check children
for each (var child:XML in children ) {
handleOneNode(child, node);
}
}
}
And in your handler you call it:
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
handleOneNode(xmlData)
来源:https://stackoverflow.com/questions/12137607/how-i-get-all-the-children-nodes-from-xml-data