C# 捕获“之前不存在的XML节点”;“对象未设置”;错误

C# 捕获“之前不存在的XML节点”;“对象未设置”;错误,c#,.net,linq,xml-parsing,linq-to-xml,C#,.net,Linq,Xml Parsing,Linq To Xml,我有一些类似于下面的XML的东西。我正在用C#中的Linq解析它,它工作得很好,直到我们得到一个没有类型的产品 <productList> <product> <type> <colour>red</colour> </type> <name>First</name> </product> &l

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

<productList>
    <product>
        <type>
            <colour>red</colour>
        </type>
        <name>First</name>
    </product>
    <product>
        <name>Second</name>
    </product>
</productList>
我知道
颜色
元素始终是
类型
下面的第一个元素,因此我可以使用
.FirstOrDefault()
,但使用此代码仍然会出现相同的错误

有人能给我指一下正确的方向吗?我还尝试了对字符串进行强制转换,并且有:
??“”
最后,到目前为止都没有用

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

我会在这里使用XPath

var xDoc = XDocument.Parse(xml);
var colour = xDoc.XPathSelectElement("//product/type/colour");
if(colour!=null)
{
    var val = colour.Value;
}
将返回一个IEnumerable。如果元素不存在,IEnumerable将只是空的,再次调用元素不会产生空引用异常。下面的代码应该从product\type元素下提取颜色,而不会引发空引用异常。如果颜色或类型不存在,它将返回空值

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

您是否想过使用属性来代替

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

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


您还可以执行
等操作。

当您说
元素(“type”).subjections()
时,如果没有“type”元素,您将得到一个错误。在查询其descendant之前,需要处理缺少的元素。到目前为止,您的尝试是处理丢失的后代,但这是您的问题之后,因为它已经呈现出丑陋的头部。感谢您的评论-您知道如何使用Linq进行此操作吗?使用“元素”而不是“元素”?这可能是您可以进行的最佳编辑。这似乎很有效-非常感谢!没问题,很高兴我能帮忙:)它当然更整洁,但不幸的是,在这种情况下,我无法控制XML源代码。不过还是要谢谢你!
<productList>
    <product type="color-red">
        <name>First</name>
    </product>
    <product type="none">
        <name>Second</name>
    </product>
</productList>