我如何从XML数据的所有子节点? [英] How I get all the children nodes from Xml data?

查看:88
本文介绍了我如何从XML数据的所有子节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  

可能重复:
  <一href="http://stackoverflow.com/questions/12136882/how-i-get-child-node-from-each-parent-node-seperately">how我得到的子节点从每个父节点分开?

我有一些XML data..I要创建基于此XML.My XML数据的某些组成部分在下面给出

 &lt;主&GT;
     &LT;的TabNavigator X =27Y =11WIDTH =455HEIGHT =376ID =GH的backgroundColor =#A4B6E9&GT; &LT; NavigatorContent WIDTH =100%高度=100%的标签=客户端ID =clientTab&GT;
   &LT;标号x =10Y =30WIDTH =52高度=25文本=姓名:/&GT;
  &LT;标号x =10Y =127宽度=52高度=28文本=ADDRES/&GT;
&LT;的TextInput ID =name_clientX =69Y =18WIDTH =188HEIGHT =37限制=[AZ AZ]/&GT;
&LT;文本区ID =address_clientX =70Y =70高度=126/&GT;
&LT;标号x =10Y =230宽度=84高度=32文本=电话:/&GT;
&所述;的TextInput的id =phone_client×=70Y =218宽度=188的高度=30限制=0-9maxChars属性=10/&GT;
&LT;按钮X =100Y =291HEIGHT =28标签=提交点击=submitClick()/&GT;
&LT;标签ID =errorClientX =59Y =270宽度=171HEIGHT =27文本=请填写空白字段彩色=红色可见=假/&GT;
&LT; / NavigatorContent&GT;&LT; NavigatorContent WIDTH =100%高度=100%的标签=联系ID =adminTab&GT;
&LT;标号x =23Y =48WIDTH =52高度=25文本=姓名:/&GT;
&LT;标号x =26Y =148宽度=52高度=28文本=ADDRES/&GT;&LT;的TextInput ID =name_adminX =105Y =33宽=188HEIGHT =37/&GT;
&LT;文本区ID =address_adminX =105Y =93高度=126/&GT;
&LT;标号x =26Y =257宽度=84高度=32文本=电话:/&GT;
&所述;的TextInput的id =phone_admin×=104Y =246宽度=188的高度=30限制=0-9maxChars属性=10/&GT;
&LT;按钮X =137Y =305HEIGHT =28标签=提交/&GT;
&LT;标签ID =errorAdminX =100Y =286宽度=171HEIGHT =17彩色=红色fontSize的=14文本=请填写空白字段可见=假/&GT;
&LT;按钮X =335Y =60高度=34标签=联系细节/&GT;
&LT;按钮X =335Y =180HEIGHT =34标签=客户详细资料/&GT;
&LT; / NavigatorContent&GT;
&LT; /的TabNavigator&GT;
&LT; titleWindow正在X =521Y =84WIDTH =377HEIGHT =234&GT;
&LT;数据网格X =0Y =0WIDTH =375HEIGHT =163borderVisible =真正的ID =细节&GT;
&LT;列&GT;
&LT; ArrayList的&GT;
&LT;的GridColumn的dataField =名称ID =arrayName中的/&GT;
&LT;的GridColumn的dataField =地址HEADERTEXT =地址/&GT;
    &LT;的GridColumn的dataField =PHONE_NUMBERHEADERTEXT =PHONE_NUMBER/&GT;&LT; / ArrayList的&GT;&LT; /列&GT;
  &LT; /数据网格&GT;&LT;按钮X =139Y =167HEIGHT =28标签=导出/&GT;
 &LT; / titleWindow正在&GT;
&LT; /主&GT;
 

我使用下面的$ C $下找到的子节点从上面的XML。

 私有函数的loadXML(TargetURL中:字符串):无效
                {
                    urlLdr.load(新的URLRequest(TargetURL中));
                    urlLdr.addEventListener(引发Event.COMPLETE,urlLdr_complete);
                }
                私有函数urlLdr_complete(事件:事件):无效
                {

                    VAR XMLDATA:XML =新的XML(的URLLoader(event.currentTarget).DATA);
                        每个(VAR T:XML在xmlData.children())
                        {
                                            Alet.show(t.Name());
                                            }
                            }}
 

不过,我只有2个孩子节点(TabNavigator容器和NavigatorContent)。怎么我得到的所有的子节点?任何一个可以帮助我,请???


