Обновление XML-объекта actionscript напрямую в одну строку с использованием e4x? - PullRequest
0 голосов
/ 13 сентября 2010

С учетом следующего xml:

<form>
    <personalDetails>
        <name>John</name>
    </personalDetails>
    <financeDetails>
        <income>
            <salary>1000000</salary>
        </income>
    </financeDetails>
</form>

Я знаю, что можно создать вышеуказанный xml следующим образом (что очень круто):

var xml:XML = <form />;
xml.personalDetails.name = "John";
xml.financeDetails.income.salary = 1000000;

Однако, что если мы не знаем имен узлов или сколько уровней существует? Мы можем сделать это, используя метод, приведенный ниже, но на самом деле кажется, что должен быть более простой и лучший способ сделать это:

var xml:XML = <form />;
updateXml(xml, "personalDetails.name", "John");
updateXml(xml, "financeDetails.income.salary", "1000000");

function updateXml(xml:XML, path:String, data:String):void {

    var nodesArray:Array = path.split(".");

    switch (nodesArray.length) {

        case 1: 
            xml[nodesArray[0]] = data;
            break;

        case 2:
            xml[nodesArray[0]][nodesArray[1]] = data;
            break;

        case 3:
            xml[nodesArray[0]][nodesArray[1]][nodesArray[2]] = data;
            break;
    }
}

1 Ответ

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

Ну, я не знаю, есть ли во Flex какой-либо встроенный механизм для решения такой ситуации (я не думаю, что он есть), но я, безусловно, могу помочь вам сделать вашу функцию более универсальной

function updateXml(xml:XML, path:String, data:String):void {
    var nodesArray:Array = path.split(".");
    var tempXML:XML = xml;
    var tempXMLCandidate:XML;
    var tagName:String;
    for (var i:int = 0; i < nodesArray.length; i++){
        tagName = nodesArray[i];
        if (i == nodesArray.length - 1){
            tempXML[tagName] = data;
        }else{
            tempXMLCandidate = tempXML[tagName][0];
            if (!tempXMLCandidate){
                tempXMLCandidate = <{tagName}>;
                tempXML.appendChild(tempXMLCandidate);
            }
            tempXML = tempXMLCandidate;
        }
    }
}

Я держу пальцы скрещенными, однако, чтобы кто-то помог вам с каким-то встроенным решением, мне самому это интересно.

Приветствия.

...