【问题标题】:Converting Multiple json files to xml files将多个 json 文件转换为 xml 文件
【发布时间】:2019-03-21 10:49:44
【问题描述】:

我是一个相对较新的程序员,因此知识有限;但是,我被要求创建一个程序来将大量 json 文件转换为 xml 文件。它们有很多,而且它们在内容方面都不同(我不知道它们到底是什么)。

我试过下面的代码

static void ProcessFiles(string path)
    {
        string[] files;
        string[] directories;

        XmlDocument xml = new XmlDocument();
        files = Directory.GetFiles(path);
        foreach (string file in files)
        {
            using (StreamReader r = new StreamReader(file))
            {
                string j = r.ReadToEnd();
                string json = JsonConvert.DeserializeObject(j).ToString();
                xml = JsonConvert.DeserializeXmlNode(json);

                Console.Write(xml);
            }
        }

        directories = Directory.GetDirectories(path);
        foreach(string directory in directories)
        {                
            ProcessFiles(directory);
        }
    }

我设法将它作为我的字符串“json”,然后得到一个错误。

    [
  {
    "Start": "date",
    "Finish": "date",
    "Subject": "",
    "Comments": "",
    "Site": "address",
    "Location": null,
    "Status": false,
    "Arrived": true,
    "Noshow": false,
    "Services": "Initial Consultation",
    "Attendees": [
      {
        "AccountId": 1111,
        "AccountType": "MP",
        "Name": "MMS (FP), Support "
      },
      {
        "AccountId": 2220915,
        "AccountType": "PA",
        "Name": "Test, Patient "
      }
    ]
  },
]

我一直在网上寻找解决方案,但到目前为止还没有运气。有人可以帮忙吗?

【问题讨论】:

  • LoadXml() 方法要求输入是 XML。现在,您正在使用 json 并创建一个不是 xml 的对象,然后尝试将其解析为 xml。您需要将反序列化 json 并转换为 xml。
  • 将文件转换为“任何旧的 XML”是没有意义的;必须有人知道谁将使用 XML,并且该消费者将对预期的 XML 词汇表/模式有特定的要求。因此,这里有一个要求是您缺少的,它对您如何处理转换具有根本性的影响。
  • 消费者是我。我需要将文件“按原样”从 json 转换为 xml,这样我就可以做其他事情了。

标签: c# json xml file


【解决方案1】:

你已经接近你的目标了,

所以现在你正在这样做,

  1. ReadToEndStreamReader读取字符串json
  2. 然后反序列化为dynamic变量。
  3. 然后加载到xml中。

但在第 3 点,您尝试将 json 字符串传递给 LoadXml 方法,其中 LoadXml 想要 xml 字符串作为输入。

到目前为止,newtonsoft 有一种方法可以直接将您的 json 转换为 xml

XmlDocument xdoc = JsonConvert.DeserializeXmlNode(json);

所以现在你的代码看起来像,

//Your code as it is

using (StreamReader r = new StreamReader(file))
{
    string json = r.ReadToEnd();
    xdoc = JsonConvert.DeserializeXmlNode(json);

    xdoc.Save(file + ".xml");
}

//Your code as it is

【讨论】:

  • 感谢您回到我身边。我现在收到此错误:“Newtonsoft.Json.JsonSerializationException:'JSON 根对象具有多个属性。根对象必须具有单个属性才能创建有效的 XML 文档。考虑指定 DeserializeRootElementName。路径“名称”,第 1 行,第 29 位。'"
  • 是的,这是因为您的 json 在根目录中有多个属性,而 DeserializeXmlNode 使用单个根属性。让我根据您的需要更新我的答案
  • 如果您不知道它们是什么,如何让它与多个属性一起使用?
【解决方案2】:

在我看来你只需要这个:

static void ProcessFiles(string path)
{
    foreach (string file in Directory.GetFiles(path))
    {
        JsonConvert.DeserializeXmlNode(File.ReadAllText(file)).Save(file + ".xml");
    }

    foreach (string directory in Directory.GetDirectories(path))
    {
        ProcessFiles(directory);
    }
}

【讨论】:

  • 感谢您回到我身边。我现在收到此错误:“Newtonsoft.Json.JsonSerializationException:'JSON 根对象具有多个属性。根对象必须具有单个属性才能创建有效的 XML 文档。考虑指定 DeserializeRootElementName。路径“名称”,第 1 行,第 29 位。'"
  • @SamBoniface - 您可能需要发布要转换的 JSON 文件的示例。
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 2014-10-26
  • 2017-06-18
  • 2023-03-09
  • 2018-11-14
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
相关资源
最近更新 更多