2016-01-18 2 views
3

У меня есть документ XML в этом форматеКак группировать XML в JSON

<rss> 
    <channel> 
    <item> 
     <id>1</id> 
     <image>img_32.jpeg</image> 
    </item> 
    <item> 
     <id>2</id> 
     <image>img_42.jpeg</image> 
    </item> 
    <item> 
     <id>1</id> 
     <image>img_52.jpeg</image> 
    </item> 
    <item> 
     <id>3</id> 
     <image>img_62.jpeg</image> 
    </item> 
    <item> 
     <id>4</id> 
     <image>img_72.jpeg</image> 
    </item> 
    </channel> 
</rss> 

Я группируя эти данные на ID узла, так что я получаю все изображения в списке для каждого идентификатора.

[xml]$xml = (New-Object System.Net.WebClient).DownloadString("https://myfeedurl.xml") 
$grouped = $xml.rss.channel.item | Group id 
$grouped 

Который возвращает

Count Name  Group 
----- ----  ----- 
    2 1   {item}{item} 
    1 2   {item} 
    1 3   {item} 
    1 4   {item}

Но я не могу понять, как использовать эту информацию, используя сгруппированных ConvertTo-Json для того, чтобы в конечном итоге с JSON в этом формате.

[ 
    { 
    "id": "1", 
    "images": [ 
     { 
     "image": "img_32.jpeg" 
     }, 
     { 
     "image": "img_52.jpeg" 
     } 
    ] 
    }, 
    { 
    "id": "2", 
    "images": [ 
     { 
     "image": "img_42.jpeg" 
     } 
    ] 
    }, 
    etc... 
] 

ответ

1

Я могу получить его только путем итерации через узлы и создания некоторых пользовательских объектов. Пользовательские объекты необходимы для получения имени тега так, как вы хотите. Может быть более элегантный способ итерации/проверки, но это работает.

[xml]$xml = "<rss> 
    <channel> 
    <item> 
     <id>1</id> 
     <image>img_32.jpeg</image> 
    </item> 
    <item> 
     <id>2</id> 
     <image>img_42.jpeg</image> 
    </item> 
    <item> 
     <id>1</id> 
     <image>img_52.jpeg</image> 
    </item> 
    <item> 
     <id>3</id> 
     <image>img_62.jpeg</image> 
    </item> 
    <item> 
     <id>4</id> 
     <image>img_72.jpeg</image> 
    </item> 
    </channel> 
</rss>" 

$ht = @{} 
$xml.rss.channel.item | Foreach { 
    $obj = New-Object psobject 
    $obj | Add-Member NoteProperty -Name 'id' -Value $_.id   
    $img = New-Object psobject 
    $img | Add-Member NoteProperty -Name 'image' -Value $_.image 
    $imgarr = @($img) 
    if ($ht.ContainsKey($_.id)) 
    { 
     $imgarr += $ht[$_.id].images # + $img 
    } 
    $obj | Add-Member NoteProperty -Name 'images' -Value $imgarr 
    $ht[$_.id] = $obj  
} 

ConvertTo-Json $ht.Values -Depth 3 

выход:

[ 
    { 
     "id": "2", 
     "images": [ 
         { 
          "image": "img_42.jpeg" 
         } 
        ] 
    }, 
    { 
     "id": "4", 
     "images": [ 
         { 
          "image": "img_72.jpeg" 
         } 
        ] 
    }, 
    { 
     "id": "1", 
     "images": [ 
         { 
          "image": "img_52.jpeg" 
         }, 
         { 
          "image": "img_32.jpeg" 
         } 
        ] 
    }, 
    { 
     "id": "3", 
     "images": [ 
         { 
          "image": "img_62.jpeg" 
         } 
        ] 
    } 
]