Как подсказывает @Cay, взгляните на E4X, это сэкономит вам некоторое время, иначе потраченное на преобразование в объекты и их обход.
Код можно сделать с небольшим упрощением:
loadXML();
function loadXML():void {
var loader:URLLoader=new URLLoader(new URLRequest('test4.xml'));//passing the url loads it automatically
loader.addEventListener(Event.COMPLETE,completeXMLHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, errorXMLHandler);
}
function errorXMLHandler(event:Event):void {
trace('Impossible to load the document at url: ' + event.target.url);
}
function completeXMLHandler(event:Event):void {
var result:XML=new XML(event.target.data);
var items:XMLList = result.item;
var complexes:XMLList = items.complex;
var secondCompexItemsOnly:XMLList = items.complex.(@fid == "2");
trace(items);
trace(complexes);
trace(secondCompexItemsOnly);
}
Взгляните на этот несколько похожий вопрос .
Обновление:
@ Ханна, я внимательно прочитал твои комментарии, но все же я не уверен на 100%, чего ты хочешь достичь. Я предполагаю, что вы хотите найти узлы с правильным состоянием (выбранным из входных данных состояния) и правильным комплексным идентификатором (значением узла). Я предполагаю, что вы можете иметь несколько узлов элементов с правильным состоянием, но с разными именами, которые могут содержать сложные узлы с правильным значением комплексного узла.
Вот что я имею в виду:
var myXML:XML = <content><item image="John.jpg" name="John" state = "New Jersey" >
<complex fid = "0"> mg749</complex>
<complex fid = "1"> ks749</complex>
<complex fid = "2"> ks678</complex>
</item>
<item image="Smith.jpg" name="Smith" state = "California">
<complex fid = "0"> we649</complex>
<complex fid = "1"> sd449</complex>
<complex fid = "2"> df459</complex>
<complex fid = "3"> hj569</complex>
</item>
</content>;
function getItemByStateAndID(state:String,id:String,source:XML):XML{
var resultsByState:XMLList = source.item.(@state == state);
if(resultsByState){//if there are states with the required name, look for complex nodes with requred id
var result:XML = <content />;
for each(var item:XML in resultsByState){//might be multiple items with the same state, but different content ?
var resultById:XMLList = item.complex.(text() == id);
if(resultById){//if there are complex nodes with the right id
var resultItem:XML = item.copy();//copy the item node, so we preserve it's attributes(image,name,state)
resultItem.complex = resultById;//replace the complex node list with the result;
result.appendChild(resultItem);//add it to our main result node, might be multiple item nodes with same states and different names, but the right id, b
}
}
return result;//got all item nodes with the right state and ids, return values;
}
return null;//no results, return null
}
trace(getItemByStateAndID("New Jersey","ks678",myXML));
/*outputs: <content>
<item image="John.jpg" name="John" state="New Jersey">
<complex fid="2">ks678</complex>
</item>
</content>*/
НТН