【问题标题】:Parsing XML in JSFL?在 JSFL 中解析 XML?
【发布时间】:2010-12-02 17:13:32
【问题描述】:

在可用的JSFL(Adobe Flash-extension Javascript脚本文件)中似乎没有xml解析工具:http://osflash.org/pipermail/flashextensibility_osflash.org/2006-July/000014.html

那么,有没有一种简单且跨平台的方式来添加 javascript xml 解析器?

【问题讨论】:

    标签: javascript xml flash jsfl


    【解决方案1】:
    function parseXML (xml) {
        try { // normal browsers
            return (new DOMParser()).parseFromString(xml, "application/xml");
        }
        catch (e) { // IE
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = "false";
            xmlDoc.loadXML(xml);
            return xmlDoc;
        }
    }
    

    您可能想了解更多关于DOMParserMicrosoft.XMLDOM ActiveX 对象的信息。

    【讨论】:

    • 抱歉,在寻找其他解决方案之前,我想这样做:DOMParser 类在 JSFL 中不存在,我正在执行跨平台脚本,因此不允许使用 ActiveX。
    【解决方案2】:

    如果 JSFL 在某些时候使用 ActionScript,只要是 ActionScript 3.0 或更高版本,您就可以使用 XML(xml_string)XMLList(multiple_xml_nodes_string)。 ActionScript 3.0 支持 E4X,即 ECMAScript 中的原生 XML。

    【讨论】:

    • 我会在重新开始工作后尝试这个,但我认为它不会工作,因为 jsfl 文件是 Javascript 而不是 ActionScript 文件。有很多相似之处,但也有不同之处。无论如何我会尝试然后报告。
    • @Klaim 你可以使用 jsfl (robertpenner.com/flashblog/2007/08/…) 用 e4x 解析 xml
    【解决方案3】:

    嗯,您可以使用 Flash CS3 或更高版本作为 Javascript engine got upgraded to 1.6 直接从 JSFL 使用 XML 和 E4X

    这是一个快速的 sn-p 循环遍历当前选择中的元素并跟踪 xml:

    var doc = fl.getDocumentDOM();//get the current document ref.
    var selection = doc.selection;//get the selection
    var layout = <layout />;//create the root node for our xml
    var elementsNum = selection.length;//store this for counting*
    for(var i = 0 ; i < elementsNum ; i++){
       layout.appendChild(<element />);//add an element node
       layout.element[i].@name = selection[i].name;//setup attributes
       layout.element[i].@x = selection[i].x;
       layout.element[i].@y = selection[i].y;
    }
    fl.trace(layout);
    

    【讨论】:

    • 上述的精简版:var s = fl.getDocumentDOM().selection;var xml = &lt;selection /&gt;; for(var i = 0 ; i &lt; s.length; i++) xml.appendChild(&lt;element name={s[i].name} x={s[i].x} y={s[i].y} /&gt;); fl.trace(xml);
    【解决方案4】:

    对我有用的只是创建一个 SwfWindow。使用 JSFL 工作既好又快,因为您可以更改文件而无需重新启动 Flash,但通常 ActionScript 会为您提供更多功能。

    我目前的项目有几个技巧:

    1. 我将在 JSFL 中创建对象,然后将它们转换为 XML。我必须将它们从对象格式序列化为我传递给 SwfWindow(面板)的字符串。从面板中,我可以把String 转换成XML。然后你可以在 Actionscript 3.0 中做任何你想做的事情。

    2. 如果我只是进行 XML 操作,我将提示用户输入 JSFL 代码中的 XML 文件路径,但将 URL 直接交给面板,让面板直接加载 XML。

    3. 最后。为了保存 XML,我必须通过“xml.toXmlString()”将 XML 转换为字符串,但您还需要删除“\n”,以便将数据交给 JSFL。我将去掉 '|' 的 '\n'或任何你喜欢的。然后将字符串传递给JSFL,然后您可以反序列化字符串并更改'|'返回 '​​\n' 并保存文件。使用较旧的“保存输出面板”方法,或使用较新的文件写入方法。

    希望对您有所帮助。

    【讨论】:

    • 我以前也这样做,但我发现在 JSFL 中使用 XML/E4X 更容易,就像我在 as3.0 中使用的那样。 xml.toXmlString() 有助于在不使用 Object 的情况下来回处理事情
    • 我注意到 JSFL 往往非常慢,这就是我更喜欢使用 AS3 和 SwfWindow 的原因。但老实说,这些天我一直在用 Air 编写更多工具。
    【解决方案5】:

    我知道这是一个老问题,但我也在寻找解决这个问题的方法(使用 Flash CS3)。我需要从磁盘上的数据文件中解析 XML。结合suggestion of George Profenza,我可以使用eval()。关键是去掉第一行(xml声明):

    xmlData = eval( FLfile.read( xmlFile ).split( '\n' ).slice( 1 ).join( '\n' ) );
    

    ...你可以开始了!

    【讨论】:

    • 感谢您发布此答案 - 多年来一直没有运气!
    【解决方案6】:
    var xml = new XML(FLfile.read(file));
    

    然后您可以通过编写以下代码来访问所有节点和属性:

    xml.nodeName
    xml.nodeName.@attribute1
    xml.nodeName.@attribute2
    

    nodeName 是您的节点的名称。 attribute1 应该是您的属性的名称。

    我希望这会有所帮助。

    【讨论】:

    • 这个 XML 对象是否有文档记录?
    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2014-05-13
    • 2016-10-31
    • 2015-12-25
    • 2012-02-07
    • 2018-01-27
    • 2010-12-15
    相关资源
    最近更新 更多