C# 使用LINQ选择是否存在XML元素

C# 使用LINQ选择是否存在XML元素,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我有以下xml。在本例中,As addr是空的,但大多数情况下它包含街道、城市、州等元素。我如何确保它的存在。导致现在LINQ查询抛出错误“对象引用未设置为对象的实例” 自动生成 作者自动= (来自cdafile.Root.Elements中的c(ns+作者) 选择新作者 { streetAddressLine=(字符串)c.Element(ns+“assignedAuthor”).Element(ns+“addr”).Element(ns

我有以下xml。在本例中,As addr是空的,但大多数情况下它包含街道、城市、州等元素。我如何确保它的存在。导致现在LINQ查询抛出错误“对象引用未设置为对象的实例”


自动生成
作者自动=
(来自cdafile.Root.Elements中的c(ns+作者)
选择新作者
{                           
streetAddressLine=(字符串)c.Element(ns+“assignedAuthor”).Element(ns+“addr”).Element(ns+“streetAddressLine”).Value,
城市=(字符串)c.Element(ns+“assignedAuthor”).Element(ns+“addr”).Element(ns+“city”).Value,
state=(字符串)c.Element(ns+“assignedAuthor”).Element(ns+“addr”).Element(ns+“state”).Value,
postalCode=(字符串)c.Element(ns+“assignedAuthor”).Element(ns+“addr”).Element(ns+“postalCode”).Value,
country=“美国”
}).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();
或者您可以这样使用和编写它(假定没有其他地址子元素会给您带来与所需结果不同的结果):


ns变量中有什么?它仍然显示错误,我想是因为根本不存在streetAddressLine元素。您是否将内联if应用于所有属性(城市、州、postalCode)?谢谢!看起来这就是我正在寻找的。这是有效的,但我有一些其他元素,其中有一些HTML作为内容。它剥离HTML内容,只返回文本。我能做什么?@user1649941你应该把它作为一个单独的问题发布。但据我所知,HTML不是正确的XML,因此必须将整个文件视为HTML。@user1649941您可以尝试使用扩展名GetElement获取包含HTML的父元素,如果该元素不存在,它将查找或创建该元素,因此您没有空引用。然后,如果可能的话,您可以操纵该元素以获取它包含的HTML。在没有看到相关节点的情况下,我可以给出一些建议,这就是为什么您应该发布另一个问题来解决您的问题。
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();