如何使用 PowerShell 解析 XML 文件
-
使用
Select-Xml
在 PowerShell 中解析 XML 文件 -
使用
System.Xml.XmlDocument
類在 PowerShell 中解析 XML 文件 -
使用
System.Xml.XmlTextReader
類在 PowerShell 中解析 XML 文件 - 結論

擴展標記語言或 XML 格式今天仍然被廣泛使用。配置文件、RSS 源和 Office 文件只是使用 XML 格式的一些示例。
在 PowerShell 中解析 XML 是一項常見任務,通常需要用於數據提取、配置管理和自動化等任務。雖然 PowerShell 提供幾種解析 XML 的方法,但每種方法都有其優勢和使用情境。
在本文中,我們將探討三種在 PowerShell 中解析 XML 的方法:使用 Select-Xml
Cmdlet、System.Xml.XmlDocument
類和 System.Xml.XmlTextReader
類。我們將為每種方法提供詳細的示例和解釋,突出其語法、功能和實際應用。
使用 Select-Xml
在 PowerShell 中解析 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
在位於 C:\path\sample.xml
的 XML 文件中搜索與 XPath 表達式 '/Computers/Computer/Name'
匹配的節點。此 XPath 表達式指示 PowerShell 在 <Computers>
根節點下選擇所有 <Computer>
元素中的 <Name>
元素。
然後,我們利用 ForEach-Object
Cmdlet 迭代由 Select-Xml
Cmdlet 返回的結果。在這個循環內,我們訪問每個匹配節點的 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
Cmdlet 查找 name
屬性的值。
示例代碼:
Select-Xml -Path sample.xml -XPath '/Computers/Computer' | ForEach-Object { $_.Node.name }
我們使用 Select-Xml
在位於 C:\path\computers-attr.xml
的 XML 文件中搜索與 XPath 表達式 '/Computers/Computer'
匹配的節點。此 XPath 表達式選擇所有在 <Computers>
根節點下的 <Computer>
元素。
然後,我們利用 ForEach-Object
Cmdlet 迭代結果;在循環中,我們訪問每個匹配節點的 name
屬性。此屬性表示每個 <Computer>
元素的 name
屬性的值。
輸出:
無論我們是讀取元素還是屬性,Select-Xml
的語法都是繁瑣的:它迫使我們使用 XPath
參數,然後將結果傳遞到循環,最後在 Node
屬性下查找數據。
使用 System.Xml.XmlDocument
類在 PowerShell 中解析 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
方法將來自文件 C:\path\computers.xml
的 XML 內容加載到 $xmlDocument
對象中。
我們使用 SelectNodes
方法檢索 XML 文檔中的所有 <Computer>
元素。
然後,我們使用 foreach
循環遍歷每個 <Computer>
節點。在循環中,我們使用 SelectSingleNode
找到每個 <Computer>
節點內的 <Name>
元素,並使用 InnerText
屬性提取其內部文本。
最後,我們使用 Write-Output
輸出計算機名稱。
輸出:
使用 System.Xml.XmlTextReader
類在 PowerShell 中解析 XML 文件
在 PowerShell 中使用 System.Xml.XmlTextReader
類解析 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