在出现错误之前捕获不存在"object not set" XML 节点



我有一些类似于下面XML的东西。我在C#中使用Linq解析它,它工作得很好,直到我们得到一个没有type的产品。

<productList>
<product>
<type>
<colour>red</colour>
</type>
<name>First</name>
</product>
<product>
<name>Second</name>
</product>
</productList>

我试图访问type下的colour元素,但当代码到达一个没有type元素的product时,我会得到"Object reference not set to a instance of a Object"错误。

这是我现在用来访问它的代码。随着我试图解决这个问题,事情变得有点复杂。

productColour = products.Element("type").Descendants().FirstOrDefault() == null ? string.Empty : products.Element("type").Descendants().FirstOrDefault().Value,

我知道colour元素总是type下面的第一个,所以我可以使用.FirstOrDefault(),但使用此代码时仍然会出现相同的错误。

有人能给我指正确的方向吗?我还尝试过转换为字符串,最后还有:?? " ",但到目前为止都没有用。

编辑:多亏了@anthony-pegram,问题似乎是我总是试图获取子元素,即使父元素不存在。因此,在抓住孩子之前,我似乎需要检查父元素——有人能为我指明方向吗?

Elements()将返回一个IEnumerable。如果元素不存在,则IEnumerable将为空,并且对其再次调用Elements不会产生null引用异常。下面的代码应该从product\type元素下提取颜色,而不会引发null引用异常。如果颜色或类型不存在,它将返回一个null。

(string)product.Elements("type").Elements("colour").FirstOrDefault()

我会在这里使用XPath

var xDoc = XDocument.Parse(xml);
var colour = xDoc.XPathSelectElement("//product/type/colour");
if(colour!=null)
{
var val = colour.Value;
}

您是否想过使用Attribute?

<productList>
<product type="color-red">
<name>First</name>
</product>
<product type="none">
<name>Second</name>
</product>
</productList>

不可能返回null变量,因为type属性可以具有默认字符串值。我也认为这更整洁,但这是我个人的喜好。

你也可以做<product color="red" />

相关内容

最新更新