2009-08-24 7 views
0

J'utilise une classe XMLparser pour convertir du XML en objet.Analyse XML avec AS2

Le problème est que le XML que j'ai contient un point dans le nodeName (estate_size.primary_room_area). Bien sûr, cela ne fonctionne pas, car il utilise déjà la notation par points pour le chemin de l'objet.

Quelques idées, mais ont aucune idée comment les faire:
-Remplacer le point au nom d'une certaine manière
-Change le nom.
-Un mieux?

Je ne peux pas utiliser les childNodes natifs et autres, car le XML n'est pas toujours dans le bon ordre. Je n'ai pas accès à l'édition du XML.

Quelqu'un at-il une solution à ce problème?


XML:

<iad> 
    <DataTag> 
    <element id="0"> 
     <changed_string>2009-08-20T10:56:00Z</changed_string> 
     <estate_price.price_suggestion>2500000</estate_price.price_suggestion> 
     <estate_size.primary_room_area>117</estate_size.primary_room_area> 
    </element> 
    </DataTag> 
</iad> 

AS2:

var xml:XMLParser = new XMLParser(); 
xml.loadXML("file.xml"); 
xml.onXMLLoad = function() { 
     _root.estate_size.text = xml.data.iad.DataTag.element[0].estate_size.primary_room_area; 
} 

XmlParser:

//import net.za.mediumrare.xmlPackage.XMLParser; 
//var myObject:XMLParser = new XMLParser(); 
//myObject.loadXML ("content.xml"); 
//myObject.onXMLLoad = function() { 
// listAll (myObject.data); 
//}; 



// IMPORTED DEPENDENCIES 
// 
import mx.utils.Delegate; 
import mx.events.EventDispatcher; 
// 
class XMLParser { 
     // 
     // PRIVATE PROPERTIES 
     // 
     private var xml:XML; 
     public var data:Object; 
     // 
     // 
     // 
     public function get _xml():XML { 
       return xml; 
     } 
     public function set _xml(x:XML) { 
       xml = x; 
     } 
     public function get _data():Object { 
       return data; 
     } 
     public function set _data(o:Object):Void { 
       trace("ERROR - \"XMLParser\" _data property is read-only and connot be set."); 
     } 
     // 
     // CONSTRUCTOR 
     // 
     public function XMLParser(s:String) { 
       initXML(s); 
       //data = new Object(); 
       EventDispatcher.initialize(this); 
     } 
     // 
     // PRIVATE METHODS 
     // 
     public function buildObject (n){ 
      var o = new String (n.firstChild.nodeValue), s, i, t; 
     for (s = (o == "null") ? n.firstChild : n.childNodes[1]; s != null; s = s.nextSibling) { 
      t = s.childNodes.length > 0 ? arguments.callee (s) : new String (s.nodeValue); 
      for (i in s.attributes) { 
       t[i] = s.attributes[i]; 
      } 
      if (o[s.nodeName] != undefined) { 
       if (!(o[s.nodeName] instanceof Array)) { 
        o[s.nodeName] = [o[s.nodeName]]; 
       } 
       o[s.nodeName].push (t); 
      } 
      else { 
       o[s.nodeName] = t; 
      } 
     } 
     data=o; 
     xml = new XML(); 
     return data; 
    }; 

     private function initXML(s:String):Void { 
       if (s == undefined) { 
         xml = new XML(); 
       xml.ignoreWhite = true; 
       } else { 
         xml = new XML(s); 
       xml.ignoreWhite = true; 
       } 
       xml.onLoad = Delegate.create(this, xmlOnLoad); 
     } 
     private function xmlOnLoad(success:Boolean):Void { 
       if (success) { 
         trace("SUCCESS - xml loaded successfully."); 
         //xml.ignoreWhite = true; 
         this.dispatchEvent({type:"onXMLLoad", target:this}); 
       buildObject(xml); 
         this.onXMLLoad(); 
       } else { 
         trace("ERROR - xml could not load"); 
         return; 
       } 
     } 
     // 
     // PUBLIC METHODS 
     // 
     public function loadXML(url:String):Void { 
       xml.load(url); 
     } 
     public function getBytesTotal():Number { 
       return xml.getBytesTotal(); 
     } 
     public function getBytesLoaded():Number { 
       return xml.getBytesLoaded(); 
     } 
     public function getPercentLoaded():Number { 
       return Math.floor((this.getBytesLoaded()/this.getBytesTotal()) * 100); 
     } 

