Konvertieren Sie XML in PowerShell in JSON
- Greifen Sie auf Schlüssel und Werte von XML-Dokumenten zu
- Erstellen Sie einen PowerShell-Hash zum Speichern von Daten
- Konvertieren Sie Hash 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.
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.
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:
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:
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
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.