以下是一个示例代码,它使用递归方法遍历XDocument中的嵌套类,并将其转换为JSON格式。
using System;
using System.Linq;
using System.Xml.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static class XDocumentExtensions
{
public static JToken ToJson(this XDocument document)
{
if (document == null)
throw new ArgumentNullException(nameof(document));
return document.Root.ToJson();
}
private static JToken ToJson(this XElement element)
{
if (element.HasElements)
{
var obj = new JObject();
foreach (var childElement in element.Elements())
{
if (element.Elements(childElement.Name).Count() > 1)
{
if (obj[childElement.Name.LocalName] == null)
obj[childElement.Name.LocalName] = new JArray();
((JArray)obj[childElement.Name.LocalName]).Add(childElement.ToJson());
}
else
{
obj[childElement.Name.LocalName] = childElement.ToJson();
}
}
return obj;
}
if (element.IsEmpty)
return null;
return new JValue(element.Value);
}
}
public class Program
{
public static void Main(string[] args)
{
var xml = @"
John
30
Main St.
City
Jane
25
Second St.
City
";
var document = XDocument.Parse(xml);
var json = document.ToJson().ToString();
Console.WriteLine(json);
}
}
这个示例中,我们使用了一个名为XDocumentExtensions
的静态类,它包含了一个ToJson
扩展方法。该方法接受一个XDocument对象,并首先调用根元素的ToJson
方法。在ToJson
方法中,我们首先检查元素是否有子元素。如果有,我们创建一个JObject对象,并遍历每个子元素。如果子元素有相同的名称,我们将它们添加到一个JArray中,然后添加到JObject中;否则,我们直接添加到JObject中。如果元素没有子元素,我们将其值作为JValue存储。
在Main方法中,我们使用XML字符串创建了一个XDocument对象,并将其转换为JSON格式。最后,我们输出JSON字符串到控制台。