![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Apr 2011
Сообщений: 1
|
Добрый вечер.
Ребята - какой уже вечер мучаюсь не могу придумать. Есть большой XML файл для управления станком. Нужно сделать интерфейс на флеше для редактирования значений (их около 300). Хочу сделать автоматом (чтобы цикл перебирал все поле+значение, создавал кнопки для редактирования), но в разных частях файла разная вложенность. Никак не получается. Может кто подскажет. |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Написал простенький недопарсер на коленке.
Идея в том, что нам нужно представить одни и те же данные в другом виде. Первая часть задачи состоит в том, чтобы разобрать xml. Разбираем рекурсивно, от родителя к ребенку. Для каждого xml Выводим необходимый вид. Вторая часть заключается в том, чтобы отобразить то, что мы попарсили. Я тут ограничился тем, что в качестве вида возвращаю строку, а вы можете у себя в редакторе вернуть, например, DisplayObjectContainer со всякими кнопочками и текстфилдами. 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() + ':'+'\"'+aXml.valueOf()+'\"'; } // если есть вложенный xml if(xml.hasComplexContent()) { result += '}'; } // если есть текст else if(xml.valueOf().toString().length > 0 ){ result += '}'; result += xml.valueOf(); result += '{/' +xml.name()+ '}'; } // если пустой нод else { result +=' /}'; } return result; }
__________________
#flasher@irc.trg.ru:6667 Последний раз редактировалось Obi; 16.04.2011 в 19:58. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|