如何在C#.Net中解析XML时处理空值?

时间:2016-01-20 18:15:34

标签: c# .net xml linq xml-parsing

我试图将XML解析为我的域模型。以下是代码部分

Customer customer = new Customer();

IEnumerable<XElement> elements = XElement.Load(xmlPath).Elements();

customer.ID = elements
                .Where(n => n.Name.LocalName == "customers")
                .Elements().Where(e => e.Name.LocalName == "id")
                .FirstOrDefault().Value;

有些时候,XML不包含&#34;客户&#34;所以第一个.Where()子句返回 null 并进一步处理如.Elements()...导致它抛出异常。

我的问题是我如何在第一个.Where()子句停止,如果我的部分不存在于XML中(即返回A null )并继续前进没有例外?

我绝对可以打破Linq查询并使用if ... else来查看它。但是,有没有任何有效而好的方法呢?

2 个答案:

答案 0 :(得分:0)

快速解决方案是首先执行Linq查询,查找名称为&#34; customers&#34;如果您有一个或多个要处理的元素,则继续查询的后半部分:

elements = elements.Where(n => n.Name.LocalName.Equals("customers"));
if (elements.Count() > 0)
{
    customer.ID = elements.Elements().Where(e => e.Name.LocalName == "id").FirstOrDefault().Value;
}

拥有更多Linq知识的人可能会有更优雅的解决方案。

答案 1 :(得分:0)

Where永远不会返回null。不过,FirstOfDefault会然后调用Value会抛出NullReferenceException

您应该做的是利用built in explicit conversions from XElement

customer.ID = (string)elements
    .Where(n => n.Name.LocalName == "customers")
    .Elements()
    .Where(e => e.Name.LocalName == "id")
    .FirstOrDefault();

如果您只需要string,则稍微更详细的选择是选择Value,然后拨打FirstOrDefault()

customer.ID = elements
    .Where(n => n.Name.LocalName == "customers")
    .Elements()
    .Where(e => e.Name.LocalName == "id")
    .Select(e => e.Value)
    .FirstOrDefault();