Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Сложный xml (http://www.flasher.ru/forum/showthread.php?t=168027)

SiFF 15.09.2011 20:55

Сложный xml
 
допустим имеется *.xml-файл приблизительного формата:
Код:

<?xml version="1.0" encoding="UTF-8"?>
<contents>
        <mainText header="Жилой дом"><![CDATA[Современные квартиры и развитая инфраструктура. <br/><br/>Для просмотра деталей кликните на дом. ]]></mainText>
        <podjezd1>
                <etazh8>
                        <flat1 price="810001"></flat1>
                        <flat2 price="810002"></flat2>
                        <flat3 price="810003"></flat3>
                        <flat4 price="810004"></flat4>
                        <flat5 price="810005"></flat5>
                </etazh8>
                <etazh9>
                        <flat1 price="910001"></flat1>
                        <flat2 price="910002"></flat2>
                        <flat3 price="910003"></flat3>
                        <flat4 price="910004"></flat4>
                        <flat5 price="910005"></flat5>
                </etazh9>
                <etazh10>
                        <flat1 price="101001"></flat1>
                        <flat2 price="101002"></flat2>
                        <flat3 price="101003"></flat3>
                        <flat4 price="101004"></flat4>
                        <flat5 price="101005"></flat5>
                </etazh10>
        </podjezd1>
        <podjezd2>
                <etazh5>
                        <flat1 price="250001"></flat1>
                        <flat2 price="250002"></flat2>
                        <flat3 price="250003"></flat3>
                        <flat4 price="250004"></flat4>
                        <flat5 price="250005"></flat5>
                </etazh5>
                <etazh6>
                        <flat1 price="260001"></flat1>
                        <flat2 price="260002"></flat2>
                        <flat3 price="260003"></flat3>
                        <flat4 price="260004"></flat4>
                        <flat5 price="260005"></flat5>
                </etazh6>
                <etazh7>
                        <flat1 price="270001"></flat1>
                        <flat2 price="270002"></flat2>
                        <flat3 price="270003"></flat3>
                        <flat4 price="270004"></flat4>
                        <flat5 price="270005"></flat5>
                </etazh7>
                <etazh8>
                        <flat1 price="280001"></flat1>
                        <flat2 price="280002"></flat2>
                        <flat3 price="280003"></flat3>
                        <flat4 price="280004"></flat4>
                        <flat5 price="280005"></flat5>
                </etazh8>
                <etazh9>
                        <flat1 price="290001"></flat1>
                        <flat2 price="290002"></flat2>
                        <flat3 price="290003"></flat3>
                        <flat4 price="290004"></flat4>
                        <flat5 price="290005"></flat5>
                </etazh9>
                <etazh10>
                        <flat1 price="301001"></flat1>
                        <flat2 price="302002"></flat2>
                        <flat3 price="303003"></flat3>
                        <flat4 price="304004"></flat4>
                        <flat5 price="305005"></flat5>
                </etazh10>
        </podjezd2>
        <podjezd3>
                <etazh1>
                        <flat1 totalspace="110,96" rooms="3" room1="48,8" room2="19,26" room3="15,59" prijomka="3,78" wc="2,96" sub1="1,71" sub2="1,34" corridor="17,52" price="130001">sold</flat1>
                        <flat2 totalspace="56,54" rooms="2" room1="16,08" room2="15,87" prijomka="2,88" wc="2,47" sub1="2,9" corridor="18,95" price="130002">reserved</flat2>
                </etazh1>
                <etazh2>
                        <flat1 totalspace="47,95" rooms="1" room1="19,94" kitchen="14,1" wc="4,73" balcony="6,16" corridor="6,1" price="230001"></flat1>
                        <flat2 totalspace="60,51" rooms="2" room1="19,09" room2="14,17" kitchen="10,95" wc="1,63" bath="3,77" balcony="2,66" corridor="10,13" price="230002"></flat2>
                        <flat3 totalspace="79,42" rooms="3" room1="17,11" room2="15,98" room3="14,01" kitchen="11,19" wc="1,6" bath="3,62" balcony="6,08" corridor="11,22" sub1="1,65" price="230003">sold</flat3>
                </etazh2>
</contents>

(Взят для примера)

Как из него считывать данные? Я знаю как считывать с односложного, формата
Код:

<etazh10>
        <flat1 price="104001"></flat1>
        <flat2 price="104002"></flat2>
        <flat3 price="104003"></flat3>
        <flat4 price="104004"></flat4>
</etazh10>

В чём отличия?

mooncar 15.09.2011 22:27

У вас XML неверно организован.
Пример сложного конфига и его парсера:
Код:

<?xml version="1.0" encoding="UTF-8"?>
<contents>
        <mainText header="Жилой дом"><![CDATA[Современные квартиры и развитая инфраструктура. <br/><br/>Для просмотра деталей кликните на дом. ]]></mainText>
        <podjezds>
                <podjezd id="1">
                        <floor id="1">
                                <flat id="1" price="810001">Описание 1 квартиры 1 этажа 1 подъезда</flat>
                                <flat id="2" price="65654">Описание 2 квартиры 1 этажа 1 подъезда</flat>
                                <flat id="3" price="54654654">Описание 3 квартиры 1 этажа 1 подъезда</flat>
                        </floor>
                        <floor id="2">
                                <flat id="1" price="54654">Описание 1 квартиры 2 этажа 1 подъезда</flat>
                                <flat id="2" price="5654">Описание 2 квартиры 2 этажа 1 подъезда</flat>
                                <flat id="3" price="810001">Описание 3 квартиры 2 этажа 1 подъезда</flat>
                        </floor>
                        <floor id="3">
                                <flat id="1" price="810001">Описание 1 квартиры 3 этажа 1 подъезда</flat>
                                <flat id="2" price="810001">Описание 2 квартиры 3 этажа 1 подъезда</flat>
                                <flat id="3" price="810001">Описание 3 квартиры 3 этажа 1 подъезда</flat>
                        </floor>
                </podjezd>
                <podjezd id="2">
                        <floor id="1">
                                <flat id="1" price="810001">Описание 1 квартиры 1 этажа 2 подъезда</flat>
                                <flat id="2" price="810001">Описание 2 квартиры 1 этажа 2 подъезда</flat>
                                <flat id="3" price="810001">Описание 3 квартиры 1 этажа 2 подъезда</flat>
                        </floor>
                        <floor id="2">
                                <flat id="1" price="810001">Описание 1 квартиры 2 этажа 2 подъезда</flat>
                                <flat id="2" price="222222">Описание 2 квартиры 2 этажа 2 подъезда</flat>
                                <flat id="3" price="810001">Описание 3 квартиры 2 этажа 2 подъезда</flat>
                        </floor>
                        <floor id="3">
                                <flat id="1" price="810001">Описание 1 квартиры 3 этажа 2 подъезда</flat>
                                <flat id="2" price="810001">Описание 2 квартиры 3 этажа 2 подъезда</flat>
                                <flat id="3" price="810001">Описание 3 квартиры 3 этажа 2 подъезда</flat>
                        </floor>
                </podjezd>       
        </podjezds>
</contents>

Код AS1/AS2:

var xmlData:XML = new XML();
xmlData.ignoreWhite = true ;
xmlData.onLoad = loadXML;
xmlData.load('config.xml');
 
var house:Array = new Array(); //сюда будем загонять извлеченные из конфига даные
var mTextHeader:String ;
var mTextContent:String ;
 
function loadXML(success:Boolean)
{
        if (success)
        {
                var mainNode:XMLNode = this.firstChild ;
                mTextHeader = mainNode.firstChild.attributes['header']; //получили значение атрибута header узла <mainText>
                mTextContent = mainNode.firstChild.firstChild.nodeValue ;//получили значение CDATA узла <mainText>
 
                var amountPodjezds:Number = mainNode.childNodes[1].childNodes.length ; //количесвто подъездов, mainNode.childNodes[1] - это узел <podjezds>
 
                for (i = 0; i < amountPodjezds; i++)
                {
                        //Предполагая, что номера (id) подъездов в атрибуте id узлов <floor>
                        //могут "плавать", то есть быть перепутаны в конфиге или начинаться
                        //например, не с 1, вводим собственную нумерацию для
                        //дальнейшего использования в коде
                        var idPod:Number = Number(mainNode.childNodes[1].childNodes[i].attributes['id']);
                        house[idPod] = new Array()//массив, где содержится вся инфа подъезда
                        house[idPod]['floors'] = new Array(); //создаем массивы для работы с этажами подъезда (то есть уже массивы 3 уровня)
 
                        var amountFloors:Number = mainNode.childNodes[1].childNodes[i].childNodes.length ;//количесвто этажей в подъезде
 
                        for (j = 0; j < amountFloors; j++)
                        {
                                //Проворачиваем аналогично для id этажей
                                var idFloor:Number = Number(mainNode.childNodes[1].childNodes[i].childNodes[j].attributes['id']);
                                house[idPod]['floors'][idFloor] = new Array(); //массив, где содержится вся инфа этажа
                                house[idPod]['floors'][idFloor]['flats'] = new Array();//создаем массивы для работы с квартирами этажа (то есть уже массивы 5 уровня)
 
                                var amountFlats:Number = mainNode.childNodes[1].childNodes[i].childNodes[j].childNodes.length ;//количесвто квартир на этаже
 
                                for (k = 0; k < amountFlats; k++)
                                {                               
                                        var idFlat:Number = Number(mainNode.childNodes[1].childNodes[i].childNodes[j].childNodes[k].attributes['id']);
                                        house[idPod]['floors'][idFloor]['flats'][idFlat] = new Array(); //массив, где содержится вся инфа квартиры
 
                                        house[idPod]['floors'][idFloor]['flats'][idFlat]['price'] = Number(mainNode.childNodes[1].childNodes[i].childNodes[j].childNodes[k].attributes['price']);
                                        house[idPod]['floors'][idFloor]['flats'][idFlat]['decsr'] = mainNode.childNodes[1].childNodes[i].childNodes[j].childNodes[k].firstChild.toString() ; //описание квартиры
                                        trace(house[idPod]['floors'][idFloor]['flats'][idFlat]['decsr'])
                                }
                        }
                }
 
                nextActions();
 
        }
        else
        {
                tPercent.text = 'Ошибка связи\nс конфигуратором данных xml';
        }
}
 
function nextActions()
{       
        trace('=================')
        trace(mTextContent);
        trace('=================')
        trace('Описание:  ' + house[2]['floors'][2]['flats'][2]['decsr']) //Описание 2 квартиры 2 этажа 2 подъезда
        trace('Цена:  ' + house[2]['floors'][2]['flats'][2]['price']) //Цена 2 квартиры 2 этажа 2 подъезда
}

Создайте config.xml, скомпилируйте код, посмотрите.

Замечание. По сути, такое подход многим покажется избыточным - создание сложной структуры вложенных массивов для хранения данных, в то время как экземпляр полученного XML уже является сложным массивом.
Но для удобства последующего обращения к данным я, например, делаю именно так.

SiFF 16.09.2011 14:36

mooncar, спасибо тебе огромное. Честно говоря я тоже сторонник большего количества самих файлов, но в упрощенной форме. Так можно оптимизировать и ускорить работу ролика. Да и в PHP так же. Просто в текущем заказе ну никак не избежать, поэтому ты меня очень выручил. Ещё раз спасибо:)

mooncar 16.09.2011 21:48

Пожалуйста.
Цитата:

Сообщение от SiFF (Сообщение 1031916)
mooncarя тоже сторонник большего количества самих файлов, но в упрощенной форме. Так можно оптимизировать и ускорить работу ролика. Да и в PHP так же. Просто в текущем заказе ну никак не избежать, поэтому ты меня очень выручил.

Вроде я о большом количестве файлов нигде не говорил. :)
Один большой конфиг, мне кажется, проще и легче использовать, чем набор маленьких (как минимум это снижает количество запросов браузера к серверу).

SiFF 17.09.2011 19:11

Цитата:

Сообщение от mooncar (Сообщение 1032025)
Пожалуйста.

Вроде я о большом количестве файлов нигде не говорил. :)
Один большой конфиг, мне кажется, проще и легче использовать, чем набор маленьких (как минимум это снижает количество запросов браузера к серверу).

В проекте суть заключается в том, что будет огромное количество маленьких флешек, поэтому от каждой делать запросы к большим файлам xml, увеличивает в совокупности время запроса:) А если каждая маленькая флешка будет спрашивать у каждого маленького xml, то, имхо, работать будет всё быстрее...


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

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