2015-11-13 31 views
0

總是與LINQ to XML混淆。我想從以下XML中以IEnumerable的形式提取電子郵件。這是正確的解析LINQ的XML內部元素的方式嗎?C#

String xml [email protected]"<?xml version=""1.0"" encoding=""utf-8""?> 
        <people> 
        <person firstname=""John"" lastname=""doe""> 
         <contactdetails> 
          <emailaddress>[email protected]</emailaddress> 
         </contactdetails> 
        </person> 
        <person firstname=""Jane"" lastname=""doe""> 
         <contactdetails> 
          <emailaddress>[email protected]</emailaddress> 
          <phonenumber>001122334455</phonenumber> 
         </contactdetails> 
        </person> 
        </people>"; 

一些試驗後,我發現下面的代碼工作,但我不喜歡使用的ElementAt(0).value的(通常我不會在其他的示例代碼見)。這裏使用LINQ的最佳方式是什麼?

XDocument doc = XDocument.Parse(xml); 
var emails = from p in doc.Descendants("person") 
where p.Descendants("emailaddress").Any() 
let email = (string)p.Descendants("emailaddress").ElementAt(0).Value          
select email; 
+1

爲什麼不'XDocument.Parse(XML).XPathSelectElements( 「人/人/ contactdetails/EMAILADDRESS」)'? :) –

+0

這不是關於XML。這是關於如何正確使用Linq來查詢集合。如果你確定人們只有一個'emailaddress',只需使用'p.Descendants(「emailaddress」)。Single()。Value' – Alireza

回答

0

您可以使用XPathSelectElements爲了使用XPath提取IEnumerable<XElement>

string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
    <people> 
    <person firstname=""John"" lastname=""doe""> 
     <contactdetails> 
      <emailaddress>[email protected]</emailaddress> 
     </contactdetails> 
    </person> 
    <person firstname=""Jane"" lastname=""doe""> 
     <contactdetails> 
      <emailaddress>[email protected]</emailaddress> 
      <phonenumber>001122334455</phonenumber> 
     </contactdetails> 
    </person> 
    </people>"; 

IEnumerable<XElement> elements = XDocument 
    .Parse(xml) 
    .XPathSelectElements("people/person/contactdetails/emailaddress"); 

然後,你就可以使用LINQ Select以提取郵件的數組:

string[] elements = XDocument 
    .Parse(xml) 
    .XPathSelectElements("people/person/contactdetails/emailaddress") 
    .Select(x => x.Value) 
    .ToArray(); 
1

獲取所有來自xml的電子郵件

var e_mailsAll = doc.Descendants("person") 
     .Descendants("emailaddress") 
     .Select(x=>x.Value); 

得到每個人的第一封電子郵件,如果有人有超過1

var e_mailsFirst = doc.Descendants("person") 
     .Select(x=>x.Descendants("emailaddress").FirstOrDefault()) 
     .Where(x=>x!=null) 
     .Select(x=>x.Value);