Convertir XML a JSON en PowerShell

Migel Hewage Nimesha 15 febrero 2024
  1. Acceder a claves y valores de documentos XML
  2. Construya PowerShell Hash para almacenar datos
  3. Convertir hash a JSON
Convertir XML a JSON en PowerShell

PowerShell ofrece varios cmdlets para trabajar con formatos JSON y XML. Esta guía se centrará en convertir un documento XML a una cadena con formato JSON mediante PowerShell.

Acceder a claves y valores de documentos XML

PowerShell permite manipular nodos de documentos XML mediante el cmdlet Select-Xml. Podemos especificar expresiones XPath para encontrar nodos y sus valores de texto en un documento XML.

Sintaxis:

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

Vamos a crear un documento XML llamado employeeinfo.xml con el siguiente contenido.

XML - info del empleado.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>

Ahora, vamos a acceder a cada nodo XML EmpId, EmpAge y EmpDesignation usando el cmdlet Select-Xml de la siguiente manera.

Código:

$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}

En este ejemplo, el -Path es la ubicación donde se encuentra el employeeinfo.xml. Dado que necesitamos obtener tres nodos por objeto de empleado, se ha utilizado PowerShell foreach.

La expresión XPath tiene el siguiente aspecto para cada nodo.

Se puede acceder al nodo EmpID mediante la consulta XPath "//Employee//EmpId".

Se puede acceder al nodo EmpAge mediante la consulta XPath "//Employee//EmpIAge".

Se puede acceder al nodo EmpDesignation mediante la consulta XPath "//Employee//EmpDesignation".

Las variables de referencia $empIds, $empAges y $empDesigs contienen una matriz de valores para los respectivos nodos XML. Escribamos las matrices en las ventanas de la consola de PowerShell.

Escriba los valores de las matrices para los respectivos nodos XML en la ventana de la consola de PowerShell

Construya PowerShell Hash para almacenar datos

No tenemos un enfoque sencillo para convertir un documento XML en una cadena JSON. Por lo tanto, como se muestra en la sección anterior, tenemos que extraer datos XML y enviar esos datos a un hash de PowerShell como formato intermedio.

Construyamos el hash.

$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)

Hemos extraído los dos objetos de empleados del XML con fines de demostración y hemos enviado esos datos a dos objetos hash, $empObjHash1 y $empObjHash2. Luego, se crea el $finalHash empujando los dos objetos de empleado.

Si imprimimos el $finalHash, quedaría de la siguiente manera.

Extraiga objetos de XML a objetos hash

Podemos usar el bucle foreach para inspeccionar $finalHash con más detalle.

Código:

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

Producción:

Use el ciclo foreach para inspeccionar $finalHash en detalle

El $finalHash se ha construido con los datos relevantes extraídos del XML.

Convertir hash a JSON

Dado que obtuvimos un hash de PowerShell $finalHash, es posible usar el cmdlet ConvertTo-Json para crear un JSON a partir del hash.

Sintaxis:

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

Pasemos el hash creado $finalHash para crear la cadena JSON como se muestra a continuación.

Código:

$finalHash | ConvertTo-Json

Producción:

Convertir hash a JSON

Guión completo de 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.