这是用C#中的LINQ解析XML内部元素的正确方法吗

本文关键字:元素 方法 内部 XML 中的 解析 LINQ | 更新日期: 2023-09-27 18:21:56

总是与LINQ to XML混淆。我想从以下XML中提取电子邮件作为IEnumerable。

   String xml =@"<?xml version=""1.0"" encoding=""utf-8""?>
                   <people>
                     <person firstname=""John"" lastname=""doe"">
                       <contactdetails>
                          <emailaddress>john@unknown.com</emailaddress>
                       </contactdetails>
                     </person> 
                     <person firstname=""Jane"" lastname=""doe"">
                       <contactdetails>
                          <emailaddress>jane@unknown.com</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;

这是用C#中的LINQ解析XML内部元素的正确方法吗

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

您可以使用XPathSelectElements来使用XPath:提取IEnumerable<XElement>

string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
   <people>
     <person firstname=""John"" lastname=""doe"">
       <contactdetails>
          <emailaddress>john@unknown.com</emailaddress>
       </contactdetails>
     </person> 
     <person firstname=""Jane"" lastname=""doe"">
       <contactdetails>
          <emailaddress>jane@unknown.com</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();