首页 > 解决方案 > 使用 Powershell 将 XML 转换为 JSON

问题描述

我正在尝试将 xml 文件转换为 json 以进行进一步处理。这实际上是我第一次使用 powershell,所以我需要一些帮助。

我得到一个具有这种结构的 xml 文件:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="https://www.something..."?>
<tabela>
    <naslov>Robno knjigovodstvo - pregled automatskog stanja zaliha artikala</naslov>
    <dataset>qu1RobaZalihe</dataset>
    <datum_kreiranja>12.02.2021</datum_kreiranja>
    <zaglavlje><sifra>Šifra</sifra><naziv>Naziv</naziv><katbroj>Kataloški broj</katbroj><cfJedmj>JedMj</cfJedmj><stanje>Stanje</stanje><cijena>Nabavna cijena</cijena><datum>Datum dokumenta</datum></zaglavlje>
    <redovi>
            <red>
            <sifra>1</sifra>
            <naziv>CORE HIT</naziv>
            <katbroj>A4B0000006606</katbroj>
            <cfJedmj>KOM</cfJedmj>
            <stanje>1</stanje>
            <cijena>100,00</cijena>
            <datum>01.01.2021</datum>
        </red>
        <red>
            <sifra>2</sifra>
            <naziv>CORE HIT</naziv>
            <katbroj>A4B0000008340</katbroj>
            <cfJedmj>KOM</cfJedmj>
            <stanje>8</stanje>
            <cijena>100,00</cijena>
            <datum>01.01.2021</datum>
        </red>
        ...
    </redovi>
</tabela>

我需要像这样用逗号分隔一组对象:

    [
    {
        "sifra":  "1",
        "naziv":  "CORE HIT 7050",
        "jed_mj":  "KOM",
        "kolicina":  "1",
        "skladiste":  "1",
        "pn":  "TNX:A4B0000006606"
    },
    {
        "sifra":  "2",
        "naziv":  "CORE HIT 7020",
        "jed_mj":  "KOM",
        "kolicina":  "8",
        "skladiste":  "1",
        "pn":  "TNX:A4B0000008340"
    },
    {
        "sifra":  "3",
        "naziv":  "SYSTEM SW LICENCE AND CD-ROM",
        "jed_mj":  "KOM",
        "kolicina":  "1",
        "skladiste":  "1",
        "pn":  "TNX:A4B0000007760"
    },
    ...
]

...但相反,我只得到这样的对象:

    {
    "sifra":  "1",
    "naziv":  "CORE HIT 7050",
    "pn":  "TNX:A4B0000006606",
    "jed_mj":  "KOM",
    "kolicina":  "1",
    "skladiste":  "1"
}
{
    "sifra":  "2",
    "naziv":  "CORE HIT 7020",
    "pn":  "TNX:A4B0000008340",
    "jed_mj":  "KOM",
    "kolicina":  "8",
    "skladiste":  "1"
}
{
    "sifra":  "3",
    "naziv":  "SYSTEM SW LICENCE AND CD-ROM",
    "pn":  "TNX:A4B0000007760",
    "jed_mj":  "KOM",
    "kolicina":  "1",
    "skladiste":  "1"
}

到目前为止,我设法弄清楚了一些事情,但不是全部:) 我用来得到这个的代码如下:

[xml]$xml = Get-Content xml-skladiste.XML

foreach ($atr in $xml.tabela.redovi.red)
{
        $prop = [ordered]@{
        'sifra'    = $atr.sifra
        'naziv'    = $atr.naziv
        'pn'    = $atr.katbroj
        'jed_mj'    = $atr.cfJedmj
        'kolicina'    = $atr.stanje
        'skladiste' = "1"
    }
    New-Object -Type PSCustomObject -Property $prop | ConvertTo-Json | Add-Content -Path "output.json"
}

为了获得理想的结构,我必须添加什么?

标签: jsonxmlpowershell

解决方案


您当前正在创建多个 JSON 文档,数组的每个元素一个$xml.tabela.redovi.red,并在一个文件中连接在一起。

跳出ConvertTo-Json循环来解决问题。通过这种方式,您可以将数据的创建与转换为 JSON 分开,从而ConvertTo-JSON可以对完整的数据结构进行操作。

[xml]$xml = Get-Content xml-skladiste.XML

$array = foreach ($atr in $xml.tabela.redovi.red)
{
    $prop = [ordered]@{
        'sifra'    = $atr.sifra
        'naziv'    = $atr.naziv
        'pn'    = $atr.katbroj
        'jed_mj'    = $atr.cfJedmj
        'kolicina'    = $atr.stanje
        'skladiste' = "1"
    }
    New-Object -Type PSCustomObject -Property $prop
}

$array | ConvertTo-Json | Set-Content -Path "output.json"

解释:

  • $array = foreach ...在变量中捕获foreach循环的输出$array,自动创建一个数组。
  • New-Object ...产生被捕获的输出。Write-Output请注意,由于 PowerShell 的隐式输出行为,我们不必使用(阅读有关它的更多信息)。
  • $array | ConvertTo-Json ...将整个数组传递给单个调用,ConvertTo-Json最后将其写入输出文件。

推荐阅读