如何使用 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