|
|
|||||
возможна ли сортировка XML объекта?
ну собств. вопрос, есть XML объект. например:
<elem> <subelem id="5" atr=.... /> <subelem id="2" atr=.... /> <subelem id="6" atr=.... /> <subelem id="8" atr=.... /> <subelem id="1" atr=.... /> <subelem id="4" atr=.... /> <subelem id="7" atr=.... /> <subelem id="3" atr=.... /> </elem> Так вот надо отсортировать данный объект XML-ный по id, возможно ли на AS3 выполнить это стандартными средствами, или придется писать свой класс?
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет... |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Нечто очень корявенькое:
function sort(...args):void { var item:XML = args[0] as XML; delete xml..*.(@id == item.@id)[0]; xml.appendChild(item); } var xml:XML = <elem> <subelem id="5"/> <subelem id="2"/> <subelem id="6"/> <subelem id="8"/> <subelem id="1"/> <subelem id="4"/> <subelem id="7"/> <subelem id="3"/> </elem>; var list:XMLList = xml.subelem; var arr:Array = new Array(); for each (var item:XML in list) { arr.push(item); } arr.sortOn('@id', Array.NUMERIC); arr.map(sort); trace(xml.toXMLString()); |
|
|||||
вообщем так в хелпах ничего и не нарыл ценного, написал простенькую функцию, если кому надо будет, то вот:
function xmlSort(sourceXML:XML, id:String):XML { var resultXML:XML = sourceXML; var i=resultXML.children().length(); while(i--){ var j=resultXML.children().length(); while(j--){ if(parseInt(resultXML.children()[j-1].@[id].toXMLString())>parseInt(resultXML.children()[j].@[id].toXMLString())){ var temp_child = resultXML.children()[j-1].toXMLString(); resultXML.replace(j-1, resultXML.children()[j].toXMLString()); resultXML.replace(j, temp_child); } } } return resultXML; } var testXML:XML=<elem> <subelem id="5" atr="wert" /> <subelem id="2" atr="xcvb" /> <subelem id="6" atr="wert" /> <subelem id="8" atr="kghjk" /> <subelem id="1" atr="wefghj" /> <subelem id="4" atr="oib" /> <subelem id="7" atr="wertycv" /> <subelem id="3" atr="wertn" /> </elem> trace(xmlSort(testXML, "id")); __etc, извини, когда свое писал, твоего сообщения небыло еще... у меня еще корявее...
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет... Последний раз редактировалось etc; 19.03.2008 в 20:08. |
|
|||||
Modus ponens
|
var xml:XML = <elem> <subelem id="5"/> <subelem id="2"/> <subelem id="6"/> <subelem id="8"/> <subelem id="1"/> <subelem id="4"/> <subelem id="7"/> <subelem id="3"/> </elem>; var nx:XML; for (var i:int = 0; i < xml.subelem.length(); i++){ try { if(int(xml.subelem[i].@id) > int(xml.subelem[i+1].@id)){ nx = xml.subelem[i].copy(); delete xml.subelem[i]; xml.insertChildAfter(xml.subelem[i], nx); i-=2; } } catch(e:Error){ break; } } trace(xml.toXMLString());
__________________
Hell is the possibility of sanity |
|
|||||
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Два последних - пузырёк.
А у __etc - квиксорт (хоара), что в большинстве случаев лучше. Хотя подозреваю, что когда начинают расставляться по местам, выигрыш сильно теряется... |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Цитата:
Можно провести оптимизацию, но мне лень. И ещё будет плохо себя вести при одинаковых id. з.Ы. Все три варианта кода кривые UPD: Небольшая оптимизация всего и вся: function sort(item:XML, index:int, arr:Array):void { xml.appendChild(item); } var xml:XML = <elem> <subelem id="5"/> <subelem id="2"/> <subelem id="6"/> <subelem id="7" attr="1"/> <subelem id="8"/> <subelem id="1"/> <subelem id="4"/> <subelem id="7" attr="2"/> <subelem id="3"/> </elem>; var list:XMLList = xml.subelem; delete xml.subelem; var arr:Array = new Array(); for each (var item:XML in list) { arr.push(item); } arr.sortOn('@id', Array.NUMERIC); arr.map(sort); trace(xml.toXMLString()); Последний раз редактировалось etc; 20.03.2008 в 10:24. |
|
|||||
_etc, ты же вроде в FDT работаешь, а такой код выдал
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет... |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Цитата:
|
Часовой пояс GMT +4, время: 02:36. |
|
« Предыдущая тема | Следующая тема » |
|
|