假设我们有一个XML文档列表,列表“data”。在此列表中可能会出现CoOwner。像下面的结构(只是一个例子)
<root>
<owner>
<firstname>Joe</firstname>
<fastname>Cole</lastname>
<!--- etc. -->
</owner>
<coOwner>
<firstname>Smith</firstname>
<lastname>Cole</lastname>
<!--- etc. --->
</coOwner>
<coOwner>
<firstname>Janna</firstname>
<lastname></lastname>
<!--- etc. --->
</coOwner>
</root>
如果文档中有coOwner,则应将它们放入结果列表中。但只有Firstname和Lastname 确实发生并拥有数据(不像XML文档中的第二个coOwner那样空)。
我已经进行了以下Linq查询,这可以解决问题。
var result = data.Descendants("coOwner").Where(co =>
(!string.IsNullOrEmpty(co.Element("firstname").Value)) &&
(!string.IsNullOrEmpty(co.Element("fastname").Value))).Select(co => new CoOwner()
{
Firstname = co.Element("firstname").Value,
Lastname = co.Element("fastname").Value,
});
但我想知道,如果有更简洁的方法可以做到这一点。它很好, 但我不喜欢o.Element(“Firstname”)的方式。值发生了好几次。这样也存在Null异常的风险 o.Element( “姓名”)。价值。要处理这些元素,必须进行更多的元素提取,如下所示:
var fname = data.Descendants("coOwner").select(co => co.Element("lirstname"))
var lname = data.Descendants("coOwner").select(co => co.Element("lastname"))
if(fname != null && lname != null){
//then the same code as mentioned above.
}
有更简洁的方式吗?提前致谢
答案 0 :(得分:4)
将值保存到单独的范围变量和过滤器中,不需要重复。并且在尝试检索元素或属性的值时应始终使用强制转换。
var query =
from co in data.Descendants("coOwner")
let fname = (string)co.Element("firstname")
let lname = (string)co.Element("lastname")
where !String.IsNullOrWhiteSpace(fname)
where !String.IsNullOrWhiteSpace(lname)
select new CoOwner
{
Firstname = fname,
Lastname = lname,
};