Преобразование XML в конкретную структуру JSON с powershell

Нужна помощь в преобразовании XML для определенной структуры JSON. XML будет выглядеть так,

<DataGrid> 
<DataRow>
    <RowID>1</RowID>
    <Date>26/10/2014</Date>
    <Owner>ABC Company</Owner>        
    <Make>Mitsubishi</Make>
    <Model_Family>Lancer</Model_Family>
    <Submodel>Lancer 2.0 GSR Hatch CVT</Submodel>
    <Origin/>
    <CC_Rating>1997</CC_Rating>
    <Weight>2000</Weight> 
</DataRow> 
<DataRow>
    <RowID>2</RowID>
    <Date>26/10/2014</Date>
    <Owner>ABC Company</Owner>        
    <Make>Mazda</Make>
    <Model_Family>Axela</Model_Family>
    <Submodel/>
    <Origin>Japan</Origin>
    <CC_Rating>1497</CC_Rating>
    <Weight/> 
</DataRow>
 <DataRow>
    <RowID>3</RowID>
    <Date>26/10/2014</Date>
    <Owner>Test Company</Owner>        
    <Make>Kia</Make>
    <Model_Family>Sorento</Model_Family>
    <Submodel/>
    <Origin>Korea</Origin>
    <CC_Rating>2200</CC_Rating>
    <Weight>2500<Weight> 
</DataRow>
<DataRow>
    <RowID>4</RowID>
    <Date>26/10/2014</Date>
    <Owner>Test Company</Owner>        
    <Make>Nissan</Make>
    <Model_Family>Pathfinder</Model_Family>
    <Submodel>SUV<Submodel>
    <Origin>Japan</Origin>
    <CC_Rating>2000</CC_Rating>
    <Weight>2000<Weight> 
</DataRow>

Может быть один или несколько файлов в вышеуказанном формате, мое требование состоит в том, чтобы прочитать все эти файлы и сгруппировать их по Owner и вызвать веб-сервис REST, преобразовав этот объект в JSON. Требуемый формат JSON будет следующим.

{
"batches": [
    {
        "Owner": "ABC Company",
        "Date": "2014-10-26",
        "Vehicles": [
            {                    
                "Make": "Mitsubishi",
                "ModelFamily": "Lancer",
                "SubModel": "Lancer 2.0 GSR Hatch CVT",
                "Origin": null
                "CcRating": "1997",
                "Weight": "2000"                    
            },
            {                   
                "Make": "Mazda",
                "ModelFamily": "Axela",
                "SubModel": null,
                "Origin": "Japan",
                "CcRating": "1497",
                "Weight": null                   
            }
        ]
    },
    {
        "Owner": "Test Company",
        "Date": "2014-10-26",
        "Vehicles": [
            {                   
                "Make": "Kia",
                "ModelFamily": "Sorento",
                "SubModel": null,
                "Origin": "Korea",
                "CcRating": "2200",
                "Weight": "2500"                  
            },
            {                    
                "Make": "Nissan",
                "ModelFamily": "Pathfinder",
                "SubModel": "SUV",
                "Origin": "Japan",
                "CcRating": "2000",
                "Weight": "2000"                   
            }
        ]
    }
]

}

Это нужно сделать с помощью Windows powershell, я являюсь Java-парнем и не знаю, как это сделать с помощью powershell, кроме вызова удаленного ftp-сервера и чтения всех XML-файлов. Очень ценю, если кто-то может мне помочь.

1 ответ

Решение

XML Stuff

У Powershell есть кое-что для работы с XML. Во-первых, у него есть родной [XML] тип данных. Вы можете привести строки к XML следующим образом:

$someXml = '...' # pretend there's XML in there!
$xmlObject = [XML]$someXml

ConvertTo-Xml Командлет принимает строку или другой объект и преобразует его в XML, как документ (объект XML), строку или поток (массив строк). Вы можете передать ему строку или объект:

Чтение из файла:

$xmlObject = [XML](Get-Content -Path C:\Path\to\my.xml)
$xmlObject = Get-Content -Path C:\Path\to\my.xml | ConvertTo-Xml

Работа с объектами XML

Получив свой объект, вы можете получить доступ к узлам в качестве свойств:

$xmlObject.SomeNode.SomeChild

Вы также можете использовать XPATH для выбора одного узла или нескольких узлов:

$xmlObject.SelectSingleNode("//this[1]")
$xmlObject.SelectNodes("//these")

Или, чтобы сделать это более мощным способом, вы можете использовать Select-Xml командлет:

$xmlObject | Select-Xml "//these"

Я упускаю много других вещей, особенно манипуляций, потому что кажется, что вам просто нужно найти информацию и сгруппировать ее.

JSON Stuff

В PowerShell не так много информации о JSON.

использование ConvertFrom-JSON преобразовать существующий JSON в объект и использовать ConvertTo-JSON преобразовать объект в строку JSON.

Hashtables

Иногда их называют хэшами или ассоциированными массивами, как я уверен, вы знаете. В Powershell вы используете их так:

$hash = @{
    Key1 = 'Value1'
    Key2 = 'Value2'
    Key3 = 10
}

# on one line:
$hash = @{ Key1='Val1';Key2='Val2' }

# adding pairs
$hash['NewKey'] = 'NewVal'
$hash.NewKey = 'NewVal'

# retrieving
$hash['NewKey']
$hash.NewKey

Значением может быть массив, объект, другой хеш и т. Д.

$complex = @{
    ThisThing = @{
        Key1 = 'val1'
        Key2 = 5
    } 
}

ОСТАЛЬНОЕ

Invoke-RestMethod это самый простой способ сделать вызовы REST в Powershell (требуется версия 3.0+).

Как действовать

Как только вы сможете проанализировать информацию из XML, создайте вложенный хеш или массив хешей, который содержит желаемую структуру, а затем преобразуйте ее в JSON:

$mySpecialHash | ConvertTo-JSON

Обратите особое внимание на то, как массивы и хэши представлены в результирующем JSON, и, возможно, измените способ их построения, чтобы получить желаемый результат.

Если у вас есть конкретные вопросы о конкретном методе или фрагменте кода, то опубликуйте конкретные вопросы на SO об этом фрагменте.

Рекомендации

XML

JSON

ОСТАЛЬНОЕ

Другие вопросы по тегам