将XML转换为dynamic的C#对象
我使用下面的C#代码来使用JSON.Net框架将一串JSON数据转换为一个dynamic对象:
// Creates a dynamic .Net object representing the JSON data var ProductDB = JsonConvert.DeserializeObject<dynamic>(JsonData);
一旦转换,我可以直接使用这样的代码访问元素:
// 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; }
处理XML数据有没有类似的东西? 我可以只使用JSON.net将我的XML转换为JSON,然后重新使用上面的代码,但这就像作弊。
谢谢。
XDocument doc = XDocument.Parse(xmlData); //or XDocument.Load(path) string jsonText = JsonConvert.SerializeXNode(doc); dynamic dyn = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);
我认为“作弊”是答案 – XML解决scheme是非常长的:)
来自ITDevSpace的未来访问者的替代scheme不包括具有子元素的元素的属性。
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; } }
从@ FSX的答案我已经成功地使用了“ parsingXML到C#中的dynamic对象 ”的解决scheme:
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; } } }