什么是将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文件解析为c# ienumerable动态文件的好方法?

可以将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结合使用并不合适。