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 ノード EmpId
、EmpAge
、および 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}
この例では、-Path
は employeeinfo.xml
がある場所です。 従業員オブジェクトごとに 3つのノードをフェッチする必要があるため、PowerShell foreach
が使用されています。
各ノードの XPath 式は次のようになります。
EmpID
ノードには、XPath クエリ "//Employee//EmpId"
でアクセスできます。
EmpAge
ノードは、XPath クエリ "//Employee//EmpIAge"
でアクセスできます。
EmpDesignation
ノードには、XPath クエリ "//Employee//EmpDesignation"
でアクセスできます。
参照変数 $empIds
、$empAges
、および $empDesigs
には、それぞれの XML ノードの値の配列が含まれています。 配列を PowerShell コンソール ウィンドウに書き込みましょう。
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
を出力すると、次のようになります。
foreach
ループを使用して $finalHash
をより詳細に調べることができます。
コード:
foreach($em in $finalHash.keys) {
foreach($emp in $finalHash[$em]) {
foreach($val in $emp.keys) {
Write-Host "Key:" $val "Value:" $emp[$val]
}
}
}
出力:
$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
出力:
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
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.