2014-09-10 41 views
0

我們有一個基本上是Xml的設置文件,我們正在爲我們正在編寫的可插入模塊進行擴展。基本上我們想使用我們現有的Xml設置,但允許在它們上面寫入擴展方法。龍的故事,如果短期我們有一個XML文件,像這樣:將Xml文件加載到Section,Key和Value Collection中

<Settings> 

    <SettingsOne Key1_1="Value1" 
       Key1_2="Value2" /> 
    <SettingsTwo Key2_1="Value1" 
       Key2_2="Value2" /> 


</Settings> 

我們怎麼能加載這個作爲SettingsEntry的集合,其中SettingsEntry看起來像這樣:

public class SettingsEntry 
{ 
    public string Section { get; set; } 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

凡科會「SettingsOne」鍵將是「Key1_1」,值將是「Value1」。

這是可能的,還是我會走向黑暗之路?

編輯:

OK的LINQ到XML的建議是一個生命拯救,我試圖用XmlSerializer的做到這一點!下面是我到目前爲止,有沒有辦法變成一個選擇這個而不是兩個像我有如下:

var root = XElement.Load(pathToXml); 

    var sections = from el in root.Elements() 
      select el.Name; 

    List<SettingsEntry> settings = new List<SettingsEntry>(); 

    foreach (var item in sections) 
    { 
    var attributes = from el in root.Elements(item).Attributes() 
        select new SettingsEntry() 
        { 
         Section = item.LocalName, 
         Key = el.Name.LocalName, 
         Value = el.Value 
        }; 
    settings.AddRange(attributes); 
    } 

    return settings; 

編輯2:

這似乎是工作。

var sections = from el in root.Elements() 
       from a in root.Elements(el.Name).Attributes() 
       select new SettingsEntry() 
       { 
        Section = el.Name.LocalName, 
        Key = a.Name.LocalName, 
        Value = a.Value 
       }; 
+1

是的,這是絕對有可能的 - 我建議你嘗試使用LINQ to XML。想想從元素中的元素doc.Root.Elements查詢元素.Attributes()select ...'然後問一個更詳細的問題,如果你有問題:) – 2014-09-10 13:06:44

+0

顯示你有什麼代碼,我會幫你解決問題。付出一點努力,我會幫助你。 – DidIReallyWriteThat 2014-09-10 13:15:08

+0

謝謝喬恩,這真的很有幫助,並把我推向了正確的道路,卡爾文道歉,如果我已經提出了任何事情,甚至遠程工作,我會發布它,但我完全錯誤的方向! – user351711 2014-09-10 13:18:11

回答

0

你可以做,在一個LINQ查詢是這樣的:

var attributes = from attribute in root.Elements().Attributes() 
       select new SettingsEntry() 
       { 
        Section = attribute.Parent.Name.LocalName, 
        Key = attribute.Name.LocalName, 
        Value = attribute.Value 
       }; 
return attributes.ToList(); 
+0

好吧,這比我想出來的更好,謝謝。 – user351711 2014-09-10 13:32:20

0
var xml = @" 
<Settings> 
    <SettingsOne Key1_1= ""Value1"" Key1_2= ""Value1""></SettingsOne> 
    <SettingsTwo Key2_1= ""Value1"" Key2_2= ""Value1""></SettingsTwo> 
</Settings>" 

var root = XDocument.Parse(xml); 

var q = root.Elements("Settings").Descendants(); 

List<SettingsEntry> settings = (from el in root.Elements("Settings").Descendants() 
       select new SettingsEntry() 
       { 
        Section = el.Name.ToString(), 
        Key = el.FirstAttribute.Value, 
        Value = el.LastAttribute.Value 
       }).ToList(); 

您可能必須發揮它一點點地得到你想要的確切的對象,但是這是一個嚴重的推向正確的方向。