什么是将XML文件解析为c# ienumerable动态文件的好方法?
本文关键字:文件 ienumerable 动态 方法 XML 什么 | 更新日期: 2023-09-27 18:09:02
假设我有一个这样的xml文件:
<items>
<item>
<id>1</id>
<name>Item 1</name>
<description>This is item 1</description>
<quantityLeft>10</quantityLeft>
</item>
... (more items)
</items>
我想将其解析为c#动态,其中标签名称(名称,描述等)成为动态的属性(并包含标签内的数据)。
然后,我可以对IEnumerable<dynamic>
中的特定项执行查询.Where (i => i.id = 1)
,进行一些更改,然后更新XML文件。
XML文件不会太长,我只需要它作为一个小应用程序的DB,其中没有连接到实际的RDBMS。
您可以将XML文件加载到XDocument中,将每个项复制到ExpandoObject中,对其进行操作,将这些项复制回XDocument,并保存到XML文件中。
负载:
List<dynamic> items = XDocument
.Load("input.xml")
.Element("items")
.Elements("item")
.Select(item =>
{
IDictionary<string, object> dict = new ExpandoObject();
foreach (var element in item.Elements())
dict[element.Name.LocalName] = (string)element;
return (dynamic)dict;
})
.ToList();
操作:
var query = from item in items
where item.id == "1"
select item;
foreach (var item in query)
{
item.name = "New Name";
}
保存:
var doc = new XDocument(new XElement("items", items.Select(item =>
{
IDictionary<string, object> dict = item as ExpandoObject;
return new XElement("item", from kvp in dict
select new XElement(kvp.Key, kvp.Value));
})));
doc.Save("output.xml");
我相信还有更好的选择。
尝试以下链接:http://blogs.msdn.com/b/mcsuksoldev/archive/2010/02/04/dynamic-xml-reader-with-c-and-net-4-0.aspx
作为一个旁注:Xml到动态不是很灵活。例如,如何处理名称空间?为什么不使用XLinq呢?它需要更多的类型,但允许您保持灵活性并避免动态类型,在我看来,动态类型与XML结合使用并不合适。