При конвертации из XML в JSON с помощью PowerShell получаю пустые значения, как исправить?

Исходный XML:
<?xml version="1.0" encoding="utf-8"?>
<Data>
  <Card>
    <Id>123</Id>
    <CreateDate>2022-06-20T21:01:32.7727011+05:00</CreateDate>
    <CardData>
      <Id>456</Id>
      <Value>789</Value>
      <Ord>0</Ord>
    </CardData>
  </Card>
</Data>

Код PowerShell:
$Content = Get-Content $File 
$Object = [XML]$Content
$Object | ConvertTo-Json -Depth 5

Результат:
[
    [

    ],
    [
        [
            [
                [

                ]
            ],
            [
                [

                ]
            ],
            [
                [
                    [

                    ]
                ],
                [
                    [

                    ]
                ],
                [
                    [

                    ]
                ]
            ]
        ]
    ]
]

При этом если смотреть сам объект, до преобразования в JSON, то он вроде корректный:
62b55f44c382c584617963.png

Пожалуйста, подскажите, что не так? Как это исправить?
В интернете находил ещё такие функции конверта в JSON, но они не работают или работают также:
1
function ConvertFrom-Xml {param([System.Xml.XmlElement]$Object)
	if (($Object -ne $null) -and ($Object.Property -ne $null)) {
		$PSObject = New-Object PSObject
		foreach ($Property in @($Object.Property)) {
			if ($Property.Property.Name -like 'Property') {
				$PSObject | Add-Member NoteProperty $Property.Name ($Property.Property | % {ConvertFrom-Xml $_})
			} else {
				if ($Property.'#text' -ne $null) {
					$PSObject | Add-Member NoteProperty $Property.Name $Property.'#text'
				} else {
					if ($Property.Name -ne $null) {
						$PSObject | Add-Member NoteProperty $Property.Name (ConvertFrom-Xml $Property)
					}
				}
			} 
		}   
		$PSObject
	}
}
ConvertFrom-Xml ([xml]($Content)).Objects.Object | ConvertTo-Json -Depth 5

2
function ConvertFrom-Xml {
  param([parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode] $node)
  process {
    if ($node.DocumentElement) { $node = $node.DocumentElement }
    $oht = [ordered] @{}
    $name = $node.Name
    if ($node.FirstChild -is [system.xml.xmltext]) {
      $oht.$name = $node.FirstChild.InnerText
    } else {
      $oht.$name = New-Object System.Collections.ArrayList 
      foreach ($child in $node.ChildNodes) {
        $null = $oht.$name.Add((ConvertFrom-Xml $child))
      }
    }
    $oht
  }
}
$Object = [XML]$Content
$Object | ConvertFrom-XML | ConvertTo-JSON -Depth 5
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
@MaxKozlov
Вторая функция рабочая вполне. надо только названия поправить и бОльшую вложенность использовать. у вас там микс из ConvertFrom-Xml и ConvertFrom-Xml2

PS D:\> $s = '<?xml version="1.0" encoding="utf-8"?>
>> <Data>
>>   <Card>
>>     <Id>123</Id>
>>     <CreateDate>2022-06-20T21:01:32.7727011+05:00</CreateDate>
>>     <CardData>
>>       <Id>456</Id>
>>       <Value>789</Value>
>>       <Ord>0</Ord>
>>     </CardData>
>>   </Card>
>> </Data>'
PS D:\> $xml = [xml]$s
PS D:\> function ConvertFrom-Xml2 {
>>   param([parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode] $node)
>>   process {
>>     if ($node.DocumentElement) { $node = $node.DocumentElement }
>>     $oht = [ordered] @{}
>>     $name = $node.Name
>>     if ($node.FirstChild -is [system.xml.xmltext]) {
>>       $oht.$name = $node.FirstChild.InnerText
>>     } else {
>>       $oht.$name = New-Object System.Collections.ArrayList
>>       foreach ($child in $node.ChildNodes) {
>>         $null = $oht.$name.Add((ConvertFrom-Xml2 $child))
>>       }
>>     }
>>     $oht
>>   }
>> }
PS D:\> $xml | ConvertFrom-Xml2 | ConvertTo-Json -Depth 10
{
    "Data":  [
                 {
                     "Card":  [
                                  {
                                      "Id":  "123"
                                  },
                                  {
                                      "CreateDate":  "2022-06-20T21:01:32.7727011+05:00"
                                  },
                                  {
                                      "CardData":  [
                                                       {
                                                           "Id":  "456"
                                                       },
                                                       {
                                                           "Value":  "789"
                                                       },
                                                       {
                                                           "Ord":  "0"
                                                       }
                                                   ]
                                  }
                              ]
                 }
             ]
}


А вообще это всё потому что $xml - это не чистый PS объект, а XmlDocument
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы