PowerShell を使用して XML ファイルを解析する方法
-
PowerShell を使用して XML ファイルを解析するために
Select-Xml
を使用する -
PowerShell を使用して XML ファイルを解析するために
System.Xml.XmlDocument
クラスを使用する -
PowerShell を使用して XML ファイルを解析するために
System.Xml.XmlTextReader
クラスを使用する - 結論

拡張可能なマークアップ言語、または XML 形式は、今日でも広く使用されています。構成ファイル、RSS フィード、Office ファイルは、XML 形式を使用するいくつかの例です。
PowerShell で XML を解析することは一般的なタスクであり、データ抽出、構成管理、および自動化などのタスクにしばしば必要とされます。PowerShell は XML を解析するためのいくつかの方法を提供していますが、各方法にはそれぞれの強みと使用例があります。
この記事では、PowerShell で XML を解析するための 3つの方法を探ります:Select-Xml
コマンドレット、System.Xml.XmlDocument
クラス、System.Xml.XmlTextReader
クラスの使用です。各方法の構文、機能、および実用的なアプリケーションを強調しながら、詳細な例と説明を提供します。
PowerShell を使用して XML ファイルを解析するために Select-Xml
を使用する
PowerShell XML 要素を解析する
まず、Select-XML
を使用して PowerShell で XML を解析する最も人気があり簡単な方法の 1つをカバーします。Select-Xml
PowerShell コマンドを使うことで、XML ファイルまたは文字列と XPath
フィルターを指定して特定の情報を抽出することができます。
私たちは、PowerShell を使用して解析したい XML ファイルが多くの PC にあります。たとえば、各マシンには名前、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
を提供します。この XPath
技術を使用すると、Computer
要素に含まれる Name
ノードだけが返されます。
例コード:
Select-Xml -Path sample.xml -XPath '/Computers/Computer/Name' | ForEach-Object { $_.Node.InnerXML }
Select-Xml
を使用して、C:\path\sample.xml
にある XML ファイルを'/Computers/Computer/Name'
の XPath 式に一致するノードを検索します。この XPath 式は、PowerShell に <Computers>
ルートノードの下にある各 <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
を使用して、C:\path\computers-attr.xml
にある XML ファイルを'/Computers/Computer'
の XPath 式に一致するノードを検索します。この XPath 式は、<Computers>
ルートノードの下にあるすべての <Computer>
要素を選択します。
次に、ForEach-Object
コマンドレットを使用して結果を反復処理します。ループ内では、各一致したノードの name
プロパティにアクセスします。このプロパティは、各 <Computer>
要素の name
属性の値を表します。
出力:
要素を読み取っている場合でも属性を読み取っている場合でも、Select-Xml
の構文は煩雑です。XPath
パラメータを使用することを強制し、その後、結果をループにパイプし、最後に Node
プロパティの下でデータを探す必要があります。
PowerShell を使用して XML ファイルを解析するために System.Xml.XmlDocument
クラスを使用する
PowerShell における XML 解析のための System.Xml.XmlDocument
クラスは、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 ファイルを解析するために System.Xml.XmlTextReader
クラスを使用する
PowerShell で XML を解析するために System.Xml.XmlTextReader
クラスを使用することは、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 コンテンツで初期化します。
XmlTextReader
クラスの Read
メソッドを使用して、XML コンテンツを反復処理するために while
ループを使用します。ループ内では、現在のノードタイプが要素であり、その名前が 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