2009-08-24 12 views
0

XMLをオブジェクトに変換するためにXMLparserクラスを使用しています。AS2を使用したXML解析

問題は、XMLにはnodeName(estate_size.primary_room_area)にドットが含まれていることです。これはすでにオブジェクトパスにドット表記を使用しているので、これはもちろん動作しません。名前何とか
-change名にドット-replace

いくつかのアイデアが、それらを行う方法は考えています。
- それでもいいですか?

XMLが常に正しい順序ではないため、ネイティブのchildNodesやstuffは使用できません。 私はXMLを編集するためのアクセス権がありません。

誰にでも解決策がありますか?


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



} 

答えて

2

のXMLParserはいないようだトンo働いている。 onXMLLoadにトレース(xml.data)を入れるとnullが返されます。

ええと...私はあなたがほんの一例を挙げているのを見ますか? まずideea、

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

代わりにトリッキーと面倒な第二のアイデアを、これを使用します。 XMLを読み込むときに、LoadVarsオブジェクトを使用して読み込むことができます。 LoadVarsオブジェクトには2つのメソッドがあります:onLoad(通常は使用されます)とonData(サーバーからの正確な文字列へのアクセスを提供します)。 loadVarsオブジェクトを介してXML読み込みをバイパスすると、文字列として扱い、最終的にドットを置き換えることができるXML文字列にアクセスできます(正規表現なしでAS2では難しくなります。ノード名だけでなく)。

+0

実際にはこれはうまくいきました:xml.data.iad.DataTag.element [0] ['estate_size.primary_room_area']、あなたはそれが何をしているのか、それがなぜ機能するのか説明できますか? –

+0

XMLParserの変換メソッドは、ロードされたXMLのすべてのノードをObjectに変換していたためです。 Actionscript内の任意のオブジェクトは、連想配列のように扱うことができます。例えば、_root ["movieclipName"]。play()や_root.movi​​eclipName ["play"]();のように、どんなプロパティにもアクセスできます。 – Virusescu

0

私はここで短い答えを出しています。 の代わりに XML use XPathを解析しないでください。

XPathを使用すると、コードが読みやすくなり、保守性が向上します。 XMLの構造が何らかの理由で変更されたので、今から6ヵ月後にこのコードを変更する必要があるとします。あなたはこれを見ています:

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

...自分自身に考えてください。 O.M.G ...

UPDATE:

あなたのコメントに答えるために、これは、XPathを使用してXMLから値を取得する例だろう。コードは、あなたの質問に与えた例のXMLが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"); 

のXPathのより良い理解を得るために、私は私の最初の答えで指摘記事を見てみましょう。

+0

Xpathで "estate_size.primary_room_area"を取得する例を教えてもらえますか? –

+0

私の答えを例で更新しました。 – Luke

関連する問題