快速处理大型XML文件

时间:2013-08-15 21:18:09

标签: xml vb.net xmlnode

我在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节点”。

我考虑过删除整个列表,然后添加我需要的节点,但执行的时间更长。

有人能想到一种方法可以更快地删除数千个节点吗?

提前致谢

2 个答案:

答案 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

需要几毫秒。

因此,在我的循环中,我编写了代码来测试每个节点的所需属性,并进行了适当的删除。

感谢其他答案中的所有有用建议。