我试图了解 LINQ to XML 功能构造的工作原理。
我有以下示例 XML:
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>";
我尝试通过向标签添加一个IsMale
属性并添加一个如果它不存在来修改这个 XML。Person
PhoneNumber
我可以通过使用一些程序代码轻松编写此代码:
XElement root = XElement.Parse(xml);
foreach (XElement p in root.Descendants("Person"))
{
string name = (string)p.Attribute("firstName") + (string)p.Attribute("lastName");
p.Add(new XAttribute("IsMale", IsMale(name)));
XElement contactDetails = p.Element("ContactDetails");
if (!contactDetails.Descendants("PhoneNumber").Any())
{
contactDetails.Add(new XElement("PhoneNumber", "001122334455"));
}
}
但是MSDN 上的文档说功能构造应该更容易更好地维护。因此,我尝试使用功能构造编写相同的示例。
XElement root = XElement.Parse(xml);
XElement newTree = new XElement("People",
from p in root.Descendants("Person")
let name = (string)p.Attribute("firstName") + (string)p.Attribute("lastName")
let contactDetails = p.Element("ContactDetails")
select new XElement("Person",
new XAttribute("IsMale", IsMale(name)),
p.Attributes(),
new XElement("ContactDetails",
contactDetails.Element("EmailAddress"),
contactDetails.Element("PhoneNumber") ?? new XElement("PhoneNumber", "1122334455")
)));
可能是我,但我觉得这段代码可读性不好。
如何改进我的功能结构?有没有更好的方法来编写这段代码?