【问题标题】:Converting XML file into a specific JSON format将 XML 文件转换为特定的 JSON 格式
【发布时间】:2021-02-04 09:21:47
【问题描述】:

我有一个类似这样的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="application" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Parameter1" Value="test1" />
    <Parameter Name="parameter2" Value="test2" />
    <Parameter Name="parameter3" Value="test3" />
    <Parameter Name="parameter4" Value="test4" />
  </Parameters>
</Application>

我正在使用哈希表将其转换为 JSON,但是当我这样做时,我只得到参数部分:

{
    "PARAMETER_1":  "Test",
    "parameter2" :  "test2" 

我正在像这样读取 xml 文件,因为如果我尝试将其读取为 $appParametersXml 则会出现错误。

$appParametersHashTable = Read-XmlElementAsHashtable $appParametersXml.Application.Parameters

$appParametersHashTable |ConvertTo-Json |Out-File "C:\Workspaces\ARMTemplates\GhostDraftApplication\ARMTemplate\CloudAXF.json"
#$appParametersHashTable|ConvertFrom-Xml|Out-File "C:\Workspaces\ARMTemplates\GhostDraftApplication\ARMTemplate\CloudTest.xml"

$appParametersXml | ConvertFrom-Xml | ConvertTo-Json -Depth 4 | Out-File "C:\Workspaces\ARMTemplates\GhostDraftApplication\ARMTemplate\CloudAXF.json"

$xmlObject = $appParametersXml | ConvertTo-Xml


###############################################################################
function Read-XmlElementAsHashtable
{
    Param (
        [System.Xml.XmlElement]
        $Element
    )

    $hashtable = @{}
    if ($Element.ChildNodes)
    {
        $Element.ChildNodes | 
            ForEach-Object {
                    $hashtable["Name" + $_.Name] = "Value" + $_.Value
            }
    }

    return $hashtable
}

有没有办法从 xml 文件中读取所有标签和属性,并将它们转换为 JSON,使其看起来像这样?

"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "PARAMETER_1": {
        "value": "Test"
    },

我刚刚在旋转我的轮子。

【问题讨论】:

  • 对不起,我的 xml 文件没有正确发布:它看起来像这样:w3.org/2001/XMLSchema-instance" Name="Test" xmlns="schemas.microsoft.com/2011/01/fabric">
  • 我为您修复了代码围栏(它是三个反引号,而不是三个单引号),请问您可以update the post 提供一个完整且有效的 XML 文档吗?
  • 谢谢!我已经用 xml 文档更新了帖子

标签: json xml powershell


【解决方案1】:

如果您可以硬编码要从 Parameter XML 元素中提取的属性,则可以执行以下操作:

# Sample XML input.
[xml] $xmlDoc = @'
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="application" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Parameter1" Value="test1" />
    <Parameter Name="parameter2" Value="test2" />
    <Parameter Name="parameter3" Value="test3" />
    <Parameter Name="parameter4" Value="test4" />
  </Parameters>
</Application>
'@ 
  
# Transform the "Parameter" elements into a nested hashtable.
$hash = [ordered] @{}
$xmlDoc.Application.Parameters.ChildNodes | % {
  $hash[$_.Name] = @{ value = $_.Value }
}

# Wrap the hashtable in a top-level hashtable and convert to JSON.
[ordered] @{
  '$schema' = 'https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#'
  contentVersion ='1.0.0.0'
  parameters = $hash
} | ConvertTo-Json

以上产出:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "Parameter1": {
      "value": "test1"
    },
    "parameter2": {
      "value": "test2"
    },
    "parameter3": {
      "value": "test3"
    },
    "parameter4": {
      "value": "test4"
    }
  }
}

注意:如果您还想在转换为 JSON 之前对 XML 输入执行类型转换,请参阅this answer 到一个密切相关的问题。

【讨论】:

  • 我已将您的其他问题的链接添加到答案中,以防人们在寻找类型转换的同时先到达这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 2019-05-28
  • 2016-11-06
  • 2011-07-04
  • 2020-08-05
  • 1970-01-01
相关资源
最近更新 更多