将 XML 转换为动态 C# 对象
Posted
技术标签:
【中文标题】将 XML 转换为动态 C# 对象【英文标题】:Converting XML to a dynamic C# object 【发布时间】:2012-10-21 17:06:25 【问题描述】:我使用以下 C# 代码通过 JSON.Net 框架将 JSON 数据字符串转换为动态对象:
// 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,然后重新使用上面的代码,但这感觉像是在作弊。
谢谢。
【问题讨论】:
我根据您的要求找到了一些不错的解决方案:1.Parse XML to dynamic object in C# 2.Creating a dynamic object from XML using ExpandoObject 3.Fluent XML Parsing Using C#'s Dynamic Type Part 1 4.[带有 C# 和 .Net 4.0 的动态 XML 阅读器](@ 987654324@ 【参考方案1】:XDocument doc = XDocument.Parse(xmlData); //or XDocument.Load(path)
string jsonText = JsonConvert.SerializeXNode(doc);
dynamic dyn = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);
我认为“作弊”是答案 - xml 解决方案很长 :)
【讨论】:
这是最快的解决方案,我喜欢它! 太棒了 太棒了!但是,您将如何访问属性?例如,解析.nuspec
文件后,我应该能够导航到以下nuspec.package.dependencies.dependency.@version
,但无法识别@version
。
这是怎么作弊的?
Anton,属性以“@”为前缀。另见newtonsoft.com/json/help/html/ConvertingJSONandXML.htm。我通常将 ExpandoObject 转换为字典。该属性可通过该字典使用“@”键访问。【参考方案2】:
未来访问者的替代方案,来自 ITDevSpace 的不包括带有子元素的属性。
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;
【讨论】:
我该如何使用它?【参考方案3】:Cinchoo ETL - 一个可用于将 xml 解析为动态对象的开源库
using (var p = ChoXmlReader.LoadText(xml).WithXPath("/"))
foreach (dynamic rec in p)
Console.WriteLine(rec.Dump());
查看 CodeProject 文章以获得更多帮助。
免责声明:我是这个库的作者。
【讨论】:
【参考方案4】:从@FSX 的回答我已经成功使用了来自“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;
【讨论】:
我用过这个;它可以很好地在动态对象中提供动态名称和值。以上是关于将 XML 转换为动态 C# 对象的主要内容,如果未能解决你的问题,请参考以下文章