PowerShell에서 XML을 JSON으로 변환
PowerShell은 JSON 및 XML 형식으로 작업할 수 있는 다양한 cmdlet을 제공합니다. 이 가이드는 PowerShell을 사용하여 XML 문서를 JSON 형식 문자열로 변환하는 데 중점을 둡니다.
XML 문서 키 및 값에 액세스
PowerShell은 Select-Xml cmdlet을 사용하여 XML 문서 노드를 조작할 수 있도록 합니다. XML 문서에서 노드와 해당 텍스트 값을 찾기 위해 XPath 식을 지정할 수 있습니다.
통사론:
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
cmdlet을 사용하여 각 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에서 두 개의 직원 개체를 추출하고 해당 데이터를 $empObjHash1
및 $empObjHash2
라는 두 개의 해시 개체로 푸시했습니다. 그런 다음 두 개의 직원 개체를 푸시하여 $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
cmdlet을 사용하여 해시에서 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.