假设我有一个像这样的xml文件:
<items>
<item>
<id>1</id>
<name>Item 1</name>
<description>This is item 1</description>
<quantityLeft>10</quantityLeft>
</item>
... (more items)
</items>
我想将它解析为C#动态,其中标签名称(名称,描述等)成为动态的属性(并包含标签内的数据)。
然后,我可以对.Where (i => i.id = 1)
中的特定项执行查询IEnumerable<dynamic>
,进行一些更改,然后更新XML文件。
XML文件不会太长,我只需要它作为一个小应用程序的数据库,在那里将不会与实际的RDBMS连接。
答案 0 :(得分:3)
您 可以 将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");
我确信有更好的选择。
答案 1 :(得分:0)
请尝试以下链接:http://blogs.msdn.com/b/mcsuksoldev/archive/2010/02/04/dynamic-xml-reader-with-c-and-net-4-0.aspx
作为sidenode:动态的Xml非常灵活。例如,如何处理名称空间?为什么不使用XLinq?它需要更多的输入,但允许你保持灵活性并避免动态类型,这在我诚实的意见中并不适合与XML结合使用。