2013-07-06 89 views
1

我有以下xml。由於addr在這種情況下是空的,但大部分時間它都有像街道,城市,州這樣的元素。我如何確保它存在。原因現在LINQ查詢會引發錯誤「對象引用未設置爲對象的實例」。使用LINQ選擇是否存在XML元素

<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(); 
+0

你怎麼在有ns變量? –

回答

0

您可以使用these extensions,會給你一個默認值,如果路徑中的任何部分不存在。 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(); 

或者你可以使用the whole library寫這種方式(假定沒有其他需要什麼,會給你不同的結果地址的子元素):

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(); 
+0

謝謝!看起來這是我正在尋找的東西。 – user1649941

+0

這工作,但我有一些其他元素有一些HTML作爲內容。它剝離出HTML內容並返回文本。我可以做什麼 ? – user1649941

+0

@ user1649941您應該將其作爲單獨的問題發佈。然而,從我的理解來看,HTML不是合適的XML,因此必須將整個文件視爲HTML。 –

0

一個方法是使用內聯如果

streetAddressLine = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr") == null ? "" : c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "streetAddressLine").Value 
+0

它仍然顯示錯誤,我想因爲根本不存在streetAddressLine元素。 – user1649941

+0

你是否應用內聯如果所有屬性(城市,州,郵政編碼)? – MEYWD