How can I create lists with Parent items of child attributes using E4X?
-
04-06-2021 - |
質問
I'm having trouble getting the results I want using E4X to dig into my XML document. For exampleWhat I want to do, using the XML below, is find all of the d_locations that have the d_type SW, and then create a list of all the SW d_types that includes the code and the hfloor number - which is a level above the d_type.
So to illustrate the example, I want to output a list like this:
TYPE: SW
Floor 18: SW18.10N
Floor 15: SW15.W2
Floor 15: LB12
Floor 15: LB17
Floor S2: SWS2.3
How can I do that using E4X? Thanks so much!
Mattynabib
<?xml version="1.0" encoding="UTF-8"?>
<bldg>
<hfloor number="18">
<d_location d_code="SW18.10N" d_type="SW" description="Ferbludgit thingamabob">
<d_image>3e_pic1</d_image>
<d_image>3e_pic2</d_image>
<d_image>3e_pic3</d_image>
<d_image>3e_pic4</d_image>
<d_image>3e_pic5</d_image>
<d_video>3e_vid_1</d_video>
<d_video>3e_vid_2</d_video>
<d_video></d_video>
</d_location>
</hfloor>
<hfloor number="15">
<d_location d_code="W1" d_type="PSW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="SW15.W2" d_type="SW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="W3" d_type="LB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="LB12" d_type="SW" description="Screwed up whosamadingy">
<d_image>media/lb15_12/LB-12 LOOKING NORTH.png</d_image>
<d_image>media/lb15_12/LB-12 LOOKING SOUTH.png</d_image>
<d_image>media/lb15_12/Pages from Level_15_Link_Beam_12.png</d_image>
<d_image>media/lb15_12/Pages from Level_15_Link_Beam_12-2.png</d_image>
<d_image>media/lb15_12/Post Demo from CITC018306365-2.png</d_image>
<d_image>media/lb15_12/Rebuilt from CITC018306365.png</d_image>
<d_image>media/lb15_12/WEI LB 12 level 15.png</d_image>
<d_video>Video 1</d_video>
<d_video>Video 2</d_video>
<d_video>Video 3</d_video>
</d_location>
<d_location d_code="LB17" d_type="SW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="LB8" d_type="EB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="W14" d_type="CB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
</hfloor>
<hfloor number="S2">
<d_location d_code="W3" d_type="LB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="SWS2.3" d_type="SW" description="Whacked flogatron">
<d_image>media/sw_s2_3/CITC000155966.png</d_image>
<d_image>media/sw_s2_3/CITC000155983.png</d_image>
<d_image>media/sw_s2_3/CITC000155996.png</d_image>
<d_image>media/sw_s2_3/CITC000156003.png</d_image>
<d_image>media/sw_s2_3/Screen shot 2012-04-19 at 5.54.42 PM.png</d_image>
<d_image>media/sw_s2_3/WEI SWS2.3.png</d_image>
<d_video>lbs.6e vid</d_video>
<d_video></d_video>
<d_video></d_video>
</d_location>
<d_location d_code="LB17" d_type="ES" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="LB8" d_type="SW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
</hfloor>
</bldg>
解決
You need to do it in two process. First collecting the d_location nodes. This will return an XMLList. Then for each element of it, you find the parent, which is h_floor nodes which contains the floor code that you want.
var xml:XML = <bldg><hfloor number="18">
<d_location d_code="SW18.10N" d_type="SW" description="Ferbludgit thingamabob">
<d_image>3e_pic1</d_image>
<d_image>3e_pic2</d_image>
<d_image>3e_pic3</d_image>
<d_image>3e_pic4</d_image>
<d_image>3e_pic5</d_image>
<d_video>3e_vid_1</d_video>
<d_video>3e_vid_2</d_video>
<d_video></d_video>
</d_location>
</hfloor>
<hfloor number="15">
<d_location d_code="W1" d_type="PSW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="SW15.W2" d_type="SW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="W3" d_type="LB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="LB12" d_type="SW" description="Screwed up whosamadingy">
<d_image>media/lb15_12/LB-12 LOOKING NORTH.png</d_image>
<d_image>media/lb15_12/LB-12 LOOKING SOUTH.png</d_image>
<d_image>media/lb15_12/Pages from Level_15_Link_Beam_12.png</d_image>
<d_image>media/lb15_12/Pages from Level_15_Link_Beam_12-2.png</d_image>
<d_image>media/lb15_12/Post Demo from CITC018306365-2.png</d_image>
<d_image>media/lb15_12/Rebuilt from CITC018306365.png</d_image>
<d_image>media/lb15_12/WEI LB 12 level 15.png</d_image>
<d_video>Video 1</d_video>
<d_video>Video 2</d_video>
<d_video>Video 3</d_video>
</d_location>
<d_location d_code="LB17" d_type="SW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="LB8" d_type="EB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="W14" d_type="CB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
</hfloor>
<hfloor number="S2">
<d_location d_code="W3" d_type="LB" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="SWS2.3" d_type="SW" description="Whacked flogatron">
<d_image>media/sw_s2_3/CITC000155966.png</d_image>
<d_image>media/sw_s2_3/CITC000155983.png</d_image>
<d_image>media/sw_s2_3/CITC000155996.png</d_image>
<d_image>media/sw_s2_3/CITC000156003.png</d_image>
<d_image>media/sw_s2_3/Screen shot 2012-04-19 at 5.54.42 PM.png</d_image>
<d_image>media/sw_s2_3/WEI SWS2.3.png</d_image>
<d_video>lbs.6e vid</d_video>
<d_video></d_video>
<d_video></d_video>
</d_location>
<d_location d_code="LB17" d_type="ES" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
<d_location d_code="LB8" d_type="SW" description="Broken fetzer valve">
<d_image>3s_pic1</d_image>
</d_location>
</hfloor>
;
Then you create this function which will do the two step process:
function find(type:String) {
var D_LOCATIONS:XMLList = (xml..d_location.(@d_type==type));
for each (var loc:XML in D_LOCATIONS) {
trace("Floor:", loc.parent().@number, loc.@d_code );
}
}
Call it like
find("SW");