如何使用as3删除xml标记

时间:2011-03-24 06:21:47

标签: xml regex actionscript-3

我已使用as3导出数据.xls文件。

var xml:ArrayCollection;
xml=Labneuron8.lastResult.Response.Terminal as ArrayCollection;
var str:String=xml[0].Value;
var xml1:XML=new XML(str);
myData=new XMLListCollection(xml1.children());
var bytes:ByteArray = new ByteArray();
bytes.writeObject(myData.children().toString());
var f:FileReference = new FileReference();
f.save(bytes,"output.xls");

运行.xls文件时使用值

创建
<Val>0.307280</Val>
<Val>0.307280</Val>
<Val>0.307280</Val>
<Val>0.307280</Val>
<Val>0.307280</Val>
<Val>0.307280</Val> .......

现在我必须删除这个Val标签,这不是必需的。

请告诉我删除此标记的脚本。

由于 ............. UPDATE ................

现在我将代码修改为

var xml:ArrayCollection;
xml=Labneuron8.lastResult.Response.Terminal as ArrayCollection;
var str:String=xml[0].Value;
var xml1:XML=new XML(str);
var vals:XMLList = xml1.Val;
for each(var val:XML in vals)
    {
        delete (val.parent().children()[val.childIndex()]);
        Alert.show("hi");
    }
myData=new XMLListCollection(xml1.children());
var bytes:ByteArray = new ByteArray();
bytes.writeObject(myData.children().toString());
var f:FileReference = new FileReference();
f.save(bytes,"output.xls");

但是每个循环都没有工作。所以我使用val标签得到了与之前相同的输出。如何解决这个问题? 要删除xml节点,首先需要找到它们:

var sourceXML:XML = ...
var vals:XMLList = sourceXML.Val; //enter actual path to Val nodes here

然后使用父级删除每一个:

for each(var val:XML in vals)
{
    delete (val.parent().children()[val.childIndex()]);
}

如果所有节点都有相同的父节点,则可以在局部变量中缓存val.parent()。children(),因此它会更快。

.................. UPDATE ...................

@Patrick

var xml:ArrayCollection;

xml=Labneuron8.lastResult.Response.Terminal as ArrayCollection;

var str:String=xml[0].Value;

var xml1:XML=new XML(str);

xml1..Val.(parent().replace(valueOf().childIndex(),valueOf().text()))

myData=new XMLListCollection(xml1.children());

var bytes:ByteArray = new ByteArray();

bytes.writeObject(myData.children().toString());

var f:FileReference = new FileReference();

f.save(bytes,"output.xls");

...............解决方案....................

var xml6:ArrayCollection;

xml6=Labneuron8.lastResult.Response.Terminal as ArrayCollection;

var str:String=xml6[0].Value;   

var xml1:XML=new XML(str);

xml1..Val.(parent().replace(valueOf().childIndex(),valueOf().text()+"\n"))

myData3=new XMLListCollection(xml1.children());

var bytes:ByteArray = new ByteArray();

bytes.writeObject(myData3.children().toString());

var fo:FileReference = new FileReference();

fo.save(bytes,"output.xls");

3 个答案:

答案 0 :(得分:4)

要删除xml节点,首先需要找到它们:

var sourceXML:XML = ...
var vals:XMLList = sourceXML.Val; //enter actual path to Val nodes here

然后使用父级删除每一个:

for each(var val:XML in vals)
{
    delete (val.parent().children()[val.childIndex()]);
}

如果所有节点都有相同的父节点,则可以在局部变量中缓存val.parent()。children(),因此它会更快。

答案 1 :(得分:3)

好吧我想我已经理解了你想要的东西,你不想删除Val节点,只能用它的内容替换它。

如果您的父节点只有一个子节点,那么您可以使用replace函数执行此操作:

在一行中:

xml1..Val.(parent().replace(valueOf().childIndex(), valueOf().text()))

或循环:

for each (var val:XML in xml1..Val) {
 val.parent().replace(val.childIndex(), val.toString())
}

添加了一个实例,以显示删除的工作原理: http://wonderfl.net/c/fHph

您也可以在一行中执行此操作:

//...

var xml1:XML=new XML(str);
xml1.Val.(delete parent().children()[valueOf().childIndex()]) 

//...

如果您想删除所有Val 节点,只要它们使用..符号

//...

var xml1:XML=new XML(str);
xml1..Val.(delete parent().children()[valueOf().childIndex()]) 

//...

答案 2 :(得分:1)

要获取xml-nodes的内部值,您可以(有时)使用:nodeValue。

示例:

rootNode.childNodes[a].nodeValue

这将“删除”/不返回xml-tag。我在AS2项目中使用过它,我不确定在AS3中是否仍然接受nodeValue。