Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting XML to a dynamic C# object

Tags:

json

c#

xml

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 representing the JSON data var ProductDB = JsonConvert.DeserializeObject<dynamic>(JsonData); 

Once converted, I can access the elements directly using code like this:

// Variables to be used string ProductID; string ProductType; int ProductQty;  // Loop through each of the products foreach (dynamic product in ProductDB.products) {     ProductID = product.id;     ProductType = product.type;     ProductQty = product.qty; } 

Is there anything similar to this for working with XML data? I could just use JSON.net to convert my XML to JSON and then re-use the code above, but that feels like cheating.

Thanks.

like image 536
stuartm Avatar asked Nov 01 '12 05:11

stuartm


2 Answers

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 :)

like image 154
HeatherD Avatar answered Sep 18 '22 23:09

HeatherD


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;     } } 
like image 23
CrashM Avatar answered Sep 16 '22 23:09

CrashM