Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как в одну строчку кода сделать xml-рыбу? (http://www.flasher.ru/forum/showthread.php?t=140441)

orcpochta 29.05.2010 12:57

Как в одну строчку кода сделать xml-рыбу?
 
Есть экземпляр класса XML без потомков, но с атрибутами, например такой:
<item id="12345" name="qwerty" />

Как из него сделать рыбу в одну строчку кода?
<item id="" name=""/>

В одну строчку никак?)))

Это все нужно для того, чтобы провести минимальную верификацию структуры данных на то, что все данные в xml-листе одного типа (в примере item), имеют одинаковое число атрибутов, и эти атрибуты имеют одинаковые имена.
Т.е. решение мне видится так, что все элементы xml-листа приводятся к рыбе, а затем сравниваются с какой-то проверочной рыбой (или просто с рыбой первого элемента в листе) через метод toXMLString( ). Т.е., если все элементы имеют одинаковую структуру, то и рыбы у них одинаковые. Конкретно "сделать рыбу в одну строчку" - это чисто из спортивного интереса)))

А вы как бы решали проблему верификации структуры данных в xml-листе?

Wolsh 29.05.2010 15:22

Что именно надо верифицировать?)) Что у всех item есть id и name?
Код AS3:

var list:XMLList = xml..item;
var count:uint = list.length();
if (list..@id.length() == count && list..@name.length() == count)
{
    trace("verified");
}

Вобщем зависит от того, какой глубины и точности верификацию надо. На то, чтобы "все было", на то, чтобы "не было лишнего".. М?

Добавлено через 11 минут
Рыба в одну строчку
Код AS3:

trace(xml.toString().replace(/="[^"]*"/g, '=""'));


wvxvw 29.05.2010 15:38

Код AS3:

var xml : XML =
<nodes>
        <item a="12345"/>
        <item a="34567" b="qwerty"/>
</nodes>;
if (xml.(valueOf().item.(@*.length() == 2 &&
        valueOf().@a && valueOf().@b).length() == valueOf().item.length()))
{
        trace("passed");
}

Но делать в одну строчку не практично.

orcpochta 29.05.2010 15:43

Не, что касается не рыбы, а верификации вообще, то надо сделать проверку, чтобы все элементы в листе имели однородную структуру, т.е. имели один и тот же тип (имя) (мы его не знаем и не должны знать, но в примере это item ), и одинаковый набор атрибутов (одинаковое кол-во и имена) - опять же без какой-либо конкретики,типа id и name, - просто однородность структуры данных должна быть.
Детей рассматривать не надо, т.к. это уже не имеет отношения конкретно к рассматриваемым нами данным. Вот с этой точки зрения, чтобы проверить однородность xml-листа, надо сравнить рыбы от всех его элементов, т.е. сравнить с рыбой первого элемента рыбы всех остальных.

Добавлено через 3 минуты
вот мое кондовое решение))) и рыба не в одну строчку))))

Код AS3:

private function checkDataProviderStructure (dataProvider:XMLList):Boolean
                {
                        var xmlList:XMLList = new XMLList(dataProvider);
                        var fishStr:String = getXMLFish(xmlList[0]).toXMLString( );
 
                        for each (var xml:XML in xmlList)
                        {
                                if (getXMLFish(xml).toXMLString( ) != fishStr) return false;
                        }
 
                        return true;
                }
 
                private function getXMLFish (xml:XML):XML
                {
                        var fish:XML = new XML(xml);
 
                        for (var i:uint = fish.@ * .length( ); i--; )
                        {
                                fish.@ * [i] = "";
                        }
 
                        return fish;
                }

нигде по конкретным именам не обращаюсь))

udaaff 29.05.2010 15:59

А если атрибуты местами поменять?

Wolsh 29.05.2010 16:00

Код AS3:

var verify:Boolean = true;
var l2:XMLList = xml.children();
var fish:String = l2[0].toXMLString().replace(/="[^"]*"/g, '=""');
for (var i:uint = 1; i < l2.length(); i++)
{
        if (l2[i].toXMLString().replace(/="[^"]*"/g, '=""') != fish)
        {
                verify = false;
                break;
        }
}
trace(verify);


udaaff 29.05.2010 16:02

Код:

/=".*?"/g
Можно так еще.

Wolsh 29.05.2010 16:04

udaaff))))
А если ошибка в первенце)))
Тут все вилами на воде...

orcpochta 29.05.2010 16:04

Цитата:

Сообщение от udaaff (Сообщение 911737)
А если атрибуты местами поменять?

можно считать, что размер порядок имеет значение)))
иначе нам просто не организовать структуру, которая не была бы привязана к каким-то конкретным именам

Добавлено через 2 минуты
Цитата:

Сообщение от Wolsh (Сообщение 911721)
Рыба в одну строчку
Код AS3:

trace(xml.toString().replace(/="[^"]*"/g, '=""'));


круто! только там надо не toString, а toXMLString
и я нихрена не понял, что происходит в скобках replace)))))
это надо регулярные выражения почитать, или что это?

Wolsh 29.05.2010 16:11

Да, регулярные выражения.
Ищем =", потом любые символы кроме ", потом "
Когда такая последовательность найдена, она заменяется на =""
Можно и toXMLString(), я не против)))


Часовой пояс GMT +4, время: 14:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.