如何使用 PowerShell 解析 XML 文件

  1. 使用 Select-Xml 在 PowerShell 中解析 XML 文件
  2. 使用 System.Xml.XmlDocument 類在 PowerShell 中解析 XML 文件
  3. 使用 System.Xml.XmlTextReader 類在 PowerShell 中解析 XML 文件
  4. 結論
如何使用 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-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 在位於 C:\path\sample.xml 的 XML 文件中搜索與 XPath 表達式 '/Computers/Computer/Name' 匹配的節點。此 XPath 表達式指示 PowerShell 在 <Computers> 根節點下選擇所有 <Computer> 元素中的 <Name> 元素。

然後,我們利用 ForEach-Object Cmdlet 迭代由 Select-Xml Cmdlet 返回的結果。在這個循環內,我們訪問每個匹配節點的 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 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 屬性的值。

輸出:

powershell 解析 xml - 輸出 2

無論我們是讀取元素還是屬性,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 輸出計算機名稱。

輸出:

powershell 解析 xml - 輸出 3

使用 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 - 輸出 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