如何使用 PowerShell 解析 XML 文件

  1. 使用 Select-Xml 解析 XML 文件
  2. 使用 System.Xml.XmlDocument 类解析 XML 文件
  3. 使用 System.Xml.XmlTextReader 类解析 XML 文件
  4. 结论
如何使用 PowerShell 解析 XML 文件

可扩展标记语言或 XML 格式至今仍被广泛使用。配置文件、RSS 源和 Office 文件只是使用 XML 格式的一些示例。

在 PowerShell 中解析 XML 是一项常见任务,通常用于数据提取、配置管理和自动化等任务。虽然 PowerShell 提供了几种解析 XML 的方法,但每种方法都有其优点和使用场景。

在本文中,我们将探讨在 PowerShell 中解析 XML 的三种方法:使用 Select-Xml 命令、System.Xml.XmlDocument 类以及 System.Xml.XmlTextReader 类。我们将为每种方法提供详细的示例和解释,突出它们的语法、功能和实际应用。

使用 Select-Xml 解析 XML 文件

解析 PowerShell XML 元素

首先,让我们介绍使用 PowerShell 解析 XML 中最流行和最简单的方法之一,即 Select-XmlSelect-Xml PowerShell 命令允许我们提供一个 XML 文件或字符串以及一个 XPath 过滤器,以提取特定信息。

我们在许多 PC 上都有一个 XML 文件,我们希望用 PowerShell 解析它。例如,每台机器都有一个名字、一个 IP 地址和一个可以用于报告的 Include 元素。

示例 XML:

<Computers>
	<Computer>
		<Name>WINPC-01</Name>
		<Ip>127.0.0.1</Ip>
		<Include>true</Include>
	</Computer>
	<Computer>
		<Name>WINPC-02</Name>
		<Ip>192.168.1.105</Ip>
		<Include>false</Include>
	</Computer>
	<Computer>
		<Name>WINPC-03</Name>
		<Ip>192.168.1.104</Ip>
		<Include>true</Include>
	</Computer>
</Computers>

我们希望使用 PowerShell 解析这个 XML 文件并获取计算机名称。为此,我们可以使用 Select-Xml 命令。

例如,在上面的文件中,计算机名称出现在 Name 元素的内部文本 (InnerXML) 中。

我们首先提供合适的 XPath 来查找计算机名称。仅包含在 Computer 元素中的 Name 节点会使用这种 XPath 技术返回。

示例代码:

Select-Xml -Path sample.xml -XPath '/Computers/Computer/Name' | ForEach-Object { $_.Node.InnerXML }

我们使用 Select-Xml 在 XML 文件 C:\path\sample.xml 中搜索与 XPath 表达式 '/Computers/Computer/Name' 匹配的节点。这个 XPath 表达式指示 PowerShell 选择每个 <Computer> 元素内的所有 <Name> 元素。

然后,我们利用 ForEach-Object 命令来遍历 Select-Xml 命令返回的结果。在这个循环中,我们访问每个匹配节点的 InnerXML 属性。

这个属性包含 XML 元素的内部文本内容,使我们能够提取所需的数据。

输出:

powershell 解析 xml - 输出 1

解析 PowerShell XML 属性

现在,让我们采取一种新方法来查找计算机名称。计算机描述符不再由 XML 元素表示,而是直接通过 XML 属性表达。

下面是一个将计算机描述符表示为属性的示例 XML 文件。我们现在可以将每个描述符视为一个属性,而不是一个元素。

示例 XML:

<Computers>
	<Computer name="WINPC-01" ip="127.0.0.1" include="true" />
	<Computer name="WINPC-02" ip="192.168.1.104" include="false" />
	<Computer name="WINPC-03" ip="192.168.1.105" include="true" />
</Computers>

由于每个描述符是一个属性,仅需调整 XPath 以查找 Computer 元素。然后,使用 ForEach-Object 命令查找 name 属性的值。

示例代码:

Select-Xml -Path sample.xml -XPath '/Computers/Computer' | ForEach-Object { $_.Node.name }

