删除/替换E4X中的节点(AS3-Flex)
我正在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"来进行这种事情。哦,好吧,至少在某些论坛上其他人可以找到它。我回答自己的问题时不知道该怎么办。也许这种见识可以帮助其他人出现并更好地回答问题!