2016-05-05 6 views
1

私は次のようにLINQを経由して読んでいるXMLののキューがあります提供します サンプルいくつかのXMLファイルでXMLLINQ XMLをListに読み込むと、不明なノードのオブジェクト参照が返されますか?

[XML Link](http://www.hattem.nl/roonline/0269/plannen/NL.IMRO.0269.OV165-/NL.IMRO.0269.OV165-VG01/g_NL.IMRO.0269.OV165-VG01.xml) 

C#コード

List<String> PlanInfo = new List<string>(); 
    XDocument xdoc = null; 
    XNamespace ns = null; 
    try 
    { 
     //List<String> PlanValuesList = new List<string>(); 
     xdoc = XDocument.Load(gLink); 
     ns = xdoc.Root.Name.Namespace; 

     var test = (
      from planInfo in xdoc.Descendants(ns + "Plan").Descendants(ns + "Eigenschappen") 
      from Onderdelen in xdoc.Descendants(ns + "Onderdelen") 
      select new 
      { 
       Naam = (string)planInfo.Element(ns + "Naam").Value ?? string.Empty, 
       Type = (string)planInfo.Element(ns + "Type").Value ?? string.Empty, 
       Status = (string)planInfo.Element(ns + "Status").Value ?? string.Empty, 
       Datum = (Convert.ToString(planInfo.Element(ns + "Datum").Value).IndexOf("T") > 0) ? (string)planInfo.Element(ns + "Datum").Value.Substring(0, Convert.ToString(planInfo.Element(ns + "Datum").Value).IndexOf("T")) : (string)planInfo.Element(ns + "Datum").Value ?? string.Empty, 
       Versie = (string)(planInfo.Element("VersieIMRO") ?? planInfo.Element("VersieGML")) ?? string.Empty,//Convert.ToString(planInfo.Element(ns + "VersieIMRO").Value) ?? String.Empty, 
       VersiePraktijkRichtlijn = (string)planInfo.Element(ns + "VersiePraktijkRichtlijn").Value ?? string.Empty, 
       BasisURL = (string)Onderdelen.Attribute("BasisURL") 
      }).ToList(); 

     foreach (var item in test) 
     { 
      PlanInfo.Add(item.Naam); 
      PlanInfo.Add(item.Type); 
      PlanInfo.Add(item.Status); 
      PlanInfo.Add(item.Datum); 
      PlanInfo.Add(item.Versie); 
      PlanInfo.Add(item.VersiePraktijkRichtlijn); 
      PlanInfo.Add(item.BasisURL); 
     } 
} 
    catch (Exception ex) 
    { 
     //Error reading GeleideFormulier link for the plan and manifest 
     throw;//Just throwing error here, as it is catched in the called method. 
    } 

    return PlanInfo; 

"versieIMRO" タグ "はversieGML" となりを、私はオブジェクト参照としてエラーオブジェクトのインスタンスに設定されていません。

"versieIMRO"の代わりに "versieGML"タグがあるかどうか確認する方法を教えてください。 他のXMLではタグ名が異なる場合、どのように対処するのですか?

+0

はどのようにあなたの 'xml'のように見えるのでしょうか? –

+0

問題のxmlサンプルを追加しました。 –

答えて

2

要素が見つからない場合にあなたはNREを避けるために、文字列(すでにタイプstringのないXElement.Valueプロパティ)へXElementをキャストしたい:

Version = (string)x.Element("version"), 

あなたはケースversion要素でversionXを使用したい場合見つからない場合、この方法を試してみてください。

Version = (string)(x.Element("version") ?? x.Element("versionX")), 

もう一度、をキャストののプロパティは役に立たず、違いはありません。あなたはstring.Empty代わりnullの取得したい場合は、再度、ヌル・合体演算子を使用します。

Version = (string)(x.Element("version") ?? x.Element("versionX")) ?? string.Empty, 
+0

nopeは同じエラーを返します。 –

+0

@NitinSoniすべての 'x.Element(" ... ").Value'にこのアプローチを適用しましたか? – har07

+0

planInfo.Element( "..")を使用してコードを編集しました。値を使用せずに値nullを与えます –

関連する問題