如何在 PowerShell 中使用 XmlReader 流式传输大/巨大的 XML 文件?
Posted
技术标签:
【中文标题】如何在 PowerShell 中使用 XmlReader 流式传输大/巨大的 XML 文件?【英文标题】:How can i use XmlReader in PowerShell to stream big/huge XML files? 【发布时间】:2022-01-20 15:52:23 【问题描述】:我有几个千兆字节的 XML。 XML 中没有空格。
所以我写了一点 C# 代码来拆分成单个文件(其中有一些额外的代码来执行一些事情,例如在测试时随机化)
using (XmlReader MyReader = XmlReader.Create(@"d:\xml\test.xml"))
while (MyReader.Read())
switch (MyReader.NodeType)
case XmlNodeType.Element:
if (MyReader.Name == "Customer")
XElement el = XElement.ReadFrom(MyReader) as XElement;
if (el != null)
custNumber = (string)el.Element("CustNumber");
output = @"d:\xml\output\" + custNumber;
File.WriteAllText(output, el.ToString());
break;
然后我使用 PowerShell 解析生成的文件,主要是因为我发现在服务器上使用起来更容易,而规范可以更改并且我可以动态更改脚本。
那么...将上述内容转换为 PowerShell 的最简单方法是什么,将 [.Net here] 放在所有内容之前?如果一行有"<cust"
,下一行有"omer>"
,我是否必须逐字节读取?
【问题讨论】:
【参考方案1】:这应该非常接近您想要在 Powershell 中执行的操作:
$f = [System.Xml.XmlReader]::create("d:\xml\test.xml")
while ($f.read())
switch ($f.NodeType)
([System.Xml.XmlNodeType]::Element) # Make sure to put this between brackets
if ($f.Name -eq "Customer")
$e = [System.Xml.Linq.XElement]::ReadFrom($f)
if ($e -ne $null)
$custNumber = [string] $e.Element("CustNumber")
$e.ToString() | Out-File -Append -FilePath ("d:\xml\output\"+$e.ToString())
break
【讨论】:
不得不将开关移动到 if ($f.NodeType -eq [Syste,,,) 有趣的是,在 PowerShell 中必须使用与 C# 相反的元素的 .Value。 @edelwater:在 switch 选项周围添加括号修复了它。以上是关于如何在 PowerShell 中使用 XmlReader 流式传输大/巨大的 XML 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Powershell 脚本中使用 Jenkins 变量