PDA

Просмотр полной версии : перевод xml в массив


grafillo!
20.08.2014, 14:01
Кто знает подскажите код перевода xml в редактируемый массив,
xml будет такого вида:
<message>
<mes acc="ok" time="1406537375" login="first">привет</mes>
<mes acc="ok" time="1406538150" login="sec">привет</mes>
<mes acc="ok" time="1406538150" login="sec">прива</mes>
<mes acc="ok" time="1406537375" login="first">как дела</mes>
</message>
нужно создать массив массивов, чтобы логин first попадал в подмассив first и туда попадали все сообщения, а если такого подмассива нет в массиве тогда нужно создать его

GBee
20.08.2014, 16:11
А в чем проблема? Задача четче некуда.

grafillo!
20.08.2014, 16:15
проблема в том что не могу придумать как это сделать чтобы получить доступ к информации по логину + не знаю данные команды х)

GBee
20.08.2014, 16:19
function parseXml(xml:XML):Array
{
var msgs:Array = [];
var msgDict:Object = {};
for each(var msg:XML in xml.mes)
{
var login:String = String(msg.@login);
var arr:Array = msgDict[login] as Array;
if(!arr)
{
arr = [];
msgDict[login] = arr;
msgs.push(arr);
}
arr.push(msg);
}
return msgs;
}

Добавлено через 2 минуты
Но доступ по логину будет тоже дурацкий в таком случае.
я бы тогда возвращал msgDict.

и тогда все сообщения от мистера Феста
var firstMsgs:Array = msgDict['first'] as Array

grafillo!
20.08.2014, 16:36
имеется ввиду нужно xml перевести в массив чтобы я в этом массиве имел возможность по логину вытягивать значения и менять, это нужен ассоциативный многомерный массив наверное

GBee
20.08.2014, 16:54
function parseXml(xml:XML):Object
{
var msgDict:Object = {};
for each(var msg:XML in xml.mes)
{
var login:String = String(msg.@login);
var arr:Array = msgDict[login] as Array;
if(!arr)
{
arr = [];
msgDict[login] = arr;

}
arr.push(msg);
}
return msgDict;
}

Rzer
20.08.2014, 17:56
package ru.atflash.server.serialization
{

/**
* Сериализует аттрибуты и вложенности в виде массива
* @author rzer
* @version 1.01
*/

public class CleverXML {

public static function serialize(packet:Object):String {

try {

var xml:XML = objectToXML(packet, packet.id, true);
var result:String = xml.toXMLString();

}catch (err:Error) {
trace("4:[CXML] Error while serialize object", err.message);
}

return result;
}

public static function deserialize(val:String):Object {

try {

var xml:XML = new XML(val);

var obj:Object = objectFromXML(xml, true);

} catch (err:Error) {
trace("3:[CXML] Error while deserialize xml:",err.message, val);
}

return obj;

}


private static function objectFromXML(source:XML, insertId:Boolean = false):Object {

if (source.toXMLString() == "") {
return null;
}

var result:Object = parseAttributes(source);

if (insertId) {
result["id"] = source.name().toString();
}

for (var i:int = 0; i < source.children().length(); i++) {

var anItem:XML = source.children()[i];
var aName:String = anItem.name().toString();

var anArray:Array = result[aName];

if (!anArray) {
anArray = new Array();
}

anArray.push(objectFromXML(anItem));

result[aName] = anArray;

}

return result;
}

private static function objectToXML(source:Object, nodeName:String, ignoreID:Boolean = false):XML {

var result:XML = <packet/>;
result.setName(nodeName);


for (var item:String in source) {

var anItem:* = source[item];

switch (typeof(anItem)) {

case "boolean":
case "string":
case "number": {

if (!ignoreID || item != "id") {

result.@[item] = anItem;
}

break;
}

case "object": {

if (anItem is Array) {
var anArray:Array;

anArray = anItem as Array;

if (anArray.length > 0) {
for (var i:int = 0; i < anArray.length; i++) {
result.appendChild(objectToXML(anArray[i], item));
}
} else {
result.appendChild(objectToXML(anItem as Object, item));
}
} else {
result.appendChild(objectToXML(anItem as Object, item));
}

break;
}

case "xml": {
result.appendChild(anItem);
break;
}

}
}

return result;

}

private static function parseAttributes(source:XML):Object {

var result:Object = new Object();

var aList:XMLList = source.attributes();

for (var i:int = 0; i < aList.length(); i++) {

var anItem:XML = aList[i];
var aName:String = anItem.name().toString();
var anAttribute:String = anItem.toXMLString();

if (String(Number(anAttribute)) == anAttribute) {
result[aName] = Number(anAttribute);
} else {
result[aName] = anAttribute;
}
}

return(result);
}



}

}

grafillo!
20.08.2014, 19:21
а как получить доступ к элементу name?

var masterTaskList:Object = new Object();
var login:String = "user";
var arr:Array = new Array();
arr.push({name:"Kola",age:"25"});

masterTaskList[login] = [arr];


trace (masterTaskList.user);
именно не могу понять как протрейсить нэйм

GBee
20.08.2014, 19:27
masterTaskList[login][0][0]['name']

grafillo!
21.08.2014, 13:05
интересно, а что обозначает первый ноль в этом списке?

КорДум
21.08.2014, 13:08
Он появился из-за этой строки
masterTaskList[login] = [arr];
Здесь можно убрать обертку в массив, тогда и первый 0 не нужен будет.

grafillo!
21.08.2014, 23:30
а как вывести все неповторяющиеся элементы в массива?

КорДум
21.08.2014, 23:48
Вы спрашиваете простые алгоритмические задачки. Подумайте сами, попробуйте свои идеи. Если что-то не получается, давайте код со своей идеей. Программу писать за Вас здесь никто не будет.

dimarik
22.08.2014, 01:25
XML представляет собой связный ацикличный граф aka дерево. Массив же есть плоский список. Дерево можно представить списком, обойдя его. В зависимости от способа обхода возможны различные варианты построения списков. Но вам же не это нужно было. Я к чему... Лучше обходиться теми структурами, которые наиболее полно подходят к задаче. Нафига вам там вообще хмл? А с другой сторны, если есть хмл, нафига вам массив? Стройте E4X запросы к этой хмл и получайте ответы.

grafillo!
22.08.2014, 10:47
Суть в том что мне нужно изменять один элемент из xml (прочёл ли пользователь сообщение), xml нужен потомучто в нём приходит ответ от сервера, строю я чат типа скайпа где есть список пользователей (массивы) и сообщения от них причём если человек не прочитал сообщение от пользователя то оно так и висит и показывается не прочитанным, вот не могу придумать решение как это реализовать. Подскажите пожалуйста идею реализации.

GBee
22.08.2014, 17:16
Я не люблю хмл, раньше души в нем не чаял, но потом разочаровался.
Если приходит хмл. Он парсится в типизированные объекты (да, мне не лень писать обработчики). А хмл потом выкидывается, диспоузится, короче избавляюсь от него. А у меня остается пачка типизированных объектов, которые я люблю. И они живут дальше. И в зависимости от других пришедших хмлей, мы либо модифицируем существующие объекты (по ид), либо удаляем их, либо добавляем новые.

grafillo!
26.08.2014, 11:31
а как перебрать циклом элементы в массиве object?

dimarik
26.08.2014, 11:40
for..in (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/statements.html#for..in), for each..in (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/statements.html#for_each..in).