Обновление XML-объекта 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 ответ
Ну, я не знаю, есть ли у 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;
}
}
}
Я держу пальцы скрещенными, однако, чтобы кто-то помог вам с каким-то встроенным решением, мне самому это интересно.
Приветствия.