Преобразование XML-данных в сильный тип Flex

Проект, над которым я работаю, будет извлекать XML с веб-сервера и создавать на его основе хранилище данных. Данные будут иметь определенные основные поля, но должны быть расширяемыми ... например, у меня есть и более поздние версии, которые могут добавлять дополнительные поля.

В приложении Flex я не хочу, чтобы центральное хранилище данных работало с объектами XML или просто помещало свойства в объекты. Я хочу иметь сильные типы, например класс Person, которые создаются / заполняются из XML.

Как это можно сделать гибким способом? Может ли Flex автоматически создавать человека из XML, если имена атрибутов совпадают, или мне нужно написать функцию преобразования для и т. д.?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
6 314
6

Ответы 6

Не думаю, что это можно сделать автоматически. Обычно я создаю класс a для отражения имеющейся у меня структуры XML, а затем создаю метод статического класса для создания экземпляра объекта с учетом узла XML. Например:

package {

  public class Foo{

     public function Foo(barparam1:String, barparam2:uint, barparam3:String, barparam4:Number){
       this._bar1 = barparam1;
       this._bar2 = barparam2;
       this._bar3 = barparam3;
       this._bar4 = barparam4;
       }

     protected var _bar1:String;
     protected var _bar2:uint;
     protected var _bar3:String;
     protected var _bar4:Number;

     public function get bar1():String{ return this._bar1; }
     public function get bar2():uint    { return this._bar2; }
     public function get bar3():String  { return this._bar3; }
     public function get bar4():Number  { return this._bar4; }

     public function toString():String{
        return "[Foo bar1:\"" + this.bar1 + "\", bar3:\"" + this.bar3 + "\", bar2:" + this.bar2 + ", bar4:" + this.bar4 + "]";
        }

     public static function createFromXml(xmlParam:XML):Foo{

        /* XML Format:
          <foo bar1 = "bar1value" bar2 = "5">
            <bar3>bar3 data</bar3>
            <bar4>10</bar4>
          </foo>
        */

       return new Foo(xmlParam.@bar1, xmlParam.@bar2, xmlParam.bar3[0], xmlParam.bar4[0]);
       }
    }
  }

Если вы не привязаны к XML (например, у вас есть сервер приложений вместо файлового сервера), вы можете рассмотреть возможность использования AMF (Формат сообщения действия) для передачи данных. Есть несколько проектов, которые предоставляют AMF для серверов, включая собственный Blaze DS Adobe и варианты сообщества с открытым исходным кодом, такие как OpenAMF, AMFPHP, ПЯМФ и так далее. Это даст вам возможность переносить настраиваемые объекты с сервера на Flex, автоматический анализ типов данных и безопасность типов. Взгляните на это сравнение вариантов передачи данных, чтобы получить представление об относительных достоинствах.

При этом XML может быть очень полезен для таких вещей, как данные конфигурации приложения, и в этих случаях вы не используете сервер приложений. Я согласен с другим постером, в котором я немедленно проанализирую xml на соответствующие структуры вручную. Обычно я сохраняю их с VO после исправления (для объекта Value) и оставляю участников общедоступными. Я часто делаю это иерархически.

package model.vo
{
public class ConfigVO
{
    public var foo:String;
    public var bar:int;
    public var baz:Boolean;
    public var sections:Array;

    public function ConfigVO(xml:XML)
    {
        parseXML(xml);
    }

    private function parseXML(xml:XML):void
    {
        foo = xml.foo;
        bar = xml.bar;
        baz = (xml.baz == "true");

        sections = [];
        for each(var sectionXML:XML in xml.section)
        {
            sections.push(new SectionVO(sectionXML));
        }
    }
}
}

package model.vo
{
public class SectionVO
{
    public var title:String;

    public function SectionVO(xml:XML)
    {
        parseXML(xml);
    }

    private function parseXML(xml:XML):void
    {
        title = xml.@title;
    }
}
}

В прошлом я видел системы, которые связывали имена элементов XML с определениями классов. Обычно они используют своего рода интроспекцию класса, чтобы определить, какие свойства считать из xml, или они будут иметь некоторые свойства статического класса, которые сопоставляют свойства экземпляра с тегами или атрибутами xml. По моему опыту, они доставляют гораздо больше хлопот, чем они того стоят. Для добавления нового общедоступного свойства и одной строки для чтения данных из атрибута или дочернего тега требуется всего 2 секунды. Я предлагаю избегать таких сложных схем, но для полноты я приведу простой пример.

package model
{
    public class XMLReader
    {
        // maps <tagname> to a class 
        private static var elementClassMap:Object =
        {
            "section": SectionVO,
            "person": PersonVO
        };

        public var parsedElements:Array;

        public function XMLReader(xml:XML)
        {
            parsedElements = [];
            parseXML(xml);
        }

        private function parseXML(xml:XML):void
        {
            var voClass:Class;
            for each(var element:XML in xml.children())
            {
                voClass = elementClassMap[element.name().localname];
                if (voClass)
                {
                    parsedElements.push(new voClass(element));
                }
            }
        }
    }
}

Некоторое время назад я начал работать над библиотекой Flex, которая поможет сериализовать и десериализовать объекты Action Script в XML и обратно. Все, что вам нужно сделать, это создать объекты модели, добавить аннотации к полям, чтобы сериализатор знал, как вы хотите сериализовать поле (элемент, атрибут, какое имя и т. д.), И вызвать процесс (де) сериализации.

Думаю, это соответствует вашим потребностям.

Если хотите, можете проверить это на http://code.google.com/p/flexxb/.

Надеюсь, это окажется полезным.

Создание сильных типов данных имеет несколько преимуществ, наиболее важными из которых являются завершение кода и проверка синтаксиса во время компиляции. Сопоставления вручную могут быть выполнены, но должны быть сгенерированы (и, следовательно, на самом деле больше не являются ручными), чтобы избежать рассинхронизации рано или поздно.

Библиотеки общего преобразования, основанные на самоанализе, универсальны, просты в использовании и их должно хватить для большинства случаев использования.

JAXB - это стандарт для Java. ASXB обеспечивает упрощенную реализацию этой идеи для мира ActionScript. Он использует явные объекты AS с аннотациями для (отмены) маршалинга объектов из и в XML.

Если вы вынуждены использовать XML в сети, я бы посоветовал более внимательно изучить ASXB. Если вы можете выбрать свой формат и у вас есть поддержка на стороне сервера, вам следует выбрать собственный формат AMF Adobes, так как он напрямую поддерживается на языке и имеет гораздо меньшие накладные расходы при транспортировке.

В нашем текущем проекте мы написали небольшие генераторы кода, которые принимают внешний API стороны Java (самоанализ источника, также копирует Javadoc) и генерируют из него классы AS в процессе сборки. Таким образом, было легко переключиться с AMF на XML, когда нас к этому вынуждали внешние требования.

PS: не забудьте добавить параметры компилятора в свой файл конфигурации flex, чтобы сохранить аннотации

AsBeanGen может это сделать. Он генерирует объекты значений для файлов XML, управляемых DTD.

Другие вопросы по теме