2009-08-24 15 views
0

Ich verwende eine XMLparser-Klasse, um XML in ein Objekt zu konvertieren.XML-Analyse mit AS2

Das Problem ist, dass die XML, die ich habe, einen Punkt in der nodeName (estate_size.primary_room_area) enthält. Dies funktioniert natürlich nicht, da bereits die Punktnotation für den Objektpfad verwendet wird.

Einige Ideen, haben aber keine Ahnung, wie sie tun:
-Ersetzen der Punkt im Namen irgendwie
-Wechsel der Name.
- Besser?

Ich kann die nativen childNodes und Zeug nicht verwenden, da das XML nicht immer in der richtigen Reihenfolge ist. Ich habe keinen Zugriff auf das XML zu bearbeiten.

Wer hat eine Lösung?


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 
     } 
// 



} 

Antwort

2

Die XMLParser scheint nicht t Ich arbeite. Das Setzen einer Ablaufverfolgung (xml.data) in Ihrem onXMLLoad gibt null zurück.

Hmm ... ich sehe, dass Sie nur ein Beispiel geben? Erste ideea, verwenden Sie diese stattdessen

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

Zweite Idee, heikel und umständlich. Wenn Sie eine XML-Datei laden, können Sie sie mit einem LoadVars-Objekt laden. Auf dem LoadVars-Objekt haben Sie 2 Methoden: onLoad (die normalerweise verwendet wird) und onData, die Ihnen Zugriff auf die genaue Zeichenfolge, die vom Server kam, gibt. Durch das Umgehen des XML-Ladens durch ein loadVars-Objekt erhalten Sie Zugriff auf den XML-String, den Sie als String ändern können und den Punkt schließlich ersetzen können (schwieriger in AS2 ohne Regexp und angesichts der Tatsache, dass Sie Punkte in anderen finden könnten) Orte nicht nur in Knotennamen).

+0

Wirklich das funktionierte: xml.data.iad.DataTag.element [0] ['estate_size.primary_room_area'], können Sie mir erklären, was es tut und warum es funktioniert? –

+0

Da die Übersetzungsmethoden in XMLParser alle Knoten in der geladenen XML in ein Objekt konvertierten. Jedes Objekt in Actionscript kann wie ein assoziatives Array angesprochen werden. So kann auf jede Eigenschaft zugegriffen werden wie zum Beispiel _root ["movieclipName"]. Play() oder gar _root.movieclipName ["play"](); – Virusescu

0

Ich gehe für die kurze Antwort hier. Bitte nicht parsen XML use XPath stattdessen.

Mit XPath wird Ihr Code besser lesbar und viel wartbarer. Stellen Sie sich vor, in sechs Monaten müssen Sie diesen Code ändern, weil sich Ihre XML-Struktur aus irgendeinem Grund geändert hat. Sie werden sich das ansehen:

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

... und denken Sie an sich. O.M.G ...

UPDATE:

Ihren Kommentar zu beantworten, wäre dies ein Beispiel für das Abrufen eines Wertes aus dem XML sein von XPath verwenden.Der Code geht davon aus, dass das Beispiel XML Sie in Ihrer Frage gab in einer Datei mydata.xml genannt gespeichert ist:

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"); 

Um ein besseres Verständnis der XPath erhalten Sie einen Blick durch den Artikel habe ich in meiner ersten Antwort darauf hingewiesen.

+0

Kannst du mir ein Beispiel zeigen und den "estate_size.primary_room_area" mit Xpath bekommen? –

+0

Meine Antwort wurde mit einem Beispiel aktualisiert. – Luke