2009-08-24 105 views
0

我正在使用XMLparser類將XML轉換爲對象。使用AS2進行XML解析

問題是,我在nodeName(estate_size.primary_room_area)中包含一個點。這當然不起作用,因爲它已經使用了對象路徑的點符號。

一些想法,但不知道怎麼做他們:
- 更換名稱中的莫名其妙
- 更換名稱的點。
- 好嗎?

我不能使用本機childNodes和東西,因爲XML並不總是按照正確的順序。 我無權編輯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的似乎不是T o正在工作。 將跟蹤(xml.data)放入onXMLLoad中將返回null。

嗯...我看到你只是舉個例子嗎? 首先IDEEA,用這個來代替

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

設想二,棘手和繁瑣。 加載XML時,可以使用LoadVars對象加載它。 在LoadVars對象上有2個方法:onLoad(通常使用)和onData,它使您可以訪問來自服務器的確切字符串。 通過loadVars對象繞過XML加載將使您可以訪問XML字符串,您將能夠將其作爲字符串進行操作並最終替換點(在AS2中較難,無需regexp,並且考慮到您可能會在其他位置找到點不僅放置在節點名稱中)。

+0

其實這個工作:xml.data.iad.DataTag.element [0] ['estate_size.primary_room_area'],你可以向我解釋它做了什麼,爲什麼它的作品? – 2009-08-24 19:22:38

+0

由於XMLParser中的轉換方法將加載的XML中的所有節點轉換爲Object。 Actionscript中的任何對象都可以像關聯數組一樣尋址。所以任何屬性都可以像這樣訪問..例如_root [「movieclipName」]。play()或者甚至_root.movi​​eclipName [「play」](); – Virusescu 2009-08-24 19:45:54

0

我在這裏簡要回答。請不要解析 XML use XPath

使用XPath代碼將更具可讀性並且更易於維護。想象一下,從現在起六個月你必須對這段代碼進行修改,因爲你的XML結構出於某種原因改變了。你會看到這個:

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」嗎? – 2009-08-25 10:08:39

+0

用一個例子更新了我的答案。 – Luke 2009-08-25 23:21:17