可能重复:
how I get child node from each parent node seperately?
我有一些XML数据..我想基于这个XML创建某个组件。我的XML数据如下所示
<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>
我使用以下代码从上面的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());
}
}}
但我只有2个子节点(TabNavigator和NavigatorContent)。我如何得到所有孩子的节点?任何人都可以帮我吗???
我的代码如下。我现在只有子节点..没有父节点。请帮助我获取父节点和子节点..
<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>
答案 0 :(得分:1)
类XML的children()方法只返回当前对象的直接子节点。如果您想浏览整个文档,则需要以递归方式为每个孩子调用您的方法。
所以你需要写一些像:
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);
}
}
}
在您的处理程序中,您可以调用它:
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
handleOneNode(xmlData)
修改强> 要访问父节点,您只需向handleOneNode函数添加一个附加参数。
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);
}
}
}
在您的处理程序中,您可以调用它:
var xmlData:XML=new XML(URLLoader(event.currentTarget).data);
handleOneNode(xmlData)