我们使用 Select-Xml 在 XML 文件 C:\path\computers-attr.xml 中搜索与 XPath 表达式 '/Computers/Computer' 匹配的节点。这个 XPath 表达式选择所有 <Computer> 元素在 <Computers> 根节点下。

然后,我们利用 ForEach-Object 命令来遍历结果;在循环中,我们访问每个匹配节点的 name 属性。这个属性表示每个 <Computer> 元素的 name 属性的值。

输出:

powershell 解析 xml - 输出 2

无论我们是读取元素还是属性,Select-Xml 的语法都很繁琐:它迫使我们使用 XPath 参数,然后将结果通过管道传递到循环,最后在 Node 属性下查找数据。

使用 System.Xml.XmlDocument 类解析 XML 文件

System.Xml.XmlDocument 类用于在 PowerShell 中解析 XML 提供了一种通用和有效的解决方案,适用于处理 XML 数据,使其成为各种自动化任务、数据处理和配置管理场景中的一种有价值的工具。

此方法涉及创建 XmlDocument 类的实例,将 XML 内容加载到文档对象中,然后导航文档的节点以访问所需的数据。

示例代码:

$xmlDocument = New-Object System.Xml.XmlDocument
$xmlDocument.Load("sample.xml")

$computerNodes = $xmlDocument.SelectNodes("//Computer")
foreach ($computerNode in $computerNodes) {
    $name = $computerNode.SelectSingleNode("Name").InnerText
    Write-Output $name
}

在这个代码片段中,我们使用 New-Object 创建 System.Xml.XmlDocument 类的新实例。然后,我们使用 Load 方法将 XML 内容从文件 C:\path\computers.xml 加载到 $xmlDocument 对象中。

我们使用 SelectNodes 方法提取 XML 文档中的所有 <Computer> 元素。

接着,我们使用 foreach 循环遍历每个 <Computer> 节点。在循环中,我们使用 SelectSingleNode 查找每个 <Computer> 节点内的 <Name> 元素,并使用 InnerText 属性提取其内部文本。

最后,我们使用 Write-Output 输出计算机名称。

输出:

powershell 解析 xml - 输出 3

使用 System.Xml.XmlTextReader 类解析 XML 文件

使用 System.Xml.XmlTextReader 类在 PowerShell 中解析 XML 提供了一种简单且内存高效的方法来处理 XML 数据。这个类提供了一个单向的只读流,能够有效解析 XML 数据,而无需将整个文档加载到内存中。

通过利用 XmlTextReader,PowerShell 脚本可以高效提取 XML 文档中的特定元素或属性,实现数据提取、配置管理和自动化等任务。

示例代码:

$xmlFilePath = "sample.xml"
$xmlReader = [System.Xml.XmlTextReader]::new($xmlFilePath)

while ($xmlReader.Read()) {
    if ($xmlReader.NodeType -eq "Element" -and $xmlReader.Name -eq "Name") {
        $name = $xmlReader.ReadString()
        Write-Output $name
    }
}

在这个代码片段中,我们使用 $xmlFilePath 变量指定 XML 文件的路径。然后,我们创建 System.Xml.XmlTextReader 类的新实例,并使用 $xmlFilePath 指定的文件的 XML 内容初始化它。

我们使用 while 循环通过 XmlTextReader 类的 Read 方法来遍历 XML 内容。在循环内,我们检查当前节点类型是否为元素,以及其名称是否为 Name

如果两个条件都满足,我们使用 ReadString 方法提取 <Name> 元素的内部文本,并使用 Write-Output 输出。

输出:

powershell 解析 xml - 输出 4

结论

在 PowerShell 中解析 XML 是许多自动化和数据处理任务中的一项多用途且重要的技能。通过了解各种可用的方法,如 Select-XmlSystem.Xml.XmlDocumentSystem.Xml.XmlTextReader,PowerShell 用户可以高效地从 XML 文档中提取和操作数据,以满足他们的需求。

无论解析元素还是属性,每种方法都有其优势,使 PowerShell 脚本能够有效处理 XML 数据。通过利用这些解析技术,PowerShell 用户可以简化工作流程,更有效地实现其自动化目标。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相关文章 - PowerShell XML