Как я могу динамически редактировать значения XML-узла в ActionScript? - PullRequest
3 голосов
/ 17 ноября 2008
/* 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>;

Ответы [ 5 ]

4 голосов
/ 02 декабря 2008

Кажется, это делает именно то, что вы хотите. Это просто ваш код с исправленными опечатками.

        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);
2 голосов
/ 12 января 2011

Мне не удалось отредактировать элементы в объекте XML после того, как объект был создан, и документация Adobe не ясна, если это вообще возможно.

Для динамической установки значений я создал временную строку и добавил сюда все свои XML-узлы и атрибуты. Затем вы можете просто создать объект xml, указав временную строку в качестве параметра lone.

Что-то вроде:

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-файлы!

1 голос
/ 15 октября 2010

если у вас есть только узел, вы можете пойти вот так

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;
 }
1 голос
/ 17 ноября 2008

Я только что проверил, что это работает:

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 голосов
/ 17 ноября 2008

Использование синтаксиса E4X в ActionScript 3 Я думаю, это было бы что-то вроде:

report.prop5[0] = false;
...