【问题标题】:Linq to read xml into classes with where clause filteringLinq 使用 where 子句过滤将 xml 读入类
【发布时间】:2015-04-17 21:46:53
【问题描述】:

我有这种格式的 xml。我正在尝试根据一些选择性子句将此数据加载到类中

<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()
                                 });

这将返回正确加载的所有 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");

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

感谢收看。

【问题讨论】:

  • 发布的 XML 示例不会引发该异常。请发布演示问题的最小 XML 示例,以便我们确定真正需要修复的内容...

标签: c# linq-to-xml


【解决方案1】:

你的代码在某些情况下会抛出这样的异常,其中,如果在当前&lt;CA&gt;节点中没有找到TypeIdea属性,或者当没有找到&lt;Var&gt;子节点时。

在上述情况下避免异常的一种可能方法是,尝试将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

【讨论】:

  • 谢谢。我完全错过了一些没有分配 Var 的值。我刚刚在 where 子句中添加了一个空检查并解决了它。
猜你喜欢
  • 2015-04-10
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多