Convertir XML a JSON en PowerShell
- Acceder a claves y valores de documentos XML
- Construya PowerShell Hash para almacenar datos
- Convertir hash a JSON
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.
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.
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:
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:
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
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.