     // 
     // EVENTS 
     // 
     public function onXMLLoad():Void { 
       // onLoad proxy for internal xml object 
     } 
     public function onXMLParse():Void { 
       // called when xml is finished parsing 
     } 
     function addEventListener() { 
       // Used by EventDispather mixin 
     } 
     function removeEventListener() { 
       // Used by EventDispather mixin 
     } 
     function dispatchEvent() { 
       // Used by EventDispather mixin 
     } 
     function dispatchQueue() { 
       // Used by EventDispather mixin 
     } 
// 



} 

Répondre

2

Le XMLParser ne semble pas t o travaille. La mise en place d'une trace (xml.data) dans votre onXMLLoad renvoie null.

Hmm ... Je vois que vous venez de mettre un exemple? Tout d'abord ideea, utilisez plutôt

xml.data.iad.DataTag.element[0]['estate_size.primary_room_area'] 

idée Deuxièmement, délicate et lourde. Lorsque vous chargez un fichier XML, vous pouvez le charger à l'aide d'un objet LoadVars. Sur l'objet LoadVars, vous avez la méthode 2: onLoad (qui est normalement utilisée) et onData qui vous donne accès à la chaîne exacte qui provient du serveur. Contourner le chargement XML via un objet loadVars vous donnera accès à la chaîne XML que vous pourrez manipuler en tant que chaîne et éventuellement remplacer le point (plus difficile dans AS2 sans regexp et étant donné que vous pourriez trouver des points dans d'autres endroits non seulement dans les noms de noeuds).

+0

En fait cela a fonctionné: xml.data.iad.DataTag.element [0] ['estate_size.primary_room_area'], pouvez-vous m'expliquer ce qu'il fait et pourquoi cela fonctionne? –

+0

Parce que les méthodes de traduction dans XMLParser convertissaient tous les nœuds du XML chargé dans un objet. Tout objet dans Actionscript peut être adressé comme un tableau associatif. Donc n'importe quelle propriété peut être accédée comme ça .. par exemple _root ["movieclipName"]. Play() ou même _root.movieclipName ["play"](); – Virusescu

0

Je vais répondre brièvement ici. S'il vous plaît ne pas analyser XML use XPath à la place. Avec XPath, votre code sera plus lisible et plus facile à maintenir. Imaginez, dans six mois, vous devez modifier ce code car, pour une raison quelconque, votre structure XML a changé. Vous regarderez ceci:

xml.data.iad.DataTag.element[0]['estate_size.primary_room_area'] 

... et pensez-y. O.M.G ...

MISE À JOUR:

Pour répondre à votre commentaire, ce serait un exemple de récupération d'une valeur à partir du XML en utilisant XPath.Le code suppose que le XML exemple que vous avez donné à votre question est stockée dans un fichier appelé mydata.xml:

import mx.xpath.XPathAPI; 

var xmldata : XML; 
xmldata = new XML(); 
xmldata.ignoreWhite = true; 
xmldata.onLoad = function(success : Boolean) : Void 
{ 
    var query = "iad/DataTag/element/estate_size.primary_room_area/*"; 

    var area = XPathAPI.selectSingleNode(this.firstChild, query); 

    trace(area); 
}; 
xmldata.load("mydata.xml"); 

Pour une meilleure compréhension de XPath jeter un oeil à travers l'article je l'ai souligné dans ma réponse initiale.

+0

Pouvez-vous me montrer un exemple obtenir le "estate_size.primary_room_area" avec Xpath? –

+0

Mis à jour ma réponse avec un exemple. – Luke