PowerShell에서 XML을 JSON으로 변환

Migel Hewage Nimesha 2024년2월15일
  1. XML 문서 키 및 값에 액세스
  2. 데이터를 보관할 PowerShell 해시 구성
  3. 해시를 JSON으로 변환
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, EmpAgeEmpDesignation에 액세스합니다.

암호:

$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에서 두 개의 직원 개체를 추출하고 해당 데이터를 $empObjHash1$empObjHash2라는 두 개의 해시 개체로 푸시했습니다. 그런 다음 두 개의 직원 개체를 푸시하여 $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 cmdlet을 사용하여 해시에서 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.