Как получить родительский / верхний уровень родительского XML-узла - PullRequest
1 голос
/ 03 января 2012

Привет, как мне получить родительский элемент верхнего уровня для узла xml в ActionScript?

    <companies>
        <company id="1" name="boo" level="1">
            <company id="2" name="hoo" level="2">
                <company id="3" name="ooo" level="3"/>
            </company>
        </company>
    </companies>

спасибо заранее.

1 Ответ

1 голос
/ 03 января 2012

Редактировать (окончательно):

Я думаю, я понял то, что вы спрашиваете: что такое узел 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 );  
...