如何使用 PowerShell 解析 XML 文件
-
使用
Select-Xml解析 XML 文件 -
使用
System.Xml.XmlDocument类解析 XML 文件 -
使用
System.Xml.XmlTextReader类解析 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-Xml。Select-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 属性
现在,让我们采取一种新方法来查找计算机名称。计算机描述符不再由 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 属性的值。
输出:

无论我们是读取元素还是属性,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 输出计算机名称。
输出:

使用 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 是许多自动化和数据处理任务中的一项多用途且重要的技能。通过了解各种可用的方法,如 Select-Xml、System.Xml.XmlDocument 和 System.Xml.XmlTextReader,PowerShell 用户可以高效地从 XML 文档中提取和操作数据,以满足他们的需求。
无论解析元素还是属性,每种方法都有其优势,使 PowerShell 脚本能够有效处理 XML 数据。通过利用这些解析技术,PowerShell 用户可以简化工作流程,更有效地实现其自动化目标。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn