C# Object to Json to Xml,如何为数组项生成xml元素

Posted

技术标签:

【中文标题】C# Object to Json to Xml,如何为数组项生成xml元素【英文标题】:C# Object to Json to Xml, how to generate xml element for array items 【发布时间】:2020-05-06 02:30:35 【问题描述】:

我先将一个对象转换为json,然后再将json转换为xml。我需要这样做来生成一些属性作为 xml 属性而不是元素。一切都按预期工作,只是我无法为每个项目生成单独的 xml 元素。

C#代码:

string json = JsonConvert.SerializeObject(myObj);
XmlDocument xdoc = JsonConvert.DeserializeXmlNode(json, "root");

生成的json:


  "header": "myheader",
  "transaction": 
    "date": "2019-09-24",
    "items": [
      
        "number": "123",
        "unit": "EA",
        "qty": 6
      ,
      
        "number": "456",
        "unit": "CS",
        "qty": 4
      
    ]
  

C# 类:

public class Item

    [JsonProperty("@number")]
    public string number  get; set; 
    [JsonProperty("@unit")]
    public string unit  get; set; 
    [JsonProperty("@qty")]
    public int qty  get; set; 


public class Transaction

    [JsonProperty("@date")]
    public string date  get; set; 
    public List<Item> items  get; set; 


public class Root

    public string header  get; set; 
    public Transaction transaction  get; set; 

生成的(不需要的)输出:

<root>
    <header>string</header>
    <transaction date="string">
        <items number="string" unit="string" qty="0"/>
        <items number="string" unit="string" qty="0"/>
    </transaction>
</root>

预期输出:

<root>
    <header>string</header>
    <transaction date="string">
        <items>
            <item number="string" unit="string" qty="0"/>
            <item number="string" unit="string" qty="0"/>
        </items>
    </transaction>
</root>

【问题讨论】:

我认为下面的讨论应该对你有所帮助。 ***.com/questions/38726166/… 它有帮助。它按预期工作。 【参考方案1】:

按照@Abhineet Chaudhary 推荐的link 上的说明进行操作。 它按预期工作。

var jObject = JObject.Parse(json);
jObject.SelectToken("transaction").SelectTokens("items").WrapWithObjects("item");
var finalXml = jObject.ToXElement("root", false);

public static class JsonExtensions

    public static void WrapWithObjects(this IEnumerable<JToken> values, string name)
    
        foreach (var value in values.ToList())
        
            var newParent = new JObject();
            if (value.Parent != null)
                value.Replace(newParent);
            newParent[name] = value;
        
    

    public static XElement ToXElement(this JObject obj, string deserializeRootElementName = null, bool writeArrayAttribute = false)
    
        if (obj == null)
            return null;
        using (var reader = obj.CreateReader())
            return JsonExtensions.DeserializeXElement(reader, deserializeRootElementName, writeArrayAttribute);
    

    static XElement DeserializeXElement(JsonReader reader, string deserializeRootElementName, bool writeArrayAttribute)
    
        var converter = new Newtonsoft.Json.Converters.XmlNodeConverter()  DeserializeRootElementName = deserializeRootElementName, WriteArrayAttribute = writeArrayAttribute ;
        var jsonSerializer = JsonSerializer.CreateDefault(new JsonSerializerSettings  Converters = new JsonConverter[]  converter  );
        return jsonSerializer.Deserialize<XElement>(reader);
    

【讨论】:

以上是关于C# Object to Json to Xml,如何为数组项生成xml元素的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中的 LINQ to JSON

xslt 3.0 json-to-xml 和 xml-to-json 转换

Java Object to JSON

object to 字符串json

C# linq to Xml(复习用)

Linq XML to Object,其中 xml 节点具有嵌套元素