Просмотр полной версии : перевод 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 и туда попадали все сообщения, а если такого подмассива нет в массиве тогда нужно создать его
А в чем проблема? Задача четче некуда.
grafillo!
20.08.2014, 16:15
проблема в том что не могу придумать как это сделать чтобы получить доступ к информации по логину + не знаю данные команды х)
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 перевести в массив чтобы я в этом массиве имел возможность по логину вытягивать значения и менять, это нужен ассоциативный многомерный массив наверное
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;
}
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);
именно не могу понять как протрейсить нэйм
masterTaskList[login][0][0]['name']
grafillo!
21.08.2014, 13:05
интересно, а что обозначает первый ноль в этом списке?
Он появился из-за этой строки
masterTaskList[login] = [arr];
Здесь можно убрать обертку в массив, тогда и первый 0 не нужен будет.
grafillo!
21.08.2014, 23:30
а как вывести все неповторяющиеся элементы в массива?
Вы спрашиваете простые алгоритмические задачки. Подумайте сами, попробуйте свои идеи. Если что-то не получается, давайте код со своей идеей. Программу писать за Вас здесь никто не будет.
XML представляет собой связный ацикличный граф aka дерево. Массив же есть плоский список. Дерево можно представить списком, обойдя его. В зависимости от способа обхода возможны различные варианты построения списков. Но вам же не это нужно было. Я к чему... Лучше обходиться теми структурами, которые наиболее полно подходят к задаче. Нафига вам там вообще хмл? А с другой сторны, если есть хмл, нафига вам массив? Стройте E4X запросы к этой хмл и получайте ответы.
grafillo!
22.08.2014, 10:47
Суть в том что мне нужно изменять один элемент из xml (прочёл ли пользователь сообщение), xml нужен потомучто в нём приходит ответ от сервера, строю я чат типа скайпа где есть список пользователей (массивы) и сообщения от них причём если человек не прочитал сообщение от пользователя то оно так и висит и показывается не прочитанным, вот не могу придумать решение как это реализовать. Подскажите пожалуйста идею реализации.
Я не люблю хмл, раньше души в нем не чаял, но потом разочаровался.
Если приходит хмл. Он парсится в типизированные объекты (да, мне не лень писать обработчики). А хмл потом выкидывается, диспоузится, короче избавляюсь от него. А у меня остается пачка типизированных объектов, которые я люблю. И они живут дальше. И в зависимости от других пришедших хмлей, мы либо модифицируем существующие объекты (по ид), либо удаляем их, либо добавляем новые.
grafillo!
26.08.2014, 11:31
а как перебрать циклом элементы в массиве object?
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).
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.