使用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();

使用LINQ选择“是否存在XML元素”

如果路径中不存在任何部分,您可以使用这些扩展,这些扩展将为您提供默认值。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