使用LINQ获取选择性标记值

时间:2013-02-20 06:50:30

标签: c# .net xml linq linq-to-xml

我在编写LINQ查询以从XML获取某些节点时遇到问题,希望有人可以帮助它。 这是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属性且trueInsertCollection的标记。 意味着EmpName应该有EmpLocationEmpAddress1EmpAddress2var 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;

此代码:

Field

提供忽略Where子句的所有五个{{1}}标记值。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

您应该知道,XAttribute可以强制转换为bool,并且会为数字(0/1)和文本(true / false)属性值返回正确的bool值。

我会试试这个:

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元素。

答案 1 :(得分:1)

尝试这样

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