Konvertieren Sie XML in PowerShell in JSON

  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
Genießen Sie unsere Tutorials? Abonnieren Sie DelftStack auf YouTube, um uns bei der Erstellung weiterer hochwertiger Videoanleitungen zu unterstützen. Abonnieren
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.