【问题标题】:XML parsing with AS2使用 AS2 解析 XML
【发布时间】:2009-08-24 16:27:09
【问题描述】:

我正在使用 XMLparser 类将 XML 转换为对象。

问题是我拥有的 XML 在 nodeName (estate_size.primary_room_area) 中包含一个点。这当然行不通,因为它已经为对象路径使用点符号。

一些想法,但不知道如何去做:
- 以某种方式替换名称中的点
-更改名称。
-更好吗?

我不能使用原生的 childNode 和其他东西,因为 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;
}

XML解析器:

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



}

【问题讨论】:

    标签: xml parsing actionscript object actionscript-2


    【解决方案1】:

    XMLParser 似乎没有工作。 将 trace(xml.data) 放入 onXMLLoad 会返回 null。

    嗯...我看到你只是举了一个例子? 第一个想法,改用这个

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

    第二个想法,棘手且麻烦。 加载 XML 时,可以使用 LoadVars 对象加载它。 在 LoadVars 对象上,您有 2 个方法:onLoad(通常使用)和 onData,它使您可以访问来自服务器的确切字符串。 通过 loadVars 对象绕过 XML 加载将使您能够访问 XML 字符串,您将能够将其作为字符串操作并最终替换点(在没有正则表达式的 AS2 中更难,并且考虑到您可能会在其他地方找到点)不仅在节点名称中)。

    【讨论】:

    • 实际上这行得通:xml.data.iad.DataTag.element[0]['estate_size.primary_room_area'],你能​​向我解释一下它的作用和原因吗?
    • 因为 XMLParser 中的翻译方法将加载的 XML 中的所有节点转换为一个对象。 Actionscript 中的任何对象都可以像关联数组一样被寻址。所以任何属性都可以这样访问.. 例如 _root["movieclipName"].play() 甚至 _root.movi​​eclipName["play"]();
    【解决方案2】:

    我在这里寻求简短的回答。请不要解析 XML use XPath

    使用 XPath,您的代码将更具可读性和可维护性。想象一下,从现在起六个月后,您必须更改此代码,因为由于某种原因您的 XML 结构发生了变化。你会看到这个:

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

    ...自己想想。天哪……

    更新:

    为了回答您的意见,这将是一个使用 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,请阅读我在最初回答中指出的文章。

    【讨论】:

    • 你能告诉我一个使用 Xpath 获取“estate_size.primary_room_area”的例子吗?
    • 用一个例子更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2014-06-15
    • 2015-10-09
    • 2012-01-20
    相关资源
    最近更新 更多