【问题标题】:How can I dynamically edit XML node values in ActionScript?如何在 ActionScript 中动态编辑 XML 节点值?
【发布时间】:2023-04-02 09:26:01
【问题描述】:
/* I start with this: */

<Report>
    <prop1>4</prop1> 
    <prop2>2255</prop2> 
    <prop3>true</prop3> 
    <prop4>false</prop4> 
    <prop5>true</prop5> 
</Report>

/* I want this result (change the value of node "prop5"): */

<Report>
    <prop1>4</prop1> 
    <prop2>2255</prop2> 
    <prop3>true</prop3> 
    <prop4>false</prop4> 
    <prop5>false</prop5> 
</Report>

/* I tried this: */

var reportXML:XML = 
    <Report>
        <prop1>4</prop1> 
        <prop2>2255</prop2> 
        <prop3>true</prop3> 
        <prop4>false</prop4> 
        <prop5>true</prop5> 
    </Report>;

var myArray:Array = [{xmlNodeName: "prop5", value: false}];

for each (var item:Object in myArray)
{
    report.xml[item.xmlNodeName] = item.value.toString();
}

/* But this just adds a new node, resulting in this: */

<Report>
    <prop1>4</prop1> 
    <prop2>2255</prop2> 
    <prop3>true</prop3> 
    <prop4>false</prop4> 
    <prop5>true</prop5> 
    <prop5>false</prop5> 
</Report>;

【问题讨论】:

    标签: xml apache-flex actionscript


    【解决方案1】:

    在创建对象后,我无法在 XML 对象中编辑元素,Adobe 文档也不清楚这是否可行。

    为了动态设置值,我创建了一个临时字符串并将我的所有 XML 节点和属性附加到这里。 然后您可以简单地创建 xml 对象,指定您的临时字符串作为唯一参数。

    类似:

    var tempString:String = "<XML_PARENT><SOME_SUB_NODE>";
    tempString += "<SOMETHING_ELSE value=\"" + someTextField.text + "\"/>";
    tempString += "</SOME_SUB_NODE></XML_PARENT>";
    
    var xmlObj:XML = new XML( tempString );
    

    现在如果你跟踪 xmlObj,你会得到

    <XML_PARENT>
        <SOME_SUB_NODE>
            <SOMETHING_ELSE value=""/>
        </SOME_SUB_NODE>
    <XML_PARENT>
    

    这将使您可以动态地将所需的任何内容分配给字符串,然后在事后构建 XML。如果您想编辑现有的 XML 对象,这并不完全有帮助,但您可以使用 toString() 并相应地修改字符串。 它至少可能有助于开始动态构建 XML 文件!

    【讨论】:

      【解决方案2】:

      如果你只有节点你可以这样走

      var node:XML
      inp = new textfield(style, node.text());
      inp.addEventListener(TextEvent.TEXT_INPUT, change, false, 0, true);
      addChild(inp);
      
      private function change(e:TextEvent):void
       {
       XML(node.parent())[node.name()][node.childIndex()] = inp.text+e.text;
       }
      

      【讨论】:

        【解决方案3】:

        这似乎正是您想要的。只是你的代码修正了一些错别字。

                var reportXML:XML = 
                    <Report>
                        <prop1>4</prop1> 
                        <prop2>2255</prop2> 
                        <prop3>true</prop3> 
                        <prop4>false</prop4> 
                        <prop5>true</prop5> 
                    </Report>;
        
                var myArray:Array = [{xmlNodeName: "prop5", value: false}];
        
                for each (var item:Object in myArray)
                {
                    reportXML[item.xmlNodeName] = item.value.toString();
                }
        
                trace(reportXML);
        

        【讨论】:

        • 我会给你这个功劳......我现在已经开始工作了。无论是伪代码还是真实代码。谢谢。
        【解决方案4】:

        我刚刚验证了它的工作原理:

        private var reportXML:XML = 
            <Report>
                <prop1>4</prop1>
                <prop2>2255</prop2>
                <prop3>true</prop3>
                <prop4>false</prop4>
                <prop5>true</prop5>
            </Report>;
        
        private function changeXML():void {
            reportXML.prop5[0] = 'false';
            trace(reportXML.prop5);  // traces 'false'
        }
        

        【讨论】:

        • 这仍然没有回答我原来的问题。看看我原来的例子——我希望这是动态的。我有一个指定要更新的节点的对象数组。我发布此内容的全部目的是找到一种不必将“prop5”硬编码到我的应用程序中的方法。
        【解决方案5】:

        在 ActionScript 3 中使用 E4X 语法,我猜应该是这样的:

        report.prop5[0] = false;
        

        【讨论】:

        • 这也不起作用。这创建了一个具有不同命名空间的新节点(命名空间基于我所在的类的名称)。
        猜你喜欢
        • 2012-02-25
        • 2020-12-02
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-04
        相关资源
        最近更新 更多