XML

Intrebari despre Actionscript 3.0

Re: XML

Mesajde Barna Biro » Dum Iul 17, 2011 6:59 pm

Dap, localName(); era metoda. Pentru a stoca ordinea si chiar si tipul elementului ( daca este un text simplu, daca e titlu, daca e poza, etc. ) ai putea sa incerci poate ceva de genul:

XMLExample.as
Cod: Selectaţi tot
package
{
    import com.Example.model.PageData;
    import com.Example.parsers.IParser;
    import com.Example.parsers.XMLParser;
    import com.Example.parsers.strategies.PageInfoParseStrategy;
   
    import flash.display.Sprite;
   
    public class XMLExample extends Sprite
    {
        private var _xmlData:XML =
            <content>
              <section>
                <page>
                    <title>SomeTitle1</title>
                    <image>/images/pic1.jpg</image>
                    <text>SomeText1</text>
                </page>
                <page>
                    <text>SomeText2</text>
                    <image>/images/pic2.jpg</image>
                    <text>SomeText3</text>
                </page>
              </section>
            </content>;
       
        public function XMLExample()
        {
            // Create the XML parser and the parse strategy.
            var parser:IParser      = new XMLParser();
            parser.parseStrategy    = new PageInfoParseStrategy();
           
            // Parse the XML data and store the parse result.
            var pageDataList:Vector.<PageData> = parser.parse(_xmlData) as Vector.<PageData>;
        }
    }
}

ElementType.as
Cod: Selectaţi tot
package com.Example.enums
{
    public class ElementType
    {
        public static const TITLE:ElementType   = new ElementType("title");
        public static const TEXT:ElementType    = new ElementType("text");
        public static const IMAGE:ElementType   = new ElementType("image");
       
        private static var _elementTypes:Vector.<ElementType> = new <ElementType>[
                TITLE, TEXT, IMAGE];
       
        private var _value:String;
       
        public function ElementType(value:String)
        {
            _value = value;
        }
       
        public static function getType(value:String):ElementType
        {
            var result:ElementType;
           
            var totalTypes:uint = _elementTypes.length;
            var i:uint;
           
            for (i = 0; i < totalTypes; i++)
            {
                if (_elementTypes[i].getValue().toLowerCase() == value.toLowerCase())
                {
                    result = _elementTypes[i];
                    break;
                }
            }
           
            return result;
        }
       
        public function getValue():String
        {
            return _value;
        }
    }
}

PageData.as
Cod: Selectaţi tot
package com.Example.model
{
    public class PageData
    {
        private var _pageElements:Vector.<PageElement> = new Vector.<PageElement>();
       
        public function addElement(element:PageElement):void
        {
            _pageElements.push(element);
        }
       
        public function getElements():Vector.<PageElement>
        {
            return _pageElements;
        }
       
        public function getElementByOrder(order:uint):PageElement
        {
            var result:PageElement;
            var totalPageElements:uint = _pageElements.length;
            var i:uint;
           
            for (i = 0; i < totalPageElements; i++)
            {
                if (_pageElements[i].order == order)
                {
                    result = _pageElements[i];
                    break;
                }
            }
           
            return result;
        }
    }
}

PageElement.as
Cod: Selectaţi tot
package com.Example.model
{
    import com.Example.enums.ElementType;

    public class PageElement
    {
        private var _type:ElementType;
        private var _value:String;
        private var _order:uint;
       
        public function PageElement(type:ElementType,
                                    value:String,
                                    order:uint)
        {
            _type   = type;
            _value  = value;
            _order  = order;
        }
       
        public function get type():ElementType
        {
            return _type;
        }
       
        public function get value():String
        {
            return _value;
        }
       
        public function get order():uint
        {
            return _order;
        }
    }
}

IParser.as
Cod: Selectaţi tot
package com.Example.parsers
{
    import com.Example.parsers.strategies.IParseStrategy;

    public interface IParser
    {
        function parse(data:Object):Object;
        function set parseStrategy(strategy:IParseStrategy):void;
    }
}

IParseStrategy.as
Cod: Selectaţi tot
package com.Example.parsers.strategies
{
    public interface IParseStrategy
    {
        function execute(data:Object):Object;
    }
}