我的code如下。我唯一​​的孩子节点现在..还没有得到父母node.please帮助我获取父和子节点。

 &LT; FX:脚本&GT;
        &LT;![CDATA [
            进口flashx.textLayout.elements.BreakElement;
            进口flashx.textLayout.formats.BackgroundColor;

            进口mx.charts.chartClasses.DataDescription;
            进口mx.collections.ArrayCollection;
            进口mx.collections.XMLListCollection;
            进口mx.containers.Canvas;
            进口mx.containers.TabNavigator;
            进口mx.controls.Alert;
            进口mx.controls.Button类;
            进口mx.controls.Label;
            进口mx.controls.Text;




            私人VAR urlLdr:的URLLoader =新的URLLoader;
            私人VAR childName:字符串;
            私人变种我:= 0;
            私人VAR ArrayCollection的:ArrayCollection的=新ArrayCollection的;
            私有函数的loadXML(TargetURL中:字符串):无效
            {
                urlLdr.load(新的URLRequest(TargetURL中));
                urlLdr.addEventListener(引发Event.COMPLETE,urlLdr_complete);
            }
            私有函数urlLdr_complete(事件:事件):无效
            {

                VAR XMLDATA:XML =新的XML(的URLLoader(event.currentTarget).DATA);
                handleOneNode(XMLDATA);
            }
            私有函数handleOneNode(节点:XML,父:XML = NULL):无效
            {
            VAR孩子:返回XMLList = node.children();
            如果(children.length()== 0)
            {我++;
                childName = node.name();
                开关(childName.toString())
                {
                    案按钮:
                    {

                        VAR为myButton:按钮=新按钮();
                        myButton.x =节点.. @ X;
                        myButton.y =节点.. @ÿ;
                        myButton.height =节点.. @高度;
                        myButton.width =节点.. @宽度;
                        myButton.label =节点.. @标签;
                        myCanvas.addChild(myButton的);
                        打破;
                    }
                    案的TabNavigator:
                    {
                        VAR myTabNavigator:TabNavigator容器=新的TabNavigator();
                        myTabNavigator.x =节点.. @ X;
                        myTabNavigator.y =节点.. @ X;
                        myTabNavigator.height =节点.. @高度;
                        myTabNavigator.id =节点.. @ ID;
                        myTabNavigator.width =节点.. @宽度;
                        打破;
                    }
                    案的DateChooser:
                    {
                        打破;
                    }
                    案标签:
                    {
                        VAR myLabel:标签=新的Label();
                        myLabel.x =节点.. @ X;
                        myLabel.y =节点.. @ X;
                        myLabel.height =节点.. @高度;
                        myLabel.id =节点.. @ ID;
                        myLabel.width =节点.. @宽度;
                        myLabel.text =节点.. @文本;
                        myCanvas.addChild(myLabel);
                    }
                    案的TextInput:
                        变种会将myText:文本=新文本;
                        myLabel.x =节点.. @ X;
                        myLabel.y =节点.. @ X;
                        myLabel.height =节点.. @高度;
                        myLabel.id =节点.. @ ID;
                        myLabel.width =节点.. @宽度;
                        myLabel.text =节点.. @文本;
                        myCanvas.addChild(myLabel);
                    案titleWindow正在:
                    {
                    }
                    默认:
                    {
                    }
                }

            }
            其他
            {
                每个(VAR孩子:XML儿童)
                {
                    handleOneNode(子节点);
                }
            }
            }

        ]]≥
    &LT; / FX:脚本&GT;
 

解决方案

孩子()类XML的方法只返回当前对象的直接孩子。如果你想通过整份文件则需要递归调用的方法,对每一个孩子。

所以,你需要写的东西,如:

 私有函数handleOneNode(节点:XML):无效{
   VAR孩子:返回XMLList = node.children();
   如果(children.length()== 0){
      //处理叶节点 - &GT;创建UI对象,或任何
   } 其他 {
      //非终端节点,检查孩子
      每个(VAR孩子:XML儿童){
         handleOneNode(子);
      }
   }
}
 

而在你处理你怎么称呼它:

  VAR XMLDATA:XML =新的XML(的URLLoader(event.currentTarget).DATA);
handleOneNode(XMLDATA)
 

修改 为了访问父节点,你只需要一个额外的参数添加到handleOneNode功能。

 私有函数handleOneNode(节点:XML,父:XML = NULL):无效{
       VAR孩子:返回XMLList = node.children();
       如果(children.length()== 0){
          //处理叶节点 - &GT;创建UI对象,或任何
       } 其他 {
          //非终端节点,检查孩子
          每个(VAR孩子:XML儿童){
             handleOneNode(子节点);
          }
       }
    }
 

而在你处理你怎么称呼它:

  VAR XMLDATA:XML =新的XML(的URLLoader(event.currentTarget).DATA);
handleOneNode(XMLDATA)
 

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>

解决方案

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)

这篇关于我如何从XML数据的所有子节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