用LINQ投射对象到XML,但想要空字符串而不是NULL

本文关键字:字符串 NULL LINQ 对象 XML | 更新日期: 2023-09-27 18:10:38

有时XML会缺少某些部分。在这种情况下,XML有时没有"Email"。在这种情况下,我只想要一个空字符串。这是我到目前为止尝试的,但我仍然得到一个

附加信息:值不能为空。

下面是代码和一段XML
XDocument 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>

用LINQ投射对象到XML,但想要空字符串而不是NULL

大多数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