使用PowerShell将XML转换为特定的JSON结构

blu*_*bel 4 xml powershell json

需要帮助将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>
Run Code Online (Sandbox Code Playgroud)

可以有上述格式的一个或多个文件,我的要求是读取所有这些文件并按所有者分组,并通过将这些对象转换为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"                   
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

}

这需要使用windows powershell完成,Iam是一个java人,并且不知道如何使用powershell,除了调用远程ftp服务器和读取所有xml文件.真的很感激,如果有人可以帮助我.

bri*_*ist 13

XML东西

Powershell有一些用于处理XML的东西.首先,它具有本机[XML]数据类型.您可以将字符串转换为XML,如下所示:

$someXml = '...' # pretend there's XML in there!
$xmlObject = [XML]$someXml
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用XML对象

获得对象后,可以将节点作为属性访问:

$xmlObject.SomeNode.SomeChild
Run Code Online (Sandbox Code Playgroud)

您还可以使用XPATH选择单个节点或多个节点:

$xmlObject.SelectSingleNode("//this[1]")
$xmlObject.SelectNodes("//these")
Run Code Online (Sandbox Code Playgroud)

或者以更多Select-XmlPowerShell 方式执行此操作,您可以使用cmdlet:

$xmlObject | Select-Xml "//these"
Run Code Online (Sandbox Code Playgroud)

我遗漏了很多其他的东西,特别是操作,因为你似乎只需要找到信息并将它们组合在一起.

JSON东西

在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
Run Code Online (Sandbox Code Playgroud)

值可以是数组,对象,另一个哈希等.

$complex = @{
    ThisThing = @{
        Key1 = 'val1'
        Key2 = 5
    } 
}
Run Code Online (Sandbox Code Playgroud)

休息

Invoke-RestMethod 是在Powershell中进行REST调用的最简单方法(需要3.0+版本).

如何进行

一旦您能够从XML解析信息,构建包含所需结构的嵌套哈希或哈希数组,然后将其转换为JSON:

$mySpecialHash | ConvertTo-JSON
Run Code Online (Sandbox Code Playgroud)

请特别注意如何在生成的JSON中表示数组和哈希,并且可能会更改构建它们的方式以获得所需的输出.

如果您对特定方法或代码片段有特定问题,请在SO上发布有关该片段的具体问题.

参考

XML

JSON

休息