PowerShell で XML を JSON に変換する

Migel Hewage Nimesha 2023年6月20日
  1. XML ドキュメントのキーと値にアクセスする
  2. PowerShell ハッシュを作成してデータを保持する
  3. ハッシュを JSON に変換する
PowerShell で XML を JSON に変換する

PowerShell には、JSON および XML 形式で動作するさまざまなコマンドレットが用意されています。 このガイドでは、PowerShell を使用して XML ドキュメントを JSON 形式の文字列に変換することに焦点を当てます。

XML ドキュメントのキーと値にアクセスする

PowerShell では、Select-Xml コマンドレットを使用して XML ドキュメント ノードを操作できます。 XPath 式を指定して、XML ドキュメント内のノードとそのテキスト値を検索できます。

構文:

Select-Xml
      [-XPath] <string>
      [-Path] <string[]>
      [-Namespace <hashtable>]
      [<CommonParameters>]

次の内容の employeeinfo.xml という XML ドキュメントを作成してみましょう。

XML - employeeinfo.xml:

<?xml version="1.0" encoding="utf-8"?>
<Employees>
    <Employee>
        <EmpId>1</EmpId>
        <EmpAge>45</EmpAge>
        <EmpDesignation>SSE</EmpDesignation>
    </Employee>
    <Employee>
        <EmpId>2</EmpId>
        <EmpAge>34</EmpAge>
        <EmpDesignation>Junior SE</EmpDesignation>
    </Employee>
</Employees>

次に、次のように Select-Xml コマンドレットを使用して、各 XML ノード EmpIdEmpAge、および EmpDesignation にアクセスします。

コード:

$empIds = Select-Xml -Path "D:\codes\employeeinfo.xml" -XPath "//Employee//EmpId" | foreach {$_.node.InnerText}
$empAges = Select-Xml -Path "D:\codes\employeeinfo.xml" -XPath "//Employee//EmpAge" | foreach {$_.node.InnerText}
$empDesigs = Select-Xml -Path "D:\codes\employeeinfo.xml" -XPath "//Employee//EmpDesignation" | foreach {$_.node.InnerText}

この例では、-Pathemployeeinfo.xml がある場所です。 従業員オブジェクトごとに 3つのノードをフェッチする必要があるため、PowerShell foreach が使用されています。

各ノードの XPath 式は次のようになります。

EmpID ノードには、XPath クエリ "//Employee//EmpId" でアクセスできます。

EmpAge ノードは、XPath クエリ "//Employee//EmpIAge" でアクセスできます。

EmpDesignation ノードには、XPath クエリ "//Employee//EmpDesignation" でアクセスできます。

参照変数 $empIds$empAges、および $empDesigs には、それぞれの XML ノードの値の配列が含まれています。 配列を PowerShell コンソール ウィンドウに書き込みましょう。

PowerShell コンソール ウィンドウにそれぞれの XML ノードの配列値を書き込む

PowerShell ハッシュを作成してデータを保持する

XML ドキュメントを JSON 文字列に変換する簡単な方法はありません。 したがって、上記のセクションで示したように、XML データを抽出し、それらのデータを中間形式として PowerShell ハッシュにプッシュする必要があります。

ハッシュを構築しましょう。

$empObjHash1 = @{
                    EmpId = $empIds[0];
                    EmpAge = $empAges[0];
                    EmpDesignation = $empDesigs[0];
                }
$empObjHash2 = @{
                    EmpId = $empIds[1];
                    EmpAge = $empAges[1];
                    EmpDesignation = $empDesigs[1];
                }

$finalHash = @{}
$finalHash.Add("emp1", $empObjHash1)
$finalHash.Add("emp2", $empObjHash2)

デモンストレーションのために XML から 2つの従業員オブジェクトを抽出し、それらのデータを 2つのハッシュ オブジェクト $empObjHash1$empObjHash2 にプッシュしました。 次に、2つの従業員オブジェクトをプッシュして $finalHash を作成します。

$finalHash を出力すると、次のようになります。

XML からハッシュ オブジェクトへのオブジェクトの抽出

foreach ループを使用して $finalHash をより詳細に調べることができます。

コード:

foreach($em in $finalHash.keys) {
    foreach($emp in $finalHash[$em]) {
        foreach($val in $emp.keys) {
            Write-Host "Key:" $val "Value:" $emp[$val]
        }
    }
}

出力:

foreach ループを使用して $finalHash を詳細に調べる

$finalHash は、XML から抽出された関連データを使用して構築されています。

ハッシュを JSON に変換する

PowerShell ハッシュ $finalHash を取得したので、ConvertTo-Json コマンドレットを使用して、ハッシュから JSON を作成できます。

構文:

ConvertTo-Json
              [-InputObject] <Object>
              [-Depth <Int32>]
              [-Compress]
              [-EnumsAsStrings]
              [-AsArray]
              [-EscapeHandling <StringEscapeHandling>]
              [<CommonParameters>]

作成したハッシュ $finalHash を渡して、次のように JSON 文字列を作成しましょう。

コード:

$finalHash | ConvertTo-Json

出力:

ハッシュを JSON に変換

PowerShell の完全なスクリプト:

$empIds = Select-Xml -Path "D:\codes\employeeinfo.xml" -XPath "//Employee//EmpId" | foreach {$_.node.InnerText}
$empAges = Select-Xml -Path "D:\codes\employeeinfo.xml" -XPath "//Employee//EmpAge" | foreach {$_.node.InnerText}
$empDesigs = Select-Xml -Path "D:\codes\employeeinfo.xml" -XPath "//Employee//EmpDesignation" | foreach {$_.node.InnerText}

$empObjHash1 = @{
                    EmpId = $empIds[0];
                    EmpAge = $empAges[0];
                    EmpDesignation = $empDesigs[0];
                }
$empObjHash2 = @{
                    EmpId = $empIds[1];
                    EmpAge = $empAges[1];
                    EmpDesignation = $empDesigs[1];
                }

$finalHash = @{}
$finalHash.Add("emp1", $empObjHash1)
$finalHash.Add("emp2", $empObjHash2)

foreach($em in $finalHash.keys) {
    foreach($emp in $finalHash[$em]) {

        foreach($val in $emp.keys) {
            Write-Host "Key:" $val "Value:" $emp[$val]
        }
    }
}

$finalHash | ConvertTo-Json
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.