我有一些类似于下面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" />
等