【问题标题】:Convert multiple XMLs to JSON list将多个 XML 转换为 JSON 列表
【发布时间】:2018-05-01 05:44:48
【问题描述】:

我想使用 PowerShell 脚本将具有相同 XML 属性格式的多个 XML 文件转换为 JSON 文件。这个想法是创建一个 JSON 列表,其中每个项目都是 XML 文件的 JSON 表示。可行吗?输入输出示例:

输入:

File1.xml:

<File>
<Child1> First xml child 1</Child1>
<Child2>First xml child 2</Child2>
</File>

File2.xml:

<File>
<Child1> Second xml child 1</Child1>
<Child2>Second xml child 2</Child2>
</File>

输出:

[
  {
    File: [
      {Child1 : First xml child 1 },
      { Child2: First xml child 2}
    ]
  },
  {
    File: [
      {Child1 : Second xml child 1 },
      { Child2: Second xml child 2}
    ]
  }
]

【问题讨论】:

  • “可行吗?” 当然可以。但是 SO 不是其他人为您编写代码的地方。到目前为止,您尝试了什么(显示您的代码),您需要帮助解决什么具体问题(在您的代码中)?
  • 请允许我给你一个标准的建议给新手:如果一个答案解决了你的问题,请点击它旁边的大复选标记 (✓) 接受它,也可以选择给它投票(up - 投票需要至少 15 个声望点)。如果您发现其他答案有帮助,请给他们投票。接受(您将获得 2 个声望点)和投票可以帮助未来的读者。请参阅this FAQ 了解更多信息。

标签: c# json xml powershell


【解决方案1】:

在 Powershell 7 中,这对我有用:

get-content file.xml

<node>
  <subnode attrib="this">hi</subnode>
</node>


[xml]$xml = get-content file.xml                             

[Newtonsoft.Json.JsonConvert]::SerializeXmlNode($xml)

{"node":{"subnode":{"@attrib":"this","#text":"hi"}}}

【讨论】:

  • 绝对是一个值得考虑的替代方案,尽管(默认情况下)在 Windows PowerShell 中不可用(PowerShell 版本最高为 v5.1);在手头的情况下,它会创建与问题中要求的不同的表示。
【解决方案2】:

以下使用辅助函数 ConvertFrom-Xml仅非常简单的 XML 文档(例如您的示例文档)转换为带有有序键的嵌套哈希表,然后可以使用 @987654322 将其转换为 JSON @:

# Helper function that converts a *simple* XML document to a nested hashtable
# with ordered keys.
function ConvertFrom-Xml {
  param([parameter(Mandatory, ValueFromPipeline)] [System.Xml.XmlNode] $node)
  process {
    if ($node.DocumentElement) { $node = $node.DocumentElement }
    $oht = [ordered] @{}
    $name = $node.Name
    if ($node.FirstChild -is [system.xml.xmltext]) {
      $oht.$name = $node.FirstChild.InnerText
    } else {
      $oht.$name = New-Object System.Collections.ArrayList 
      foreach ($child in $node.ChildNodes) {
        $null = $oht.$name.Add((ConvertFrom-Xml $child))
      }
    }
    $oht
  }
}

[xml[]] (Get-Content -Raw file[12].xml) | ConvertFrom-Xml | ConvertTo-Json -Depth 3

使用您的示例文件,这会产生:

[
    {
        "File":  [
                     {
                         "Child1":  " First xml child 1"
                     },
                     {
                         "Child2":  "First xml child 2"
                     }
                 ]
    },
    {
        "File":  [
                     {
                         "Child1":  " Second xml child 1"
                     },
                     {
                         "Child2":  "Second xml child 2"
                     }
                 ]
    }
]

【讨论】:

    【解决方案3】:

    在此顶部编写您自己的格式

    // To convert an XML node contained in string xml into a JSON string   
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string jsonText = JsonConvert.SerializeXmlNode(doc);
    

    【讨论】:

    • 或者使用内置的JavaScriptSerializer不依赖外部包,在PowerShell中可能会变得棘手
    • 简单迷人。我不确定为什么 OP 在他们的问题中添加了 C# 标签,但从问题文本中可以清楚地看出他们想要一个 PowerShell 脚本。那么,如何将其转换为 PowerShell 脚本呢?什么是完整的类型名称,所有类型都预装了,还是需要下载依赖,...?
    • @mklement0 [Newtonsoft.Json.JsonConvert]::SerializeXmlNode($xml)
    • 谢谢,@js2010。我的评论旨在鼓励 SGRao 更新他们的答案以提供此类信息。请注意,NewtonSoft.Json 程序集不随 Windows PowerShell 提供(它随 PowerShell [Core] 提供)。我鼓励您发布自己的答案,其中显示完整的 PowerShell 示例和有关程序集可用性/如何获取它的背景信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多