Вот модифицированная версия решения @ viatropos'S:
Образец данных:
<?xml version="1.0" encoding="UTF-8"?>
<components type="array">
<component type="mx.controls::ComboBox">
<width>100</width>
<height>100</height>
<color isStyle="true">"0xff0000"</location>
<label>"Im a Combo Box!"</label>
</component>
<component type="mx.controls::Button">
<width>100</width>
<height>100</height>
<color isStyle="true">"0xff0000"</location>
<label>"Im a Button!"</label>
</component>
</components>
Здесь, видимо, произошла ошибка, где была использована для завершения тега.
Я также добавил кавычки вокруг всех значений строк, чтобы было легче их идентифицировать.
Sample (псевдо) Метод:createComponentsFromXML(xml.components)
public function createComponentsFromXML(components:XMLList):void
{
var child:Object;
var component:UIComponent;
var i:int = 0;
var n:int = components.length();
for (i; i < n; i++)
{
child = components[i];
var clazz:Class = flash.utils.getDefinitionByName([email protected]);
component = new clazz(); // dynamic
var property:Object;
var value:Object;
var useIntVal:Boolean;
var intVal:int;
// for each child node
for (property in child.children())
{
useIntVal = false;
value = property.toString();
if(!(value.substr(1, 2) == '"' AND value.substr(-1, value.length()) == '"')) {
useIntVal = true;
intVal = parseInt(value);
}
// button["width"] = 100;
if (property.attribute("isStyle") == "true")
if(useIntVal) {
component.setStyle(property.localName(), intVal);
} else {
component.setStyle(property.localName(), value);
}
else {
if(useIntVal) {
component[property.localName()] = intVal;
} else {
component[property.localName()] = value;
}
}
}
}
}
Я реализовал преобразование в целое убедившись, что я проверить, как предполагается, является ли свойство быть строкой или внутр.
PS: У меня сейчас нет Flex, поэтому вы можете найти несколько ошибок, которые вам нужно исправить.
В этом случае вы можете захотеть иметь свой XML, как это:
<?xml version="1.0" encoding="UTF-8"?>
<components type="array">
<component type="mx.controls::ComboBox">
<properties>
<width>100</width>
<height>100</height>
<color isStyle="true">"0xff0000"</location>
<label>"Im a Combo Box!"</label>
</properties>
</component>
<component type="mx.controls::Button">
<properties>
<width>100</width>
<height>100</height>
<color isStyle="true">"0xff0000"</location>
<label>"Im a Button!"</label>
</properties>
<children>
<!--other children here-->
</children>
</component>
</components>
Потому что я сомневаюсь, что вы можете сделать с одним уровнем вложенности в гармошку.
Я оставлю реализацию функции для вас.
необходимо задать вопрос ... – Simon
Я хочу создать компоненты, читающие XML – Kevin