使用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应该有EmpNameEmpLocationEmpAddress1EmpAddress2

此代码:

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标记值。

我错过了什么?

使用LINQ获取选择性标记值

您应该知道,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
             });