使用LINQ to XML投影对象但需要空字符串而不是NULL

时间:2015-09-01 12:46:10

标签: c# xml linq

有时XML会丢失某些部分。在这种情况下,XML有时没有“电子邮件”。所以在这种情况下我只想要一个空字符串。这是我到目前为止所尝试的,但我仍然得到了

附加信息:值不能为空。

这是代码和一段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>

2 个答案:

答案 0 :(得分:1)

您可以使用已定义的显式转换删除大多数AttributeValueNull,例如:

return (string)element.Attribute(attributeName);

然后将其合并到辅助方法中以获取字段值可能不那么重复:

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

答案 1 :(得分:0)

答案是这个

  Email = x.Descendants("Field").Where(y => y.AttributeValueNull("FieldTitle") == "Email")
           .Select(z => z.Attribute("Value").Value).FirstOrDefault() ?? string.Empty