2009-08-24 73 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