给出以下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;
}
}
答案 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;
}
}
}
我保持手指交叉,所以有人会用一些内置解决方案帮助你,我自己很好奇。
干杯。