我在VB.NET中有一个很大的XMLNode(我们说的是10个/ 100个成千上万的节点,以及数百万个属性)。
XML的一般结构是:
<other xml nodes></other xml nodes>
<list>
<item attr1="" attr2="" attr3="" attr4="" ... />
<item attr1="" attr2="" attr3="" attr4="" ... />
<item attr1="" attr2="" attr3="" attr4="" ... />
<item attr1="" attr2="" attr3="" attr4="" ... />
<item attr1="" attr2="" attr3="" attr4="" ... />
<item attr1="" attr2="" attr3="" attr4="" ... />
.
.
.
</list>
我想要做的是根据某些属性删除项目节点(比如我有50,000个节点,我的标准可能会删除49500个节点)。
我遇到的问题是,我的代码需要几秒钟才能删除如此大量的节点,我需要它更快。
我尝试了几种不同的方法,我得到的最快的是:
dim xnlList = xnBigXMLNode.selectNodes("//list/item[@attr1=sample]")
for each xnNode in xnlList
xnNode.ParentNode.RemoveChild(xnNode)
next
*请原谅上面代码中的任何错误,我现在不在我的开发机器上
作为一个附加约束,我需要在xmlNode中保留“其他xml节点”。
我考虑过删除整个列表,然后添加我需要的节点,但执行的时间更长。
有人能想到一种方法可以更快地删除数千个节点吗?
提前致谢
答案 0 :(得分:1)
看起来像编写SAX过滤器的经典案例。解析器生成SAX事件并将它们传递给您的应用程序,您的应用程序将事件的子集传递给序列化程序,该序列化程序生成新的XML文件。无需在内存中构建树。
我不知道在VB中如何做到这一点的细节,作为一个Java人,但技术肯定存在。
答案 1 :(得分:0)
我已经找到了一个需要几毫秒才能运行的解决方案(而不是之前的几秒钟)。
事实证明:
dim xnlList = xnBigXMLNode.selectNodes("//list/item[@attr1=sample]")
for each xnNode in xnlList
xnNode.ParentNode.RemoveChild(xnNode)
next
需要几秒钟才能运行,而:
dim xnlList = xnBigXMLNode.selectNodes("//list/item")
for each xnNode in xnlList
xnNode.ParentNode.RemoveChild(xnNode)
next
需要几毫秒。
因此,在我的循环中,我编写了代码来测试每个节点的所需属性,并进行了适当的删除。
感谢其他答案中的所有有用建议。