ConvertFrom-XmlでXMLを簡単変換!PowerShellで扱うXMLデータの基本と応用

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データの処理でお困りの方は、ぜひ一度試してみてください。

タイトルとURLをコピーしました