2008-11-17 72 views
3
/* 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>; 

回答

4

这似乎是在做你想要什么。这只是你的代码,修正了一些错别字。

 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); 
+0

我会给你这个荣誉....我现在正在工作。无论是伪代码还是真实代码。谢谢。 – 2008-12-03 21:30:16

-2

使用ActionScript 3 E4X语法我想这将是这样的:

report.prop5[0] = false; 
+0

这也没有工作。这创建了一个具有不同名称空间的新节点(名称空间基于我所在类的名称)。 – 2008-11-17 16:48:38

1

我只是验证了这个工程:

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' 
} 
+0

这仍然不能回答我的原始问题。看看我的原始示例 - 我希望这是动态的。我有一个对象数组,指定要更新的节点。发布这篇文章的目的是为了找到一种不必将“prop5”硬编码到我的应用程序中的方法。 – 2008-11-18 16:48:51

1

如果你只有你可以去这样

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; 
} 
2

的对象被创建后,我已经无法为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文件!