Powershell中非常大的XML文件

时间:2018-01-04 19:34:35

标签: xml powershell

对于非常大的文本文件,我们可以选择使用StreamReader和StreamWriter,然后允许逐行进行查找/替换。但是,我有一个XML文件,我需要用更多的控件来查找/替换,例如查找/替换特定节点中的值,该节点是具有特定属性和值的另一个节点的子节点。因此,尝试逐行解析相当复杂,并且在使用XML文档时非常容易处理。但是,我的文件正在推送500 MB和1200万行,只是加载文件需要花费相当长的时间。是否有XML的.NET等价物?或者我在这里仅限于本机PowerShell,并且相关的性能受到了影响?

1 个答案:

答案 0 :(得分:3)

您可能需要查看What is the difference between SAX and DOM?以获取有关解析XML的其他方法的信息。

SAX可能是一个很好的方法。

PowerShell and .Net itself don't have a native SAX parser,但XmlReader class可能适合您。

MSDN Docs上的示例来看,它似乎没有做任何过于疯狂的事情,或者使用PowerShell中乏味/困难的功能。

这是他们的例子C#:

// Create a validating XmlReader object. The schema 
// provides the necessary type information.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add("urn:empl-hire", "hireDate.xsd");
using (XmlReader reader = XmlReader.Create("hireDate.xml", settings)) {

  // Move to the hire-date element.
  reader.MoveToContent();
  reader.ReadToDescendant("hire-date");

  // Return the hire-date as a DateTime object.
  DateTime hireDate = reader.ReadElementContentAsDateTime();
  Console.WriteLine("Six Month Review Date: {0}", hireDate.AddMonths(6));
}

这是一个PowerShell端口,我根本不打算测试(抱歉):

# Create a validating XmlReader object. The schema 
# provides the necessary type information.

$settings = New-Object System.Xml.XmlReaderSettings
$settings.ValidationType = [System.Xml.ValidationType]::Schema
$settings.Schemas.Add("urn:empl-hire", "hireDate.xsd") 
# see their page for example XML/XSD

try {
    $reader = [System.Xml.XmlReader]::Create("hireDate.xml", $settings)

    # Move to the hire-date element.
    $reader.MoveToContent();
    $reader.ReadToDescendant("hire-date");

    # Return the hire-date as a DateTime object.
    $hireDate = $reader.ReadElementContentAsDateTime()
    "Six Month Review Date: {0}" -f $hireDate.AddMonths(6) | Write-Verbose -Verbose
} finally {
    $reader.Dispose()
}