首页 > 解决方案 > 从一个巨大的 3GB XML 文件中删除大约 60,000 个 XML 节点 - Powershell

问题描述

我目前正在尝试从一个巨大的 XML 文件中删除大量数据。我目前正在使用 Powershell 来尝试这样做,我想知道它是否可以在可接受的时间内完成。该文件包含 2.5m 条记录,我想删除属性 = 'COMPANY' 的所有记录。这是我当前的代码:

$xml = [xml]'' 
$xml.Load("C:\New folder\untrimmed.xml")


$node = $xml.SelectSingleNode("//record[@category='COMPANY']")
while ($node -ne $null) {
    $node.ParentNode.RemoveChild($node)
    $node = $xml.SelectSingleNode("//record[@category='COMPANY']")

$xml.save("C:\New folder\trimmed.xml")

一个半小时后完成此操作后,修剪后的文件比原始文件大。我怎样才能以更好的方式做到这一点?powershell 不是适合这里工作的工具吗?

标签: .netxmlwindowspowershell

解决方案


试试 Saxon 10.0 中的新 Gizmo 工具。

java net.sf.saxon.Gizmo -s:"C:\New folder\untrimmed.xml"
/>delete //record[@category='COMPANY']
/>save C:\New folder\untrimmed.xml
/>quit

警告:我没有尝试使用包含空格的文件名。

不幸的是,Gizmo 目前不使用流媒体(我们有一个原型,但它没有发布),所以你需要相当多的内存才能运行它。

如果流式传输是必不可少的,您可以使用流式 XSLT 3.0 样式表来实现:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
               version="3.0">
  <xsl:mode streamable="yes" on-no-match="shallow-copy"/>
  <xsl:template match="record[@category='COMPANY']"/>
</xsl:transform>

推荐阅读