【问题标题】:Updating an actionscript xml object directly in one line using e4x?使用 e4x 在一行中直接更新 actionscript xml 对象?
【发布时间】:2010-09-13 09:31:27
【问题描述】:

给定以下 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;
    }
}

【问题讨论】:

    标签: javascript xml apache-flex actionscript e4x


    【解决方案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;
            }
        }
    }
    

    不过,我一直祈祷,所以有人会帮助你提供一些内置的解决方案,我自己对此很好奇。

    干杯。

    【讨论】:

    • 我喜欢你在这里尝试做的事情,但这只有在 xml 中已经存在中间节点时才有效。例如,以下将导致 TypeError (Cannot access a property or method of a null object reference): var xml:XML =
      ; updateXml(xml, "personalDetails.name", "John");
    • 是的,很抱歉。我检查了是否正在创建节点,但仅在最底层创建,虽然这有效,但我认为其他节点也有效。我已经修复了上面的代码,所以它不会再抛出异常了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多