我试图将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来查看它。但是,有没有任何有效而好的方法呢?
答案 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();