Converting XML to a dynamic C# object

后端 未结 4 1786
孤街浪徒
孤街浪徒 2020-11-28 04:32

I\'ve used the following C# code to convert a string of JSON data to a dynamic object using the JSON.Net framework:

// Creates a dynamic .Net object represen         


        
相关标签:
4条回答
  • 2020-11-28 05:09

    Cinchoo ETL - an open source library available to parse xml into dynamic object

    using (var p = ChoXmlReader.LoadText(xml).WithXPath("/"))
    {
        foreach (dynamic rec in p)
            Console.WriteLine(rec.Dump());
    }
    

    Checkout CodeProject article for some additional help.

    Disclaimer: I'm the author of this library.

    0 讨论(0)
  • 2020-11-28 05:20

    An alternative for future visitors, the one from ITDevSpace doesn't include attributes on elements with children.

    public class XmlWrapper
    {
        public static dynamic Convert(XElement parent)
        {
            dynamic output = new ExpandoObject();
    
            output.Name = parent.Name.LocalName;
            output.Value = parent.Value;
    
            output.HasAttributes = parent.HasAttributes;
            if (parent.HasAttributes)
            {
                output.Attributes = new List<KeyValuePair<string, string>>();
                foreach (XAttribute attr in parent.Attributes())
                {
                    KeyValuePair<string, string> temp = new KeyValuePair<string, string>(attr.Name.LocalName, attr.Value);
                    output.Attributes.Add(temp);
                }
            }
    
            output.HasElements = parent.HasElements;
            if (parent.HasElements)
            {
                output.Elements = new List<dynamic>();
                foreach (XElement element in parent.Elements())
                {
                    dynamic temp = Convert(element);
                    output.Elements.Add(temp);
                }
            }
    
            return output;
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:23

    From @FSX's answer I have successfully used the solution from "Parse XML to dynamic object in C#":

    public class XmlToDynamic
    {
        public static void Parse(dynamic parent, XElement node)
        {
            if (node.HasElements)
            {
                if (node.Elements(node.Elements().First().Name.LocalName).Count() > 1)
                {
                    //list
                    var item = new ExpandoObject();
                    var list = new List<dynamic>();
                    foreach (var element in node.Elements())
                    {                        
                        Parse(list, element);                        
                    }
    
                    AddProperty(item, node.Elements().First().Name.LocalName, list);
                    AddProperty(parent, node.Name.ToString(), item);
                }
                else
                {
                    var item = new ExpandoObject();
    
                    foreach (var attribute in node.Attributes())
                    {
                        AddProperty(item, attribute.Name.ToString(), attribute.Value.Trim());
                    }
    
                    //element
                    foreach (var element in node.Elements())
                    {
                        Parse(item, element);
                    }
    
                    AddProperty(parent, node.Name.ToString(), item);
                }
            }
            else
            {
                AddProperty(parent, node.Name.ToString(), node.Value.Trim());
            }
        }
    
        private static void AddProperty(dynamic parent, string name, object value)
        {
            if (parent is List<dynamic>)
            {
                (parent as List<dynamic>).Add(value);
            }
            else
            {
                (parent as IDictionary<String, object>)[name] = value;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:27
    XDocument doc = XDocument.Parse(xmlData); //or XDocument.Load(path)
    string jsonText = JsonConvert.SerializeXNode(doc);
    dynamic dyn = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);
    

    I think "cheating" is the answer - the xml solutions are very long :)

    0 讨论(0)
提交回复
热议问题