使用e4x直接在一行中更新actionscript xml对象?

时间:2010-09-13 09:31:27

标签: javascript xml flex actionscript e4x

给出以下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 个答案:

答案 0 :(得分:1)

好吧,我不知道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;
        }
    }
}

我保持手指交叉,所以有人会用一些内置解决方案帮助你,我自己很好奇。

干杯。