LINQ查询在属性不存在时获取XML元素

时间:2013-02-20 04:25:37

标签: c# linq linq-to-xml

我有这个XML:

<Config>
  <EmpFieldsMap>
    <Employee>
      <Field>
        <Name update = "false">EmpNumber</Name>
      </Field>
      <Field>
        <Name insert = "true">EmpName</Name>
      </Field>
      <Field>
        <Name insert = "true">EmpDesignation</Name>
      </Field>
    </Employee>
  </EmpFieldsMap>
</Config>

我的应用程序将执行一个INSERT或UPDATE,其字段将来自此xml。 每个标记都有insert或update属性,如上面的代码段所示。

用于插入具有属性

的所有标记
insert = "true"

并且必须考虑没有此属性的标记,在本例中为'EmpNumber'。

同样适用于更新。

此代码为我提供了insert属性设置为true的所有标记:

insertTags = from p in xml.Element("Config").Element("EmpFieldsMap").Elements("Field")
             where p.Element("Name").Attribute("insert") != null 
             && p.Element("Name").Attribute("insert").Value == "true"
             select p.Element("Name").Value;

删除空检查

insertTags = from p in xml.Element("Config").Element("EmpFieldsMap").Elements("Field")
             where p.Element("Name").Attribute("insert").Value == "true"
             select p.Element("Name").Value;

给出

  

对象引用未设置为实例

错误。

我在编写一个查询时遇到问题,该查询还会包含属性不存在的标记。

有人可以帮帮我吗?

问候。

2 个答案:

答案 0 :(得分:1)

insertTags = from p in xml.Element("Config").Element("EmpFieldsMap").Elements("Field")
    where (p.Element("Name").Attribute("insert") ?? "true") == "true"
    select p.Element("Name").Value;

答案 1 :(得分:0)

使用XPath和Linq它甚至更简单:

XPathSelectElements(@"Config/EmpFieldsMap/Employee/Field/Name[@insert='true']")

对于这个特定的xml,您可以使用全局搜索名称元素:

var insertTags = xdoc.XPathSelectElements(@"//Name[@insert='true']")
                     .Select(n => (string)n);

或使用Linq查询语法:

var insertTags = from n in xdoc.Descendants("Name")
                 where (string)n.Attribute("insert") == "true"
                 select (string)n;

当您将节点值转换为字符串时,如果缺少节点,它将不会抛出异常。只需null即可退回。所以,你不需要所有这些东西(即使是不可编译):

(p.Element("Name").Attribute("insert") ?? "true") == "true"

再修改一次。如果你正在处理布尔值,那么使用布尔值而不是字符串:

var insertTags = from n in xdoc.Descendants("Name")
                 where (bool?)n.Attribute("insert") == true
                 select (string)n;

它是如何工作的?对于缺少的属性,Nullable boolean将具有null值。将没有值的bool?与任何布尔值进行比较会产生false。因此,您只会获得具有必需属性的元素,并且该属性具有true