删除/替换E4X中的节点(AS3-Flex)

时间:2020-03-05 18:39:36  来源:igfitidea点击:

我正在Flex应用程序中构建列表/网格控件,并在.NET Web应用程序中使用它。简而言之,我从序列化对象的Web服务获取XML。我对一个页面可以包含多少个内容有一个页面限制。我已经建立了一个数据网格并使其成为页面,可以在页面之间进行排序,并处理一些基本的过滤。

关于分页,我使用在页面上键入关键字的Dictionary并存储该页面的XML。这样,每当用户返回到我已保存到该词典中的页面时,我都可以从本地内存中获取XML,而不必访问Web服务。基本上,我会将每次调用Web服务检索到的数据缓存为一个数据页面。

有几件事会使我的缓存过期。过滤和排序是主要原因。但是,用户可以通过打开编辑器来编辑网格中的一行数据。他们编辑的数据可能会导致该行中显示的数据过时。我可以轻松地转到Web服务并获取整个数据页面,但是由于页面大小是在运行时设置的,因此我可能正在查看要检索的大量记录。

因此,现在让我深入探讨我所遇到的问题。为了防止取回整个数据页面,我打电话给Web服务,要求提供完全更新的记录(编辑器将保存其数据)。

由于我使用的是自定义对象,因此需要在服务器上将它们序列化为XML(我们的软件的其他部分已经对此进行了处理)。所有数据都通过e4x中的XML处理。字典中的缓存存储为XMLList。

现在,让我向我们展示我的代码...

var idOfReplacee:String = this._WebService.GetSingleModelXml.lastResult.*[0].*[0].@Id;
var xmlToReplace:XMLList = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee);

if(xmlToReplace.length() > 0)
{
    delete (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]);
    this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];
}

基本上,我得到要替换的节点的ID。然后在缓存的Data属性(" XMLList")中找到它。我确保它存在,因为第二行的过滤器返回XMLList。

我的问题是删除行。我无法使该行从列表中删除该节点。删除行之后的行有效。我已将该节点添加到列表中。

如何替换或者删除该节点(意味着从缓存的.Data属性中从filter语句中找到的节点)???

希望我的所有变量的下划线在发布时都不会逃脱!否则为'this。&#95 == this'._

解决方案

回答

我没有立即看到问题,所以只能冒险猜测。我们所拥有的" delete"行正在列表的顶层寻找具有属性" Id"且其值等于idOfReplacee的第一项。确保我们不需要更深入地研究XML结构来查找匹配的ID。

尝试以下方法:

delete (this._DataPages[this._Options.PageIndex].Data..(@Id == idOfReplacee)[0]);

(注意在"数据"之后的多余的"。")。通过在发布的代码的第二行设置一个断点,并确保XMLList看起来像我们期望的那样,我们可以更轻松地调试它。

回答

也许我们可以使用replace代替?

var oldNode : XML = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0];
var newNode : XML = this._WebService.GetSingleModelXml.lastResult.*[0].*[0];    

oldNode.parent.replace(oldNode, newNode);

回答

谢谢你们的答案。

@Theo:
我尝试了几种不同的替换方法。由于某种原因,它永远不会出错,但是永远不会更新列表。

@马特:
我想出了一个解决方案。问题不是来自建议,而是来自删除如何与列表一起使用(至少在这种情况下,我是如何做到的)。

_DataPages字典对象的Data属性是定义节点的列表(由另一个XML文档的先前过滤到达)。

<Models>
     <Definition Id='1' />
     <Definition Id='2' />
</Models>

我最终做了这笔小事:

//gets the index of the node to replace from the same filter
var childIndex:int = (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]).childIndex();
//deletes the node from the list
delete this._DataPages[this._Options.PageIndex].Data[childIndex];
//appends the new node from the webservice to the list
this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];

因此,基本上,我必须获取XMLList中该节点的索引,即Data属性。从那里,我可以使用delete关键字将其从列表中删除。 + =将我的新节点添加到列表中。

我习惯于使用ActiveX或者Mozilla XmlDocument东西,在这里我们将其称为" SelectSingleNode",然后使用" replaceChild"来进行这种事情。哦,好吧,至少在某些论坛上其他人可以找到它。我回答自己的问题时不知道该怎么办。也许这种见识可以帮助其他人出现并更好地回答问题!