1

次の 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();
4

2 に答える 2

0

パスの一部が存在しない場合にデフォルト値を提供するこれらの拡張機能を使用できます。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();
于 2013-07-06T15:53:56.533 に答える
0

1 つのアプローチは、インラインを使用することです。

    streetAddressLine = (string)c.Element(ns + "assignedAuthor").Element(ns + "addr") == null ? "" : c.Element(ns + "assignedAuthor").Element(ns + "addr").Element(ns + "streetAddressLine").Value
于 2013-07-06T14:06:45.403 に答える