这是用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;
从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();