Загрузка XML во флэш-объект - PullRequest
0 голосов
/ 29 июля 2009

Я пытаюсь загрузить данные из файла XML во флэш-объект. При создании flash-объекта в ActionScript это выглядит так:

var presentationObj:Object = {
casestudies: {
    audi: {
        titleStr: 'Audi',
        placement: 'study',
        slides:{
        1:{ src:'img/page1.jpg', group:'img' },
        2:{ src:'img/page2.jpg', group:'img' }
        }
    }
}

и это работает. Я пытаюсь получить XML-файл для загрузки во флэш-объект, используя тот же формат (поэтому я могу сохранить оставшуюся часть кода, который я уже использую). Хотя я понятия не имею, как это сделать. Есть идеи?

Ответы [ 3 ]

1 голос
/ 13 сентября 2009

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

Редактировать: Обнаружен мой XML-код для анализа объекта:

public function xml2Object(baseNode:XMLNode):Object {
    var xmlObject:Object = new Object;

    // attributes
    var attribs:Object;
    for (var attribName:String in baseNode.attributes) {
        if (attribs == null)
            attribs = new Object;

        attribs[attribName] = parseXMLValue(baseNode.attributes[attribName]);
    }
    if (attribs != null)
        xmlObject["_attrib"] = attribs;

    // children
    for (var childNode:XMLNode = baseNode.firstChild; childNode != null; childNode = childNode.nextSibling) {
        // if its a text node, store it and skip element parsing
        if (childNode.nodeType == 3) {
            xmlObject["_text"] = parseXMLValue(childNode.nodeValue);
            continue;
        }

        // only care about elements from here on
        if (childNode.nodeType != 1)
            continue;

        // parse child element
        var childObject:Object = xml2Object(childNode);

        // no child exists with node's name yet
        if (xmlObject[childNode.nodeName] == null)
            xmlObject[childNode.nodeName] = childObject;
        else {
            // child with same name already exists, lets convert it to an array or push on the back if it already is one
            if (!(xmlObject[childNode.nodeName] instanceof Array)) {
                var existingObject:Object = xmlObject[childNode.nodeName];
                xmlObject[childNode.nodeName] = new Array();
                xmlObject[childNode.nodeName].push(existingObject);
            }
            xmlObject[childNode.nodeName].push(childObject);
        }
    }

    return xmlObject;
}

public function parseXMLValue(value:String):Object {
    if (parseFloat(value).toString() == value)
        return parseFloat(value);
    else if (value == "false")
        return false;
    else if (value == "true")
        return true;
    return value;
}

xml2Object превратится:

<some_object>
    <sub_object someAttrib="example" />
    <sub_object anotherAttrib="1">
        <another_tag />
        <tag_with_text>hello world</tag_with_text>
    </sub_object>
    <foo>bar</bar>
</some_object>

в:

{
    some_object:
    {
        sub_object:
        [
            {
                _attrib:
                {
                    someAttrib: "example"
                }
            },
            {
                tag_with_text:
                {
                    _text: "hello world"
                },
                another_tag:
                {
                },
                _attrib:
                {
                    anotherAttrib: 1
                }
            }
        ],
        foo:
        {
            _text: "bar"
        }
    }
}
1 голос
/ 13 сентября 2009

Попробуй это. Обратите внимание, что все ключи и значения заканчиваются как строки.

С учетом следующего XML:
<test id="an ID"> <subnode> <subsubnode> Cheese </subsubnode> </subnode> </test>
Он должен сгенерировать следующий объект:
{ id: "an ID", subnode: { subsubnode: "Cheese" } }

Отказ от ответственности: не полностью проверен!

function objectFromXML(xml:XML):Object
{
    var obj:Object = {  };

           // Check if xml has no child nodes:
    if (xml.hasSimpleContent()) {
        return String(xml);     // Return its value
    }

    // Parse out attributes:
    for each (var attr:XML in xml.@ * ) {
        obj[String(attr.name())] = attr;
    }

    // Parse out nodes:
    for each (var node:XML in xml.*) {
        obj[String(node.localName())] = objectFromXML(node);
    }

    return obj;
}
0 голосов
/ 30 июля 2009

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

проблема с XML заключается в том, что { foo: "bar" } может быть <node foo="bar" /> или <node><foo>bar</foo></node> ... плюс неясно, откуда должно происходить название узла ... и т. Д. ... это очень часто неясно, что представляет собой разумное и уникальное XML-представление объекта или как XML следует преобразовать в дерево объектов ...

для простых и элегантных манипуляций с XML в AS3, посмотрите на E4X

но на самом деле я бы использовал JSON (используйте as3corelib для en- / decoding) ...

надеюсь, это поможет ...:)

Greetz

back2dos

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...