2013-05-30 86 views
0

我想從另一個項目的外部app.config(appSettings)加載一些配置,加載的值必須保存在我的一些屬性中。這裏(參見代碼中的註釋)是我想做的事:使用Linq而不是foreach

XmlDocument xmlDoc = MyXmlDocument; 
if (xmlDoc != null) 
{ 
    XmlNodeList appSettings = xmlDoc.SelectNodes("/configuration/appSettings/add"); 
    if (appSettings != null && appSettings.Count > 0) 
    { 
     foreach (XmlNode node in appSettings) 
     { 
      XmlAttribute keyAttr = node.Attributes["key"]; 
      if (keyAttr != null) 
      { 
       if (keyAttr.Value == "MyProperty1NameInConfigFile") MyProperty1 = node.Attributes["value"].Value; 
       // .... 
      } 
     } 


     // Instead of using foreach loop, I want to use Linq like this: 
     var node = get me the node that has the keyAttribute.Value == "MyProperty1NameInConfigFile" 
     MyProperty1 = node.Attributes["value"].Value; 

     // If I got this, then I can later use another method for each property like this: 
     SaveConfigToMyProperty(ref MyProperty1, "MyProperty1NameInConfigFile"); 
     SaveConfigToMyProperty(ref MyProperty2, "MyProperty2NameInConfigFile"); 
     // ... 
    } 
} 
+0

爲什麼您需要使用XML讀取器來使用app.config? –

+1

,因爲我正在使用另一個項目的app.config。我想從外部app.config讀取設置。 – Stacked

+0

可能希望爲這個問題添加一些小技巧,這樣人們(比如我)就不會威脅到你。 ;) –

回答

2

如果你投你的XmlDocumentIEnumerable<XmlNode>你可以得到所有的樂趣LINQ查詢。之後,你可以抓住你喜歡的任何東西。也許這樣?

var node = xmlDoc.SelectNodes("/configuration/appSettings/add").Cast<XmlNode>() 
    .Where(n => n.Attributes["key"].Value == "MyProperty1NameInConfigFile"); 
+0

嘎,打我吧> _ < – Sean

+0

謝謝莉莉,加入.FirstOrDefault();在查詢結束時將修復編譯錯誤。工作很好。 – Stacked

+0

如果你想使用Linq和XML,那麼最好使用XElement而不是XmlDocument – saj

0

這是一個XElement解決方案,更適合與Linq合作;

string xml = "";//xml as string; 
var txtReader = new XmlTextReader(xml, XmlNodeType.Element); 
var root = XElement.Load(txtReader); 

var node = root.XPathSelectElements("/configuration/appSettings/add") 
       .FirstOrDefault(n => 
        n.Attributes["key"] != null && 
        n.Attributes["key"].Value == "MyProperty1NameInConfigFile"); 
+0

好的,但是使用XElement代替使用XmlDocument有什麼好處? – Stacked

+0

那麼,你不必申請一個不必要的演員來使用Linq庫。欲瞭解更多信息,請參閱: http://blogs.msdn.com/b/codejunkie/archive/2008/10/08/xmldocument-vs-xelement-performance.aspx – saj

相關問題