Linq 使用 where 子句过滤将 xml 读入 类

Linq to read xml into classes with where clause filtering

我有 xml 这种格式。我正在尝试根据一些选择性条款将此数据加载到 classes 中

<Data

<CST>

<CA Type="type" Idea="Idea">
  <Var Name="Test" Value="some value" />
</CA>


<CA Type="type2" Idea="Idea2">
  <Var Name="Test2" Value="some value" />
</CA>


 <CA Type="type3" Idea="Idea3">
    <Var Name="Test" Value="some value" />
 </CA>

 </CST>

 </Data>

我在linq中读取的代码xml是这样的

        IEnumerable<CA> casValues = (from s in doc.Root.Element("CST").Elements("CA")
                                 select new CA
                                 {
                                     Type = s.Attribute("Type").Value,
                                     Idea = s.Attribute("Idea").Value,
                                     Variable = (from k in s.Elements("Var")
                                                 select new Variable
                                                 {
                                                     Name = k.Attribute("Name").Value,
                                                     Value = k.Attribute("Value").Value
                                                 }).FirstOrDefault()
                                 });

这 returns 所有 CA 及其 var 值已正确加载。但是,当我尝试进一步过滤它时,因为我只对 var name="test" 的值感兴趣,我得到一个带有错误

的空集合
"{"Object reference not set to an instance of an object."}"

我正在使用这样的简单过滤。

 IEnumerable<CA> tt = casValues.Where(x => x.Variable.Name == "Test");

我假设这是因为 Variable 是一个 class 并且我不能直接使用该值。当我用 foreach 检查我的条件加载每个元素时,同样有效。上面的代码缺少什么?

感谢观看。

您的代码在某些情况下会抛出此类异常,其中,如果在当前 <CA> 节点中找不到 TypeIdea 属性,或者当 [=14] =] 未找到子节点。

在上述情况下避免异常的一种可能方法是尝试将 XAttributeXElement 转换为预期类型,而不是直接访问 Value 属性 * :

var casValues = (from s in doc.Root.Element("CST").Elements("CA")
                 select new CA
                            {
                                Type = (string)s.Attribute("Type"),
                                Idea = (string)s.Attribute("Idea"),
                                Variable = (from k in s.Elements("Var")
                                            select new Variable
                                                       {
                                                           Name = (string)k.Attribute("Name"),
                                                           Value = (string)k.Attribute("Value")
                                                       }).FirstOrDefault()
                            });

*) 显式转换的可用类型列表:XElement Explicit Conversion Operators, XAttribute Explicit Conversion Operators