Редактировать (окончательно):
Я думаю, я понял то, что вы спрашиваете: что такое узел company.(@level = 1)
, у которого выбран company.(@level = 3)
как дочерний элемент. Это также известно как «предок» выбранного узла. AS3 XML не имеет надежного синтаксиса предков, поэтому вам придется шагать вверх вручную.
Для неизвестных уровней воспитания детей используйте цикл, подобный комментариям в этом посте обсуждаем . Обратите внимание, что следующий код использует атрибут id
для поиска. Это связано с тем, что все id
должны быть уникальными в пределах одного XML, поэтому вы обязательно найдете идентификатор.
var xml:XML = <companies>
<company id="1" name="boo" level="1">
<company id="2" name="hoo" level="2">
<company id="3" name="ooo" level="3"/>
</company>
</company>
<company id="4" name="boo" level="1">
<company id="5" name="hoo" level="2">
<company id="6" name="ooo" level="3"/>
</company>
</company>
<company id="7" name="boo" level="1">
<company id="8" name="hoo" level="2">
<company id="9" name="ooo" level="3"/>
</company>
</company>
</companies>
// just for testing:
var selectedNodeXML:XML =
<company id="8" name="hoo" level="2" />
var selectedID:String = selectedNodeXML.@id;
trace("selectedID = " + selectedID);
var ancestorID:String = "";
for each( var companyNode:XML in xml.elements("*") )
{
trace( "searching: " + companyNode.toXMLString() );
trace( "res: " + (companyNode..company.(@id == selectedID).@id == selectedID));
if(
companyNode.@id == selectedNodeXML.@id
//|| companyNode.contains(selectedNodeXML) // You can use this if nothing gets messed up . . .
|| companyNode..company.(@id == selectedID).@id == selectedID // . . . but I think this is more reliable.
){
ancestorID = companyNode.@id.toString();
break;
}
}
trace( "significant ancestor ID: " + ancestorID );