[英]Select if exist XML Element using LINQ
我有以下xml。 由於addr在這種情況下為空,但大多數時候它具有諸如street,city,state之類的元素。 我如何確保它存在。 現在的原因是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();
一種方法是使用內聯
streetAddressLine = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr") == null ? "" : c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "streetAddressLine").Value
您可以使用這些擴展名 ,如果路徑中的任何部分都不存在,則會為您提供默認值。 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();
或者,您可以使用整個庫並以這種方式編寫(假設沒有其他address子元素可以為您提供與期望的結果不同的結果):
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.