Рекурсивный анализ XML в Actionscript 2
-
22-08-2019 - |
Вопрос
Я ищу эффективный и многоразовый способ синтаксического анализа XML в объект в ActionScript2.Сама структура xml может измениться, поэтому важно, чтобы я мог анализировать xml без «жесткого кодирования» конкретных узлов и т. д.
Обычно я использую As3, и мне не нужно что-то подобное, поскольку класс XML легко детализировать.Ниже приведен псевдокод AS3 того, чего я пытаюсь достичь.
public function XmlObject(myXmlObject:XML,_node:String):Object
{
var xmlObj:Object=new Object();
for(var node:uint=0;node<myXmlObject[_node].children().length();node++)
{
var attributesList:XMLList=myXmlObject[_node].children()[node].attributes();
var nodeName:String=myXmlObject[_node].children()[node].name();
switch(attributesList.length()>1)
{
//////////////////////
case false:
//////////////////////
{
for each(var attribute:XML in attributesList)
{
xmlObj[nodeName]=attribute;
}
break;
//////////////////////
case true:
//////////////////////
var values:Array=[];
for each(attribute in attributesList)
{
values.push(attribute);
xmlObj[nodeName][String(attribute.name())]=attribute;
}
break;
}
}
return xmlObj;
}
Заранее спасибо за любую помощь в этом вопросе!
Решение
я не до конца понял ваш псевдокод...что происходит с массивом values
?видимо просто выбросили...кроме того, похоже, что это не рекурсивно...
проблема в том, что семантика XML и ECMA-объектов разная...
с чем бы вы это сопоставили?
<cart><item /><item /></cart>
и что тогда это будет?
<cart><item /><cart>
и что это?
<cart />
проблема в том, что в первом случае у вас есть массив, во втором свойство, в третьем ничего...так что ты не можешь знать, что cart.item
будет ...даже если вы скажете, что отдельные дочерние узлы будут заключены в массив, у вас все равно может не быть записи, и, следовательно, cart.item
является null
...не то чтобы as2 будет жаловаться, если вы получите доступ к свойствам null
но всё равно это довольно некрасиво...
e4x кажется лучшим способом перемещения по XML-объектам из мира ECMA...немного подумав, я собрал небольшую (довольно хакерскую) библиотеку: http://code.google.com/p/as24x/вы можете найти другие библиотеки в Google, которые поддерживают больше функций...дело скорее в синтаксисе...
надеюсь это поможет ;)
приветствие
back2dos