json - 使用 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"
}
为了获得理想的结构,我必须添加什么?
解决方案
您当前正在创建多个 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
最后将其写入输出文件。
推荐阅读
- performance - 如何加快这个多重匹配弹性搜索查询?
- typescript - 未捕获的 ReferenceError:未定义 updateDisplay - Typescript Calculator
- classification - weka中的通过/失败学校成绩二进制分类
- javascript - 删除一个类,然后将其添加回来会导致不同的显示
- swift - 使用视图模型与在视图本身中使用 @Binding 时如何使用绑定?
- reactjs - 反应使用上下文。无法解构“对象(...)(...)”的属性“currentChatbotInEdit”,因为它未定义。我该如何解决?
- java - 如何使用 Log4j 将日志消息计数发送到 Graphite?
- c# - StackLayout isVisible 参数永远不会从 Xamarin.Forms 中的绑定更新
- ruby-on-rails - Rails 简单表单按钮文本
- javascript - 重新定义的 toString 的 getOwnPropertyDescriptor 应该是未定义的