Преобразование 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 об этом фрагменте.