【问题标题】:How can i use XmlReader in PowerShell to stream big/huge XML files?如何在 PowerShell 中使用 XmlReader 流式传输大/巨大的 XML 文件?
【发布时间】:2015-01-05 09:16:57
【问题描述】:

我有几个千兆字节的 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>",我是否必须逐字节读取?

【问题讨论】:

    标签: xml powershell


    【解决方案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 中必须使用元素的 .Value 与 C# 相反。
    • @edelwater:在 switch 选项周围添加括号修复了它。
    猜你喜欢
    • 2017-11-12
    • 2021-09-23
    • 1970-01-01
    • 2021-11-15
    • 2021-07-06
    • 2020-08-19
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多