使用LINQ获取选择性标记值
本文关键字:选择性 LINQ 获取 使用 | 更新日期: 2023-09-27 18:00:09
我在编写从XML获取某些节点的LINQ查询时遇到问题,希望有人能帮上忙。这是XML:
<EmpFieldsMap>
<Field>
<Name insert = "false">EmpNumber</Name>
</Field>
<Field>
<Name insert = "true">EmpName</Name>
</Field>
<Field>
<Name insert = "true">EmpLocation</Name>
</Field>
<Field>
<Name update = "false">EmpAddress1</Name>
</Field>
<Field>
<Name update = "false">EmpAddress2</Name>
</Field>
<Field>
</EmpFieldsMap>
正如您所看到的,一些Name
标记具有insert
属性,而另一些则具有update
属性。
我需要获得没有insert
属性并且将insert
作为true
的标签。意味着InsertCollection
应该有EmpName
、EmpLocation
、EmpAddress1
和EmpAddress2
。
此代码:
var titles = from nameTag in xml.Element("EmpFieldsMap").Elements("Field")
let insert = nameTag.Attribute("insert") ?? new XAttribute("insert","true")
where insert.Value == "true"
select nameTag.Element("Name").Value;
给出了忽略Where
子句的所有五个Field
标记值。
我错过了什么?
您应该知道,XAttribute
可以强制转换为bool
,并将为数字(0/1)和文本(true/false)属性值返回正确的布尔值。
我会试试这个:
titles = from nameTag in xml.Element("EmpFieldsMap").Elements("Field")
let insert = nameTag.Element("Name").Attribute("insert")
where insert == null || (bool)insert
select nameTag.Element("Name").Value;
您正在尝试获取Field元素的insert属性,但该属性始终为空。您应该在第一行检查nameTag.Element("Name").Attribute("insert")
或获取Name
元素。
像这样尝试
titles = (from nameTag in xml.Element("EmpFieldsMap").Elements("Field"))
.Where ( el=> (el.Attribute("insert").Value.Equals("true") ) ||
(el.Attribute("update").Value.Equals("false") )
Select(f => new
{
Text = nameTag.Element("Name").Value
});