需要有关将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>
可以有上述格式的一个或多个文件,我的要求是读取所有这些文件并按所有者分组,并通过将这些对象转换为JSON来调用REST Web服务。所需的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文件。 真的很感激,如果有人可以帮助我。
答案 0 :(得分:12)
Powershell有一些用于处理XML的东西。首先,它具有本机[XML]
数据类型。您可以像这样将字符串转换为XML:
$someXml = '...' # pretend there's XML in there!
$xmlObject = [XML]$someXml
ConvertTo-Xml
cmdlet接受字符串或其他对象并将其转换为XML,可以是Document(XML对象),字符串或流(字符串数组)。你可以传递一个字符串或一个对象:
$xmlObject = [XML](Get-Content -Path C:\Path\to\my.xml)
$xmlObject = Get-Content -Path C:\Path\to\my.xml | ConvertTo-Xml
获得对象后,可以将节点作为属性访问:
$xmlObject.SomeNode.SomeChild
您还可以使用XPATH选择单个节点或多个节点:
$xmlObject.SelectSingleNode("//this[1]")
$xmlObject.SelectNodes("//these")
或者以更强大的方式执行此操作,您可以使用Select-Xml
cmdlet:
$xmlObject | Select-Xml "//these"
我遗漏了很多其他的东西,特别是操纵,因为你似乎只需要找到信息并将它们组合在一起。
在powershell中关于JSON的知识不多。
使用ConvertFrom-JSON
将现有JSON转换为对象,并使用ConvertTo-JSON
将对象转换为JSON字符串。
有时会调用哈希或关联数组,因为我相信你已经知道了。在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
是在Powershell中进行REST调用的最简单方法(需要3.0 +版本)。
一旦你能够从XML解析信息,构建一个包含所需结构的嵌套哈希或哈希数组,然后将其转换为JSON:
$mySpecialHash | ConvertTo-JSON
特别注意如何在生成的JSON中表示数组和散列,并且可能会改变构建它们的方式以获得所需的输出。
如果您对特定方法或代码片段有具体问题,请在SO上发布有关该片段的具体问题。