AS3: синтаксический анализ XML с помощью переменной команды

#xml #actionscript-3 #actionscript

#xml #actionscript-3 #actionscript

Вопрос:

Я выполняю некоторый анализ уровня загрузки из Ogmo и столкнулся с проблемой. Если у меня есть только один слой, я могу прочитать его следующим образом:

 private function drawLayer(layer:String,xml:Class):void
    {
        var rawData:ByteArray = new xml;
        var dataString:String = rawData.readUTFBytes(rawData.length);
        var typeString:String = "LevelData."   layer   ".tile";
        trace ("Type STring:"   typeString);
        LevelData = new XML(dataString);

        var dataList:XMLList;
        var dataElement:XML;
        dataList = LevelData.terrain.tile; 
        //trace ("dataList: "   dataList);
        for each(dataElement in dataList)
        {    tIndex = (int(dataElement.@tx) / 32)   ((int(dataElement.@ty) / 32) * 9);
            //trace("tIndex is: "   tIndex); 
            _tiles.setTile(int(dataElement.@x) / 32, int(dataElement.@y / 32), tIndex);
        }
  

Где LevelData.terrain.tile — строка синтаксического анализа XML. Однако у меня есть несколько разных уровней, и я хотел иметь возможность динамически анализировать, т. Е.:

 dataList = typeString;
  

Но это не работает,. но он пытается проанализировать typeString из XML, а не строку «typeString». Я не вижу способа сделать то, что я пытаюсь сделать, но я подумал, что если кто-нибудь знает способ, они будут в StackOverflow.

Заранее спасибо!

Ответ №1:

Вы могли бы попробовать:

 dataList = LevelData[layer].tile;
  

Совет: не используйте имена переменных с заглавной буквы; обычно они используются с именами классов. Ваш код может запутаться, если вы их смешаете.

Ответ №2:

Я предполагаю, что ваш xml имеет следующую структуру:

 <level>
    <layer>
        <terrain>
            <tile/>
        </terrain>

        ...

    </layer>
</level>
  

Исходя из заголовка вашего метода, я предполагаю, что вы хотите динамически обращаться либо к плиткам слоя 0, либо к плиткам слоя n. Вы можете использовать E4X следующим образом:

 var tiles:XMLList = levelData.layer[index]..tile;
  

Если у вас есть указатели, связанные с каждым слоем в качестве атрибута:

 <layer index="0"/>
  

Приведенное выше утверждение может стать:

 var tiles:XMLList = levelData.layer.(@index == 0)..tile;
  

выражение «..» может быть заменено полным путем к тегу плитки.

У Senocular отличная страница E4X:

http://www.senocular.com/flash/tutorials/as3withflashcs3/?page=4

Ответ №3:

Я не слишком уверен, есть ли что-нибудь в этом формате

 "LevelData."
  

будет работать для вас в actionscript. Всегда рассматривайте объект как словарь, где вы это делаете .

 LevelData["something"]