Konvertieren einer XML-Datei in ein bestimmtes JSON-Format

Oct 21 2020

Ich habe eine XML-Datei, die so aussieht

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="application" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Parameter1" Value="test1" />
    <Parameter Name="parameter2" Value="test2" />
    <Parameter Name="parameter3" Value="test3" />
    <Parameter Name="parameter4" Value="test4" />
  </Parameters>
</Application>

Ich verwende eine Hashtabelle, um dies in JSON zu konvertieren, aber wenn ich dies tue, erhalte ich nur den Teil Parameter:

{
    "PARAMETER_1":  "Test",
    "parameter2" :  "test2" 

Ich lese die XML-Datei so, denn wenn ich versuche, sie als $ appParametersXml zu lesen, erhalte ich eine Fehlermeldung.

$appParametersHashTable = Read-XmlElementAsHashtable $appParametersXml.Application.Parameters $appParametersHashTable |ConvertTo-Json |Out-File "C:\Workspaces\ARMTemplates\GhostDraftApplication\ARMTemplate\CloudAXF.json"
#$appParametersHashTable|ConvertFrom-Xml|Out-File "C:\Workspaces\ARMTemplates\GhostDraftApplication\ARMTemplate\CloudTest.xml" $appParametersXml | ConvertFrom-Xml | ConvertTo-Json -Depth 4 | Out-File "C:\Workspaces\ARMTemplates\GhostDraftApplication\ARMTemplate\CloudAXF.json"

$xmlObject = $appParametersXml | ConvertTo-Xml


###############################################################################
function Read-XmlElementAsHashtable
{
    Param (
        [System.Xml.XmlElement]
        $Element ) $hashtable = @{}
    if ($Element.ChildNodes) { $Element.ChildNodes | 
            ForEach-Object {
                    $hashtable["Name" + $_.Name] = "Value" + $_.Value } } return $hashtable
}

Gibt es eine Möglichkeit, alle Tags und Attribute aus der XML-Datei zu lesen und in JSON zu konvertieren, damit es so aussieht?

"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "PARAMETER_1": {
        "value": "Test"
    },

Ich habe gerade meine Räder gedreht.

Antworten

1 mklement0 Oct 21 2020 at 20:23

Wenn Sie fest codieren können, welche Attribute aus den ParameterXML-Elementen extrahiert werden sollen, können Sie Folgendes tun:

# Sample XML input.
[xml] $xmlDoc = @' <?xml version="1.0" encoding="utf-8"?> <Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="application" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="Parameter1" Value="test1" /> <Parameter Name="parameter2" Value="test2" /> <Parameter Name="parameter3" Value="test3" /> <Parameter Name="parameter4" Value="test4" /> </Parameters> </Application> '@ # Transform the "Parameter" elements into a nested hashtable. $hash = [ordered] @{}
$xmlDoc.Application.Parameters.ChildNodes | % { $hash[$_.Name] = @{ value = $_.Value }
}

# Wrap the hashtable in a top-level hashtable and convert to JSON.
[ordered] @{
  '$schema' = 'https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#' contentVersion ='1.0.0.0' parameters = $hash
} | ConvertTo-Json

Die obigen Ausbeuten:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "Parameter1": {
      "value": "test1"
    },
    "parameter2": {
      "value": "test2"
    },
    "parameter3": {
      "value": "test3"
    },
    "parameter4": {
      "value": "test4"
    }
  }
}

Hinweis: Wenn Sie vor der Konvertierung in JSON zusätzlich Typkonvertierungen für die XML-Eingabe durchführen möchten, lesen Sie diese Antwort auf eine eng verwandte Frage.