PowerShellでは、さまざまな形式のデータを柔軟に扱うことができますが、中でもXML形式は構造化されたデータを表現するのに非常に便利です。Web APIのレスポンスや構成ファイル、設定情報など、多くの場面で使われるXMLですが、そのままでは扱いにくいという声も多く聞きます。
そんなときに活躍するのが、ConvertFrom-Xml
コマンドレットです。このコマンドを使えば、XML文字列をPowerShellのオブジェクトに変換して、簡単に情報を抽出・加工することが可能になります。本記事では、ConvertFrom-Xml
の基本的な使い方から、実用的な応用例までをわかりやすく解説していきます。
ConvertFrom-Xmlとは?
ConvertFrom-Xml
は、PowerShell 7以降で使用できるコマンドレットで、XML形式の文字列をPowerShellのカスタムオブジェクトに変換するために使います。
従来は[xml]
キャストを使ってXMLを扱っていましたが、ConvertFrom-Xml
を使うことで、よりシンプルにオブジェクトとして扱えるようになりました。
このコマンドは、特に以下のような場合に有効です。
- XMLファイルの中身をオブジェクトとして扱いたい
- REST APIから受け取ったXMLレスポンスを加工したい
- 特定のノードや属性の値を抽出したい
基本的な使い方
まずは基本的な使用例を紹介します。以下のようなXML文字列を例にします。
<Books>
<Book>
<Title>PowerShell入門</Title>
<Author>山田太郎</Author>
<Year>2023</Year>
</Book>
<Book>
<Title>Windows管理術</Title>
<Author>佐藤花子</Author>
<Year>2021</Year>
</Book>
</Books>
このXMLをPowerShellでオブジェクトに変換するには、次のようにします。
$xml = @"
<Books>
<Book>
<Title>PowerShell入門</Title>
<Author>山田太郎</Author>
<Year>2023</Year>
</Book>
<Book>
<Title>Windows管理術</Title>
<Author>佐藤花子</Author>
<Year>2021</Year>
</Book>
</Books>
"@
$result = $xml | ConvertFrom-Xml
このようにすると、$result
はカスタムオブジェクトになります。実際に中身を確認すると、次のように表示されます。
$result.Books.Book
出力結果:
textコピーする編集するTitle Author Year
----- ------ ----
PowerShell入門 山田太郎 2023
Windows管理術 佐藤花子 2021
オブジェクトの操作方法
オブジェクトに変換されたあとは、PowerShellの通常のオブジェクト操作が可能になります。たとえば、すべてのタイトルを取得したい場合は次のように記述します。
$result.Books.Book | ForEach-Object { $_.Title }
特定の年以降に出版された本だけを抽出することもできます。
$result.Books.Book | Where-Object { $_.Year -ge 2022 }
属性を含むXMLの扱い
XMLでは、ノードの属性もよく使われます。次のような例を見てみましょう。
<Books>
<Book id="101" genre="Tech">
<Title>PowerShell応用</Title>
<Author>中村一郎</Author>
</Book>
</Books>
このXMLを扱うと、属性もプロパティとしてアクセスできます。
$xml = @"
<Books>
<Book id="101" genre="Tech">
<Title>PowerShell応用</Title>
<Author>中村一郎</Author>
</Book>
</Books>
"@
$result = $xml | ConvertFrom-Xml
$book = $result.Books.Book
$book.id # => 101
$book.genre # => Tech
属性がそのままプロパティになっているのが確認できます。
XMLファイルを読み込んで変換する
文字列としてではなく、外部のXMLファイルを読み込んで変換することも可能です。次のようにします。
$xmlContent = Get-Content -Path "C:\data\books.xml" -Raw
$result = $xmlContent | ConvertFrom-Xml
ポイントは、-Raw
オプションを付けることで、ファイル全体を1つの文字列として読み込むことです。これをConvertFrom-Xml
にパイプで渡すことで、同様にオブジェクトに変換できます。
応用:APIレスポンスの処理
最近では、REST APIのレスポンスをPowerShellで処理するケースも増えてきました。たとえば、APIがXML形式のレスポンスを返してくる場合でも、ConvertFrom-Xml
を使えば簡単に扱えます。
$response = Invoke-RestMethod -Uri "https://api.example.com/books" -Headers @{Accept = "application/xml"} -Method Get
$xmlContent = $response | Out-String
$data = $xmlContent | ConvertFrom-Xml
$data.Books.Book | Format-Table Title, Author
このように、APIからのレスポンスを一度文字列にしてから変換することで、柔軟に情報を抽出できます。
ConvertFrom-Xmlと[xml]キャストの違い
PowerShellでは、[xml]
キャストを使ってXMLを直接.NETのXmlDocument
オブジェクトとして扱う方法もあります。
[xml]$doc = $xml
$doc.Books.Book[0].Title
[xml]
は柔軟ですが、XPathの知識が必要だったり、オブジェクトとしての操作がやや煩雑になることがあります。一方、ConvertFrom-Xml
はよりシンプルにオブジェクト化されるため、PowerShell初心者や軽いスクリプト用途には特におすすめです。
注意点とエラー対処
エラー例:「Input is not a valid XML string」
XML文字列に不備があると、以下のようなエラーが出ます。
ConvertFrom-Xml : Input is not a valid XML string.
これはXMLの構造にエラーがある場合に表示されます。タグの閉じ忘れや文字エンコードの不備などを確認しましょう。
文字エンコードの問題
日本語を含むXMLファイルを扱う場合、エンコードがUTF-8でないと正しく読み込めないことがあります。その場合は、次のように読み込み時にエンコードを指定してください。
$xmlContent = Get-Content -Path "C:\data\books.xml" -Encoding UTF8 -Raw
まとめ
ConvertFrom-Xml
は、XML形式のデータをPowerShellのオブジェクトとして簡単に扱うことができる強力なコマンドレットです。
従来の[xml]
キャストよりも直感的に使える点が魅力で、ログ解析、設定ファイルの読み取り、APIレスポンスの処理など、さまざまな場面で活用できます。
特にPowerShell 7以降を使っている方には、積極的に活用してほしい機能の一つです。XMLデータの処理でお困りの方は、ぜひ一度試してみてください。