0

我有这个 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>

我的应用程序将执行插入或更新,其字段将来自此 xml。每个标签都将具有插入或更新属性,如上面的代码片段所示。

对于插入所有具有该属性的标签

insert = "true"

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

这同样适用于更新。

这段代码为我提供了所有插入属性设置为 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;

删除对 null 的检查

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

对象引用未设置为实例

错误。

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

有人可以帮我吗?

问候。

4

2 回答 2

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;
于 2013-02-20T04:43:55.363 回答
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;

这个怎么运作?可为空的布尔值将具有null缺失属性的值。bool?将没有值的值与任何布尔值进行比较会产生false. 因此,您将只获得那些具有必需属性且具有true该属性的元素。

于 2013-03-05T22:24:54.947 回答