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

6
需要帮忙将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文件。 非常感谢,如果有人能帮助我。

1个回答

23

XML相关内容

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")

或者以更 Powershell 的方式来做,你可以使用 Select-Xml 命令:

$xmlObject | Select-Xml "//these"

因为你只需要找到信息并将其组合在一起,所以我会省略掉许多其他东西,特别是操作方面。

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

该值可以是数组、对象、另一个哈希等。

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

REST

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

如何进行

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

$mySpecialHash | ConvertTo-JSON

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

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

参考文献

XML

JSON

REST


这个答案确实帮助我完成了任务,因此将其接受为答案。 - bluelabel
转换为XML与导入CLI XML有何不同? - Nicholas Saunders
@NicholasSaunders Import-CliXmlExport-CliXml 的对应命令。CLIXML 是 PowerShell 用于序列化和反序列化对象的特定格式。文档页面最好地解释了它:“此 cmdlet 类似于 Export-Clixml,不同之处在于 Export-Clixml 将生成的 XML 存储在可作为对象重新导入的公共语言基础结构 (CLI) XML 文件中,而 Import-Clixml 则将其导入。ConvertTo-Xml 返回 XML 文档的内存表示形式,因此您可以继续在 PowerShell 中处理它。ConvertTo-Xml 没有将对象转换为 CLI XML 的选项。` - briantist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接