Updating an actionscript xml object directly in one line using e4x?

十年热恋 提交于 2020-01-07 04:57:13

问题


Given the following xml:

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

I know that is it possible to create the above xml as follows (which is very cool):

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

However, what if we do not know the names of the nodes or how many levels exist? We can accomplish this using the method below but it really feels like there should be an easier, better way to do this:

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:


Well, I don't know if Flex has any build-in mechanism for dealing with such situation (I don't suppose it does) but I certainly can help you make your function more versatile

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;
        }
    }
}

I keep my fingers crossed however so someone would help you with some build-in solution, I'm curious about it myself.

Cheers.



来源:https://stackoverflow.com/questions/3699183/updating-an-actionscript-xml-object-directly-in-one-line-using-e4x

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!