Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Редактирование xml файла (http://www.flasher.ru/forum/showthread.php?t=154350)

gavrick 16.04.2011 05:15

Редактирование xml файла
 
Добрый вечер.
Ребята - какой уже вечер мучаюсь не могу придумать.
Есть большой XML файл для управления станком. Нужно сделать интерфейс на флеше для редактирования значений (их около 300).
Хочу сделать автоматом (чтобы цикл перебирал все поле+значение, создавал кнопки для редактирования), но в разных частях файла разная вложенность. Никак не получается. Может кто подскажет.

Obi 16.04.2011 19:51

Написал простенький недопарсер на коленке.
Идея в том, что нам нужно представить одни и те же данные в другом виде.

Первая часть задачи состоит в том, чтобы разобрать xml. Разбираем рекурсивно, от родителя к ребенку. Для каждого xml Выводим необходимый вид.

Вторая часть заключается в том, чтобы отобразить то, что мы попарсили. Я тут ограничился тем, что в качестве вида возвращаю строку, а вы можете у себя в редакторе вернуть, например, DisplayObjectContainer со всякими кнопочками и текстфилдами.

Код AS3:

var xml:XML = 
<data>
  <hello id="world">
    <world att="dwaw"></world>
  </hello>
  <some>text</some>
</data>
 
traceCurrentNode(xml);
 
/**
 * Рекурсивно проходит по xml, создавая для каждого встреченного нода альтернативное отображение
 * @param node xml, который хотим отобразить
 * @param depth глубина, на которой находится текущий xml. Служит для правильного отображения иерархии
 */

public function traceCurrentNode(node:XML, depth:int = 0):void {
        var atts:XMLList = node.attributes()
        var str:String = '';
 
        // создаем отступ, чтобы видеть глубину вложенности
        for(var i:int = 0; i < depth; i++) {
                str +='  ';
        }
 
        // вывели отображение текщей xml
        trace(str, getParsedResultByXml(node));
 
        // если есть вложенный xml
        if(node.hasComplexContent()) {
 
                // для каждого из вложенных детей вызываем эту же функцию.
                for each(var x:XML in node.children()) {
                        traceCurrentNode(x, depth+1);
                }
        }
}
 
/**
 * Формирует строку на основе переданного xml
 * @param xml
 */

private function getParsedResultByXml(xml:XML):String {
        var result:String = '{';
        result += xml.name();
 
        // достаем аттрибуты и вписываем их имена-значения в строку
        for each(var aXml:XML in xml.attributes()) {
                result += ' @'+aXml.name() + ':'+'\&quot;'+aXml.valueOf()+'\&quot;';
        }
 
        // если есть вложенный xml
        if(xml.hasComplexContent()) {
                result += '}';
        } // если есть текст
        else if(xml.valueOf().toString().length > 0  ){
                result += '}';
                result += xml.valueOf();
                result += '{/' +xml.name()+ '}';
        } // если пустой нод
        else {
                result +=' /}';
        }
 
        return result;
}



Часовой пояс GMT +4, время: 07:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.