2011-09-19 19 views
0

比方說,我有一個XML文件是這樣的:將XML文件解析爲C#IEnumerable的好方法是什麼<dynamic>?

<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文件不會太長,我只是需要它作爲一個小應用程序的數據庫,在那裏不會連接到實際的RDBMS。

+1

是否有任何理由不能使用[XmlSerializer](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx)? – slugster

+0

您可以使用System.Reflection.Emit創建一個動態類:http://msdn.microsoft.com/en-us/library/system.reflection.emit(v=vs.71).aspx – Dani

回答

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"); 

我敢肯定有很多都是賭儘管如此。

+0

謝謝,這看起來像這是關於我在找什麼。老實說,這個應用程序是青少年,微小,幾乎不需要重新使用等等。謝謝! – Chaddeus

+0

是否可以更新一個xml文件,而不用重寫整個東西? – Chaddeus

+0

您只能讀寫整個XML文檔。 – dtb

相關問題