使用 Newtonsoft 并非开箱即用。相反,您必须创建包含所有节点的 XML,然后重写它,将所有节点移动到属性,然后删除子节点。
您可以同时使用XmlDocument 和XNode 来做到这一点
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