我有这个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;
给出
对象引用未设置为实例
错误。
我在编写一个查询时遇到问题,该查询还会包含属性不存在的标记。
有人可以帮帮我吗?
问候。
答案 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
。