用LINQ投射对象到XML,但想要空字符串而不是NULL
本文关键字:字符串 NULL LINQ 对象 XML | 更新日期: 2023-09-27 18:10:38
有时XML会缺少某些部分。在这种情况下,XML有时没有"Email"。在这种情况下,我只想要一个空字符串。这是我到目前为止尝试的,但我仍然得到一个
附加信息:值不能为空。
下面是代码和一段XMLXDocument xdoc = XDocument.Parse(result.Result.ToString());
SelectedLead = xdoc.Descendants("Fields").Select(x => new Lead
{
FirstName = x.Descendants("Field").Where(y => y.Attribute("FieldTitle").Value == "First Name").Select(z => z.Attribute("Value").Value).FirstOrDefault(),
LastName = x.Descendants("Field").Where(y => y.Attribute("FieldTitle").Value == "Last Name").Select(z => z.Attribute("Value").Value).FirstOrDefault(),
Email = x.Descendants("Field").Where(y => y.AttributeValueNull("FieldTitle") == "Email").Select(z => z.Attribute("Value").Value).FirstOrDefault()
}).First();
public static string AttributeValueNull(this XElement element, string attributeName)
{
if (element == null)
return "";
else
{
XAttribute attr = element.Attribute(attributeName);
return attr == null ? "" : attr.Value;
}
}
XML: <Fields>
<Field FieldId="2" Value="John" FieldTitle="First Name" FieldType="Text" />
<Field FieldId="3" Value="Smith" FieldTitle="Last Name" FieldType="Text" />
<Field FieldId="9" Value="123 abc st" FieldTitle="Address" FieldType="Text" />
<Field FieldId="10" Value="Cincinnati" FieldTitle="City" FieldType="Text" />
<Field FieldId="11" Value="OH" FieldTitle="State" FieldType="State" />
</Fields>
大多数AttributeValueNull
可以通过使用定义的显式转换来删除,例如:
return (string)element.Attribute(attributeName);
那么将它合并到helper方法中以获取字段值可能会减少重复:
private static string FieldValue(XElement fields, string fieldTitle)
{
return fields.Elements("Field")
.Where(e => (string)e.Attribute("FieldTitle") == fieldTitle)
.Select(e => (string)e.Attribute("Value"))
.SingleOrDefault() ?? string.Empty;
}
把这些放在一起:
var lead = doc.Descendants("Fields").Select(fields => new Lead
{
FirstName = FieldValue(fields, "First Name"),
LastName = FieldValue(fields, "Last Name"),
Email = FieldValue(fields, "Email")
}).Single();
您可以在这里看到一个工作演示:https://dotnetfiddle.net/TQJsv4
答案是这个
Email = x.Descendants("Field").Where(y => y.AttributeValueNull("FieldTitle") == "Email")
.Select(z => z.Attribute("Value").Value).FirstOrDefault() ?? string.Empty