.net - 从一个巨大的 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 不是适合这里工作的工具吗?
解决方案
试试 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>
推荐阅读
- visual-composer - 您可以为未选中的框创建 WPBakery 页面构建器 VC_MAP 依赖项吗?
- sql - 将蛇案例转换为骆驼案例 - Postgres
- python - MultiValueDictKeyError 在 localhost 和 Heroku 主机中有所不同
- javascript - Vue 方法不接受异步/等待
- html - 如何继承某个位置(CSS)
- java - 如何配置.gitignore文件不推送某个json文件到git
- windows - 从 Windows 10(和任何其他 Appxpackage)中删除 Webp 图像扩展
- c# - 如何使用 LINQ 有条件地创建新的字符串数组?
- angular - 无法从角度拦截器获取请求标头
- javascript - 将javascript中的对象打印到html dom中