代码之家  ›  专栏  ›  技术社区  ›  Psth

如何将JSON中的键值对更改为XML属性而不是节点

  •  1
  • Psth  · 技术社区  · 7 年前

    XNode node = JsonConvert.DeserializeXNode(kvp.ToString(), "root");

    但这给了我每个字段作为节点的XML。

    "ItemDetails": [ { "ItemNo": "0001", "Desc": "Office Supplies", "Note": "", "Units": "20" } ]

    我想把它改成下面的。将每个键作为属性,而不是XML节点

    <ItemDetails ItemNo="0001" Desc="Office Supplies" Note="" Units="20"/>

    1 回复  |  直到 7 年前
        1
  •  2
  •   Eric Herlitz    7 年前

    使用Newtonsoft时不需要开箱即用。相反,您必须创建包含所有节点的XML,然后将其重写,将所有节点移动到属性,并删除子节点。

    您可以使用这两种方法来实现这一点 XmlDocument XNode

    string json = @"{
        ""ItemDetails"": [
        {
            ""ItemNo"": ""0001"",
            ""Desc"": ""Office Supplies"",
            ""Note"": """",
            ""Units"": ""20""
        }
        ]}";
    
    XNode node = JsonConvert.DeserializeXNode(json, "root");
    
    // select all ItemDetails
    var itemDetails = node.XPathSelectElements("//ItemDetails");
    
    foreach (XElement item in itemDetails)
    {
        foreach (XNode childNode in item.Nodes().ToList())
        {
            // add attribute to node
            var element = childNode as XElement;
            item.SetAttributeValue(element.Name, element.Value);
    
            // remove the childnode
            element.Remove();
        }
    }
    
    Console.WriteLine(node.Document.ToString());
    

    试运行: https://dotnetfiddle.net/EVDwHN

    XmlDocument示例

    string json = @"{
        ""ItemDetails"": [
        {
            ""ItemNo"": ""0001"",
            ""Desc"": ""Office Supplies"",
            ""Note"": """",
            ""Units"": ""20""
        }
        ]}";
    
    // using xmldocument
    XmlDocument doc = JsonConvert.DeserializeXmlNode(json, "root", true);
    
    // select all ItemDetails
    var itemDetails = doc.SelectNodes("//ItemDetails");
    
    foreach (XmlNode item in itemDetails)
    {
        foreach (XmlNode childNode in item.ChildNodes.Cast<XmlNode>().ToList())
        {
            var attribute = doc.CreateAttribute(childNode.Name);
            attribute.Value = childNode.InnerText;
    
            // add attribute to node
            item.Attributes.Append(attribute);
    
            // remove the childnode
            item.RemoveChild(childNode);
        }
    }
    
    Console.WriteLine(doc.InnerXml);
    

    https://dotnetfiddle.net/9HtdsU