PageInfoParseStrategy.as
Cod: Selectaţi tot
package com.Example.parsers.strategies
{
    import com.Example.enums.ElementType;
    import com.Example.model.PageData;
    import com.Example.model.PageElement;

    public class PageInfoParseStrategy implements IParseStrategy
    {
        public function execute(data:Object):Object
        {
            var xmlData:XML = data as XML;
            var result:Vector.<PageData> = new Vector.<PageData>();
           
            var pageXmlList:XMLList = xmlData..page;
            var pageInfo:XML;
            var pageData:PageData;
           
            for each (pageInfo in pageXmlList)
            {
                pageData = new PageData();
               
                var children:XMLList    = pageInfo.children();
                var totalChildren:uint  = children.length();
                var i:uint;
               
                for (i = 0; i < totalChildren; i++)
                {
                    var child:XML                   = children[i] as XML;
                    var elementType:ElementType     = ElementType.getType(child.localName().toString());
                    var pageElement:PageElement     = new PageElement(elementType, child.toString(), i);
                   
                    pageData.addElement(pageElement);
                }
               
                result.push(pageData);
            }
           
            return result;
        }
    }
}

XMLParser.as
Cod: Selectaţi tot
package com.Example.parsers
{
    import com.Example.parsers.strategies.IParseStrategy;

    public class XMLParser implements IParser
    {
        public function parse(data:Object):Object
        {
            var xmlData:XML = XML(data);
            var result:Object;
           
            // Both the XML data and parse strategy must exist
            // in order to do any parsing.
            if (xmlData != null && _parseStrategy != null)
                result = _parseStrategy.execute(xmlData);
           
            return result;
        }
       
        private var _parseStrategy:IParseStrategy;
       
        public function set parseStrategy(strategy:IParseStrategy):void
        {
            if (_parseStrategy == strategy)
                return;
           
            _parseStrategy = strategy;
        }
    }
}

E doar un exemplu rapid dar cred ca si din cauza oboselii, am fost luat un pic de val si poate am introdus prea multe chestii noi pentru nivelul la care te aflii momentan... sper sa intelegi totusi cam ce se intampla pe acolo, dar daca ceva nu reusesti sa intelegi nicicum, intreaba-ma! Spor! ;)

EDIT: Exemplul de mai sus, in esenta, face urmatoarea chestie: avem un obiect PageData care va contine informatii despre elementele care pot aparea intr-o pagina. Elementele care pot aparea, sunt reprezentate de obiectul PageElement, care stocheaza informatii despre fiecare element. PageElement stocheaza tipul elementului ( daca este vorba de un titlu, text sau o imagine ), tipul fiind determinat pe baza numelui nodului din XML ( e luat cu localName(); si pe baza tipului returnat, cautam un tip corespunzator, definit in ElementType ). Pe langa tip, stocheaza evident valoarea elementului si poate stoca ordinea, pe care o specifici tu in momentul in care extract informatiile din XML.

Exista un XMLParser, care are rolul de a parse-ui XML-ul tau, folosind o strategie de parse-uire, numit PageInfoParseStrategy ( care contine logica necesara pentru a extrage informatiile despre pagini din XML-ul tau ). Dupa ce se face parse-uirea, vei avea un vector care contine obiecte de tipul PageData ( adica informatii despre fiecare pagina ) si care la randul lor, contin informatii despre elementele care probabil o sa vrei sa le afisezi. Poti sa parcurgi lista de elemente din PageData chemand metoda getElements(); si pe baza tipului elementului ( gen: pageElement[i].type == ElementType.TEXT {} ), sa creezi componenta vizuala corespunzatoare.

Doar sa ai grija ca tipurile de elemente pe care le definesti in ElementType sa corespunda cu numele nodurilor din XML ( sau vice-versa ).

EDIT: Pentru orice eventualitate, am uplodat sursele:

XMLExample.zip
(11.82 KiB) Descărcat de 194 ori

Nu am mai stat sa trace-ui si valorile din vectorul final, am zis ca te descurci sigur cu aia.
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: XML

Mesajde myth » Dum Iul 17, 2011 10:57 pm

mersi dar am facut dupa metoda mea :) cred ca te-ai chinuit destul de mult sa scrii postul si apreciez asta dar poate o sa-i ajute pe altii care au aceasi problema... eu in clasa PageData am o variabila care-mi zice in se sectiune se afla pagina, un array cu toate componentele paginii si un array cu tipurile componentelor, iar in XMLExample am mai adaugat o metoda ce obtine un vector cu toate paginile unei sectiuni.. daca nu rezolvam poate foloseam codul tau dar asa nu are rost, mai ales ca ii mai greu sa intelegi un cod scris de altcineva decat cel scris de tine... mersi mult ;)
myth
 
Mesaje: 51
Membru din: Lun Mai 04, 2009 5:23 pm

Anterior

Înapoi la ActionScript 3.0

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator

cron