2013-10-31 26 views
2

我有以下的情況下,想在話題一定的幫助指導:訪問和保存XElements對象集合中

我有用戶憑據組成(不得用於商業用途的XML文件,所以安全是真的在這種情況下沒有任何意義)用於簡單的聊天應用程序。如果用戶訂閱服務,他的憑證應該與XML文件中記錄的憑證相匹配。 XML文件的


代碼片段:

<Users> 
<User> 
    <Username>Johan</Username> 
    <Password>Johan123</Password> 
</User> 
<User> 
    <Username>Carel</Username> 
    <Password>Carel123</Password> 
</User> 
    ... 
    ... 
</Users> 

然後我有下面的類:

public class Credentials 
    { 
     public string Username { get; set; } 
     public string Password { get; set; } 
    } 

全權證書類僅僅是將被用來檢索記錄在XML文件中的用戶列表,以及檢索特定用戶。

我有下面的代碼,可以檢索出的元素的XML文件:

public List<Credentials> RetrieveUsers() 
     { 
      Root = XElement.Load(path + "Users.xml"); 
      List<Credentials> credentials = new List<Credentials>(); 

      var xmlResults = from element in Root.Elements().Elements() 
        select new 
        { 
          Username = element.Element("Username").Value, 
          Password = element.Element("Password").Value 
        }; 

      foreach(var xmlResult in xmlResults) 
      { 
       Credentials temp = new Credentials(); 

       temp.Username = xmlResult.Username; 
       temp.Password = xmlResult.Password; 

       credentials.Add(temp); 
      } 

      return credentials; 
     } 

然而,這種感覺是多餘的。我想實現在下面的線東西(這不工作):

public List<Credentials> RetrieveUsers() 
     { 
      Root = XElement.Load(path + "Users.xml"); 
      List<Credentials> credentials = new List<Credentials>(); 

      List<Credentials> xmlResults = from element in Root.Elements().Elements() 
       select new 
       { 
         Username = element.Element("Username").Value, 
         Password = element.Element("Password").Value 
       }; 
      return xmlResults; 
     } 

它給了我下面的錯誤:

「無法隱式轉換類型‘System.Collections.Generic.IEnumerable’到'System.Collections.Generic.List'。一個明確的轉換存在(你是否缺少一個演員?)「

這是非常有意義的,因爲我想它使用IEnumerable來枚舉通過選擇LINQ語句。

任何有關此事的幫助將不勝感激,請告訴我,如果我從錯誤的角度看待這個問題,是否可以使用其他方法。在此先感謝

回答

5

你只需要調用ToList擴展方法來創建一個列表。另外,您需要創建Credentials對象而不是匿名類型的實例。例如:

var xmlResults = from element in Root.Elements().Elements() 
       select new Credentials 
       { 
        Username = element.Element("Username").Value, 
        Password = element.Element("Password").Value 
       }; 
return xmlResults.ToList(); 

我個人不傾向於使用查詢表達式進行簡單的通過/ select查詢 - 我已經寫了:

return Root.Elements().Elements() // TODO: Consider specifying the element name 
      .Select(element => new Credentials 
        { 
        Username = element.Element("Username").Value, 
        Password = element.Element("Password").Value 
        }) 
      .ToList(); 

使用「點號」像這樣的優勢是調用ToList不會在括號中留下一個查詢表達式,這總是看起來有點難看。

+0

@Jonesy:衛生署,錯過了 - 固定的,謝謝。 –

+0

肯定的事情,想澄清,我沒有丟失東西 – Jonesopolis

+0

這正是我正在尋找。非常感謝:)我知道這是我忽略的小事。我對使用lambda表達式還是有點緊張,因爲我對它的工作原理並不完全熟悉,但是我會研究它,因爲它真的可以直觀地改進代碼。再次,非常感謝。 –

1

你試試這個:

 List<Credentials> xmlResults = Root.Elements().Elements() 
      .Select(element => new Credential() { 
        Username = element.Element("Username").Value, 
        Password = element.Element("Password").Value 
      }) 
      .ToList(); 
相關問題