Konvertieren Sie XML in PowerShell in JSON

Migel Hewage Nimesha 15 Februar 2024
  1. Greifen Sie auf Schlüssel und Werte von XML-Dokumenten zu
  2. Erstellen Sie einen PowerShell-Hash zum Speichern von Daten
  3. Konvertieren Sie Hash in JSON
Konvertieren Sie XML in PowerShell in JSON

PowerShell bietet verschiedene Cmdlets für die Arbeit mit JSON- und XML-Formaten. Dieser Leitfaden konzentriert sich auf die Konvertierung eines XML-Dokuments in eine Zeichenfolge im JSON-Format mithilfe von PowerShell.

Greifen Sie auf Schlüssel und Werte von XML-Dokumenten zu

PowerShell ermöglicht die Bearbeitung von XML-Dokumentknoten mit dem Select-Xml-Cmdlet. Wir können XPath-Ausdrücke angeben, um Knoten und ihre Textwerte in einem XML-Dokument zu finden.

Syntax:

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

Erstellen wir ein XML-Dokument namens employeeinfo.xml mit folgendem Inhalt.

XML - Mitarbeiterinfo.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>

Nun greifen wir mit dem Cmdlet Select-Xml wie folgt auf jeden XML-Knoten EmpId, EmpAge und EmpDesignation zu.

Code:

$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 diesem Beispiel ist der -Path der Ort, an dem sich die employeeinfo.xml befindet. Da wir drei Knoten pro Mitarbeiterobjekt abrufen müssen, wurde PowerShell foreach verwendet.

Der XPath-Ausdruck sieht für jeden Knoten wie folgt aus.

Auf den Knoten EmpID kann über die XPath-Abfrage "//Employee//EmpId" zugegriffen werden.

Auf den Knoten EmpAge kann über die XPath-Abfrage "//Employee//EmpIAge" zugegriffen werden.

Auf den Knoten EmpDesignation kann über die XPath-Abfrage "//Employee//EmpDesignation" zugegriffen werden.

Die Referenzvariablen $empIds, $empAges und $empDesigs enthalten Arrays von Werten für entsprechende XML-Knoten. Lassen Sie uns die Arrays in PowerShell-Konsolenfenster schreiben.

Schreiben Sie die Array-Werte für die jeweiligen XML-Knoten in das PowerShell-Konsolenfenster

Erstellen Sie einen PowerShell-Hash zum Speichern von Daten

Wir haben keinen einfachen Ansatz zum Konvertieren eines XML-Dokuments in einen JSON-String. Daher müssen wir, wie im obigen Abschnitt gezeigt, XML-Daten extrahieren und diese Daten als Zwischenformat in einen PowerShell-Hash übertragen.

Lassen Sie uns den Hash konstruieren.

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

Wir haben die beiden Mitarbeiterobjekte zu Demonstrationszwecken aus dem XML extrahiert und diese Daten in zwei Hash-Objekte $empObjHash1 und $empObjHash2 gepusht. Dann wird der $finalHash erzeugt, indem die beiden Mitarbeiter-Objekte gepusht werden.

Wenn wir den $finalHash drucken, würde es wie folgt aussehen.

Extrahieren Sie Objekte aus XML in Hash-Objekte

Wir können die foreach-Schleife verwenden, um den $finalHash genauer zu untersuchen.

Code:

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

Ausgang:

Verwenden Sie die foreach-Schleife, um den $finalHash im Detail zu untersuchen

Der $finalHash wurde mit den relevanten Daten konstruiert, die aus dem XML extrahiert wurden.

Konvertieren Sie Hash in JSON

Da wir einen PowerShell-Hash $finalHash haben, ist es möglich, das Cmdlet ConvertTo-Json zu verwenden, um aus dem Hash einen JSON zu erstellen.

Syntax:

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

Lassen Sie uns den erstellten Hash $finalHash übergeben, um den JSON-String wie im Folgenden gezeigt zu erstellen.

Code:

$finalHash | ConvertTo-Json

Ausgang:

Konvertieren Sie Hash in JSON

Vollständiges PowerShell-Skript:

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