0

我在 VB.NET 中有一个很大的 XMLNode(我们说的是 10s/100s 的数千个节点和数百万个属性)。

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

我考虑过删除整个列表,并重新添加我需要的节点,但这需要更长的时间才能执行。

任何人都可以想出一种方法来更快地删除数千个节点吗?

提前致谢

4

2 回答 2

1

看起来像是编写 SAX 过滤器的经典案例。解析器生成 SAX 事件并将它们传递给您的应用程序,您的应用程序将事件的子集传递给序列化程序,序列化程序会生成新的 XML 文件。无需在内存中构建树。

作为一个 Java 人,我不知道如何在 VB 中执行此操作的详细信息,但该技术确实存在。

于 2013-08-15T21:42:24.543 回答
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

需要几毫秒。

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

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

于 2013-09-01T15:14:34.757 回答