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>
节点中找不到 Type
或 Idea
属性,或者当 [=14] =] 未找到子节点。
在上述情况下避免异常的一种可能方法是尝试将 XAttribute
或 XElement
转换为预期类型,而不是直接访问 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
我有 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>
节点中找不到 Type
或 Idea
属性,或者当 [=14] =] 未找到子节点。
在上述情况下避免异常的一种可能方法是尝试将 XAttribute
或 XElement
转换为预期类型,而不是直接访问 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