HOWTO · PowerShell

Come convertire XML in JSON in PowerShell

PowerShell offre una vasta gamma di cmdlet per lavorare con diversi formati di interscambio dati come JSON e XML. Il cmdlet Select-Xml può essere utilizzato per manipolare i nodi XML utilizzando le query XPATH. I dati estratti dall'XML possono essere inviati a un Hash di PowerShell. Dal hash costruito, puoi creare la stringa JSON utilizzando il cmdlet ConvertTo-Json.

Questa guida completa approfondisce la conversione di documenti XML in stringhe formattate JSON utilizzando PowerShell, un potente linguaggio di scripting e shell da riga di comando. I formati XML e JSON sono fondamentali nello scambio e nella memorizzazione dei dati, specialmente in ambienti in cui la configurazione e l’elaborazione dei dati sono fondamentali.

PowerShell, con il suo robusto insieme di cmdlets, semplifica questo processo di conversione. In questa guida esploriamo due metodi principali: il primo involve una combinazione di XPath Selection, Hash Table e ConvertTo-Json, e il secondo utilizza i cmdlets ConvertTo-Json e ConvertFrom-Xml.

La guida fornisce un approccio passo-passo, a partire dall’accesso alle chiavi e ai valori del documento XML, costruendo un hash di PowerShell per contenere i dati e infine convertendo l’hash in JSON. Ogni metodo è illustrato con esempi dettagliati e sintassi, garantendo una chiara comprensione dei processi coinvolti.

Utilizzando XPath Selection, Hash Table e ConvertTo-Json per Convertire XML in JSON in PowerShell

Accedere alle Chiavi e ai Valori del Documento XML

PowerShell consente di manipolare i nodi del documento XML utilizzando il cmdlet Select-Xml. Possiamo specificare espressioni XPath per trovare i nodi e i loro valori testuali in un documento XML.

Sintassi:

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

Creiamo un documento XML chiamato employeeinfo.xml con il seguente contenuto.

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>

Ora, andiamo ad accedere a ciascun nodo XML EmpId, EmpAge e EmpDesignation utilizzando il cmdlet Select-Xml come segue.

Codice:

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

In questo esempio, il -Path è la posizione in cui si trova employeeinfo.xml. Poiché dobbiamo recuperare tre nodi per ogni oggetto dipendente, è stato utilizzato foreach di PowerShell.

L’espressione XPath è simile alla seguente per ciascun nodo. Il nodo EmpID può essere accesso tramite la query XPath "//Employee//EmpId".

Il nodo EmpAge può essere accesso tramite la query XPath "//Employee//EmpIAge". Il nodo EmpDesignation può essere accesso tramite la query XPath "//Employee//EmpDesignation".

Le variabili di riferimento, $empIds, $empAges e $empDesigs, contengono un array di valori per i rispettivi nodi XML. Scriviamo gli array nelle finestre della console di PowerShell.

Scrivi i valori degli array per i rispettivi nodi XML nella finestra della console di PowerShell

Costruire un Hash di PowerShell per Contenere i Dati

Non abbiamo un approccio diretto per convertire un documento XML in una stringa JSON. Pertanto, come mostrato nella sezione precedente, dobbiamo estrarre i dati XML e trasferirli in un hash di PowerShell come formato intermedio.

Costruiamo l’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)

Abbiamo estratto i due oggetti dipendenti dall’XML per scopi dimostrativi e trasferito quei dati in due oggetti hash, $empObjHash1 e $empObjHash2. Poi, il $finalHash è stato creato combinando i due oggetti dipendenti.

Se stampiamo il $finalHash, apparirebbe come segue.

Estrai oggetti da XML a oggetti hash

Possiamo utilizzare il ciclo foreach per ispezionare il $finalHash in maggiore dettaglio.

Codice:

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

Output:

Usa il ciclo foreach per ispezionare il $finalHash in dettaglio

Il $finalHash è stato costruito con i dati pertinenti estratti dall’XML.

Convertire l’Hash in JSON

Poiché abbiamo un hash di PowerShell $finalHash, è possibile utilizzare il cmdlet ConvertTo-Json per creare un JSON dall’hash.

Sintassi:

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

Passiamo l’hash creato $finalHash per generare la stringa JSON, come mostrato di seguito.

Codice:

$finalHash | ConvertTo-Json

Output:

Converti Hash in JSON

Script completo di 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

Utilizzando i Cmdlets ConvertTo-Json e ConvertFrom-Xml per Convertire XML in JSON in PowerShell

In PowerShell, convertire dati da XML a formato JSON è un requisito comune, in particolare quando si interagisce con API web o servizi web moderni. PowerShell semplifica questo compito con i suoi cmdlets ConvertTo-Json e ConvertFrom-Xml.

Sintassi:

  • Get-Content: Legge il contenuto di un file.

    • -Path <String>: Specifica il percorso del file.
  • ConvertTo-Json: Converte un oggetto in una stringa formattata JSON.

    • -InputObject <Object>: Specifica l’oggetto da convertire.
    • -Depth <Int32>: Specifica la profondità delle gerarchie degli oggetti da includere.

Esempio

# 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

Nel nostro script, prima specifichiamo il percorso del file XML utilizzando la variabile $xmlFilePath. Utilizzando Get-Content, leggiamo il contenuto di questo file nella variabile $xmlContent.

Questo contenuto viene poi castato in un tipo [xml], creando un oggetto XML strutturato ($xmlObject). Questo oggetto viene passato a ConvertTo-Json per eseguire la conversione in formato JSON.

Infine, utilizziamo Write-Output per stampare la stringa JSON.

Output:

powershell convertire xml in json - output

Conclusione

In conclusione, questa guida ha dimostrato con successo i metodi pratici ed efficienti per convertire documenti XML in stringhe JSON utilizzando PowerShell. Mostrando due approcci distinti - uno che coinvolge l’estrazione dei dati XML in un hash di PowerShell e l’altro che utilizza il cmdlet ConvertFrom-Xml - la guida offre opzioni versatili adatte a diverse esigenze e scenari degli utenti.

Le istruzioni passo-passo, insieme ai frammenti di codice pertinenti e agli output, consentono ai lettori di afferrare prontamente il concetto e applicare questi metodi in situazioni del mondo reale. La flessibilità e la potenza di PowerShell nella gestione e trasformazione dei formati di dati sono evidenti, rendendolo uno strumento indispensabile per amministratori e sviluppatori che si occupano di trasformazioni di dati XML e JSON.