Linq 查询引发 NullReferenceException

Linq query throws NullReferenceException

提问人:Rico Strydom 提问时间:7/3/2019 最后编辑:marc_sRico Strydom 更新时间:7/8/2019 访问量:40

问:

考虑 XSD 中的以下两部分。

1.

<xs:complexType name="CurrencyAndAmount">
    <xs:simpleContent>
        <xs:extension base="ActiveOrHistoricCurrencyAndAmount_SimpleType">
            <xs:attribute name="Ccy" type="CurrencyCode" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

2.

<xs:simpleType name="CurrencyCode">
    <xs:restriction base="xs:string">
        <xs:maxLength value="3"/>
        <xs:pattern value="[A-Z]{3,3}"/>
    </xs:restriction>
</xs:simpleType>

我在第一个元素组中有“type”属性的值。 我正在尝试获取元素组,其中“name”属性的值与组 1 中的“type”属性具有相同的值。complexType

我有这个 LINQ 查询...

IEnumerable<XElement> a = xsdDocument.Descendants()
                         .Where(x => x.Attribute("name").Value == "CurrencyCode");

...但它抛出了一个NullReferenceException

LINQ-to-XML nullReferenceException

评论

0赞 Sean Sailer 7/3/2019
我不是 XML 专家...但不等于“Ccy”?.将其更改为等于“CurrencyCode”的 是否有意义?x.Attribute("name").Valuex.Attribute("type").Value
0赞 Jeff Mercado 7/3/2019
与其将模式读取为 XML 并对其进行解释,不如将其读取为 并使用提供的工具。XmlSchema
2赞 NetMage 7/4/2019
如果属性(在本例中为 )不存在,则该方法将返回一个 ,因此您无法取消引用它以访问 。你可以做一个空条件,.nameAttributenullValuex.Attribute("name")?.Value
0赞 Rico Strydom 7/4/2019
@NetMage,在本例中,该值存在。此异常是否可能发生在我的 xsd 中不存在该属性的其他地方的另一个组中?您的代码确实为我的问题提供了解决方案。谢谢!
2赞 Jeff Mercado 7/9/2019
没关系,您正在迭代文档中的所有元素的后代。并非每个元素都包含 name 属性,因此您将不可避免地遇到 null 的情况。x.Attribute("name")

答: 暂无答案