2013-07-06 49 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