使用LINQ选择“是否存在XML元素”
本文关键字:是否存在 XML 元素 存在 是否 LINQ 选择 使用 | 更新日期: 2023-09-27 18:21:13
我有以下xml。由于addr在这种情况下是空的,但大多数时候它包含街道、城市、州等元素。我该如何确保它的存在。原因现在LINQ查询抛出一个错误"对象引用未设置为对象实例"
<author>
<time value="20120620153233"/>
<assignedAuthor>
<id/>
<addr/>
<telecom value="tel:+1-781-271-3000"/>
<assignedPerson>
<name>Auto Generated</name>
</assignedPerson>
</assignedAuthor>
</author>
tbAuthor autor =
(from c in cdafile.Root.Elements(ns + "author")
select new tbAuthor
{
streetAddressLine = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "streetAddressLine").Value,
city = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "city").Value,
state = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "state").Value,
postalCode = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "postalCode").Value,
country = "US"
}).FirstOrDefault();
如果路径中不存在任何部分,您可以使用这些扩展,这些扩展将为您提供默认值。Get中的最后一个路径部分可以是元素或属性。它还将为您找出名称空间。
tbAuthor author =
(from c in cdafile.Root.Elements(ns + "author")
select new tbAuthor
{
streetAddressLine = c.Get("assignedAuthor/addr/streetAddressLine", "default"),
city = c.Get("assignedAuthor/addr/city", "default"),
state = c.Get("assignedAuthor/addr/state", "default"),
postalCode = c.Get("assignedAuthor/addr/postalCode", "default"),
country = "US"
})
.FirstOrDefault();
或者,您可以使用整个库并以这种方式编写(假设没有其他地址子元素会给您带来与所需不同的结果):
tbAuthor author =
(from c in cdafile.Root.Elements(ns + "author")
select new tbAuthor
{
streetAddressLine = c.XGetElement(".//streetAddressLine", "default"),
city = c.XGetElement(".//city", "default"),
state = c.XGetElement(".//state", "default"),
postalCode = c.XGetElement(".//postalCode", "default"),
country = "US"
})
.FirstOrDefault();
如果
streetAddressLine = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr") == null ? "" : c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "streetAddressLine").Value