Cómo convertir XML a JSON en PowerShell

  1. Usando XPath Selection, Hash Table, y ConvertTo-Json para Convertir XML a JSON en PowerShell
  2. Usando los Cmdlets ConvertTo-Json y ConvertFrom-Xml para Convertir XML a JSON en PowerShell
  3. Conclusión
Cómo convertir XML a JSON en PowerShell

Esta guía completa profundiza en la conversión de documentos XML a cadenas de formato JSON utilizando PowerShell, un poderoso lenguaje de secuencias de comandos y shell de línea de comandos. Los formatos XML y JSON son fundamentales en el intercambio y almacenamiento de datos, especialmente en entornos donde la configuración y el procesamiento de datos son fundamentales.

PowerShell, con su robusto conjunto de cmdlets, simplifica este proceso de conversión. Exploramos dos métodos principales en esta guía: el primero implica una combinación de XPath Selection, Hash Table, y ConvertTo-Json, y el segundo utiliza los cmdlets ConvertTo-Json y ConvertFrom-Xml.

La guía proporciona un enfoque paso a paso, comenzando con el acceso a las claves y valores del documento XML, construyendo un hash de PowerShell para mantener los datos, y finalmente convirtiendo el hash a JSON. Cada método se ilustra con ejemplos detallados y sintaxis, asegurando una comprensión clara de los procesos involucrados.

Usando XPath Selection, Hash Table, y ConvertTo-Json para Convertir XML a JSON en PowerShell

Acceder a las Claves y Valores del Documento XML

PowerShell permite manipular los nodos del documento XML utilizando 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 - 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>

Ahora, vamos a acceder a cada nodo XML EmpId, EmpAge, y EmpDesignation utilizando 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 employeeinfo.xml. Dado que necesitamos recuperar tres nodos por objeto de empleado, se ha utilizado foreach de PowerShell.

La expresión XPath se ve como sigue para cada nodo. El nodo EmpID se puede acceder mediante la consulta XPath "//Employee//EmpId".

El nodo EmpAge se puede acceder mediante la consulta XPath "//Employee//EmpIAge". El nodo EmpDesignation se puede acceder mediante la consulta XPath "//Employee//EmpDesignation".

Las variables de referencia, $empIds, $empAges, y $empDesigs, contienen un arreglo de valores para los respectivos nodos XML. Vamos a escribir los arreglos en las ventanas de la consola de PowerShell.

Escribe los valores de los arreglos para los respectivos nodos XML en la ventana de la consola de PowerShell.

Construir un Hash de PowerShell para Mantener los Datos

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

Vamos a construir 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 dos objetos de empleado del XML con fines de demostración y hemos enviado esos datos a dos objetos hash, $empObjHash1 y $empObjHash2. Luego, el $finalHash se crea insertando los dos objetos de empleado.

Si imprimimos el $finalHash, se vería como sigue.

Extraer objetos de XML a objetos hash

Podemos usar el bucle foreach para inspeccionar el $finalHash en 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]
        }
    }
}

Salida:

Utiliza un bucle foreach para inspeccionar el $finalHash en detalle.

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

Convertir Hash a JSON

Dado que tenemos 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>]

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

Código:

$finalHash | ConvertTo-Json

Salida:

Convertir Hash a JSON

Script 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

Usando los Cmdlets ConvertTo-Json y ConvertFrom-Xml para Convertir XML a JSON en PowerShell

En PowerShell, convertir datos de XML a formato JSON es un requisito común, particularmente al interactuar con API web o servicios web modernos. PowerShell simplifica esta tarea con sus cmdlets ConvertTo-Json y ConvertFrom-Xml.

Sintaxis:

  • Get-Content: Lee el contenido de un archivo.

    • -Path <String>: Especifica la ruta del archivo.
  • ConvertTo-Json: Convierte un objeto a una cadena formateada en JSON.

    • -InputObject <Object>: Especifica el objeto a convertir.
    • -Depth <Int32>: Especifica la profundidad de las jerarquías de objetos a incluir.

Ejemplo

# Path to the XML file
$xmlFilePath = "employeeinfo.xml"

# Read the content of the XML file and convert to XML object
$xml = New-Object XML
$xml.Load($xmlFilePath)

# Parse the XML and create an object array
$employeeArray = @()
foreach ($employee in $xml.Employees.Employee) {
    $empObject = [PSCustomObject]@{
        EmpId          = $employee.EmpId
        EmpAge         = $employee.EmpAge
        EmpDesignation = $employee.EmpDesignation
    }
    $employeeArray += $empObject
}

# Convert the array to JSON
$json = $employeeArray | ConvertTo-Json

# Display the result
Write-Output $json

En nuestro script, primero especificamos la ruta al archivo XML utilizando la variable $xmlFilePath. Usando Get-Content, leemos el contenido de este archivo en la variable $xmlContent.

Este contenido se convierte a un tipo [xml], creando un objeto XML estructurado ($xmlObject). Este objeto se pasa a ConvertTo-Json para realizar la conversión a formato JSON.

Finalmente, usamos Write-Output para imprimir la cadena JSON.

Salida:

powershell convertir xml a json - salida

Conclusión

En conclusión, esta guía ha demostrado con éxito los métodos prácticos y eficientes de convertir documentos XML a cadenas JSON utilizando PowerShell. Al mostrar dos enfoques distintos - uno que implica la extracción de datos XML en un hash de PowerShell y otro que utiliza el cmdlet ConvertFrom-Xml - la guía proporciona opciones versátiles adaptadas a diferentes necesidades y escenarios del usuario.

Las instrucciones paso a paso, junto con fragmentos de código relevantes y salidas, permiten a los lectores comprender el concepto fácilmente y aplicar estos métodos en situaciones del mundo real. La flexibilidad y el poder de PowerShell en el manejo y la transformación de formatos de datos son evidentes, convirtiéndolo en una herramienta indispensable para administradores y desarrolladores que manejan transformaciones de datos XML y JSON.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
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.

Artículo relacionado - PowerShell Convert