Powershell 中非常大的 XML 文件

2024-03-01

对于非常大的文本文件,我们可以选择使用 StreamReader 和 StreamWriter,然后允许逐行查找/替换。但是,我有一个 XML 文件,需要在其中进行查找/替换并进行更多控制,例如查找/替换特定节点中的值,该节点是具有特定属性和值的另一个节点的子节点。因此,逐行解析相当复杂,但使用 XML 文档时却非常容易处理。但是,我的文件大小为 500 MB,行数为 1200 万行,仅加载文件就需要很长时间。 .NET 中是否有 XML 的等效项?或者我是否仅限于使用本机 PowerShell,从而导致性能下降?


您可能想看看SAX 和 DOM 有什么区别? https://stackoverflow.com/q/6828703/3905079有关解析 XML 的替代方法的信息。

SAX 可能对您来说是一个好方法。

PowerShell 和 .Net 本身没有本机 SAX 解析器 https://stackoverflow.com/q/3903947/3905079,但是XmlReader类 https://stackoverflow.com/a/4164076/3905079可能适合你。

从上面的例子来看MSDN 文档 https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx,它似乎没有做任何太疯狂的事情,也没有使用 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()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell 中非常大的 XML 文件 的相关文章

随机推荐