如何在 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 中添加和使用 c# 结构

如何在我的 Powershell 脚本中使用 Jenkins 变量

如何在带有 npm 的 PowerShell 中使用“@”

如何在 Powershell 中使用文件命名约定获取文件

如何在PowerShell中使用.NET Framework

如何在 PowerShell 中使用 Rest API 创建服务更改