2011-02-06 4 views
1

私は次のXML文書を考えてみましょう:LINQでXML文書を照会する方法は?

<response> 
    <businessEntity> 
     <ABN> 
     <identifierValue></identifierValue> 
     <isCurrentIndicator></isCurrentIndicator> 
     <replacedIdentifierValue xsi:nil="true" /> 
     <replacedFrom></replacedFrom> 
     </ABN> 
     <entityStatus> 
     <entityStatusCode> </entityStatusCode> 
     <effectiveFrom></effectiveFrom> 
     <effectiveTo></effectiveTo> 
     </entityStatus> 
     <entityType> 
     <entityTypeCode> </entityTypeCode> 
     <entityDescription> </entityDescription> 
     </entityType> 
     <goodsAndServicesTax> 
      <effectiveFrom></effectiveFrom> 
      <effectiveTo></effectiveTo> 
     </goodsAndServicesTax> 
     <legalName> 
      <givenName> </givenName> 
      <otherGivenName /> 
      <familyName> </familyName> 
      <effectiveFrom></effectiveFrom> 
      <effectiveTo></effectiveTo> 
     </legalName> 
     <mainBusinessPhysicalAddress> 
      <stateCode> </stateCode> 
      <postcode></postcode> 
      <effectiveFrom></effectiveFrom> 
      <effectiveTo></effectiveTo> 
     </mainBusinessPhysicalAddress> 
    </businessEntity> 
</response> 

私は、たとえばgivenName属性とFamilyNameで取得したい場合は、私はこれを行うことができます。

私は、テーブルにアクセスし、取り込むことができます
var businesses = doc.Descendants(ns + "businessEntity") 
      .Elements(ns + "legalName") 
      .Select(node => new 
      { 
       effectiveFrom = node.Element(ns + "effectiveFrom").Value, 
       givenName = node.Element(ns + "givenName").Value, 
       familyName = node.Element(ns + "familyName").Value, 
      }).ToList(); 

しかし、私はどのように文書全体を照会して、ABNやentityTypeのような、私が望むすべてのノードを得るかはわかりません。私はリストを作成し、各兄弟のコードの一部をlegalNameに複製する必要がありますか?

ありがとうございます。

答えて

1

あなたは、各サブ要素は、あなたがこのアプローチを試すことができます1回だけ発生することを想定することができる場合:

var businesses = (
    from node in doc.Descendants(ns + "businessEntity") 
    let legalName = node.Element(ns + "legalName") 
    let abn = node.Element(ns + "ABN") 
    // etc... 
    select new 
    { 
     LegalName = new 
     { 
      EffectiveFrom = (string)legalName.Element(ns + "effectiveFrom"), 
      GivenName = (string)legalName.Element(ns + "givenName"), 
      FamilyName = (string)legalName.Element(ns + "familyName"), 
     }, 
     Abn = new 
     { 
      IdentifierValue = (string)abn.Element(ns + "identifierValue"), 
      IsCurrentIndicator = (string)abn.Element(ns + "isCurrentIndicator"), 
      ReplacedFrom = (string)abn.Element(ns + "replacedFrom"), 
     }, 
     // etc... 
    }).ToList(); 


Console.WriteLine(businesses[0].LegalName.GivenName); 
Console.WriteLine(businesses[0].Abn.IsCurrentIndicator); 

このデータは外で使用されようとしている場合にも、コンクリートの型の代わりに、anonyous種類を使用して検討する必要がありますメソッドを使用して、XMLを解析します。

+0

ありがとう、期待どおりに動作しますが、値が空であればエラーが発生しますが、これをどうすれば最もうまく処理できますか? – Nick

+0

@ニック:どの部分が「空」であり、具体的には「空」(完全に欠落していますが、空の文字列を含んでいますか? 'foo.Element(...)。Value 'を'(string)foo.Element(...) 'に変更してみることもできます。それでも問題が解決しない場合は、何が空で、どのように空であるかを詳細にお知らせください。説明する最も簡単な方法は、失敗したXML文書、試行したコード、エラーメッセージを投稿することです。あなたがそれをすることができないなら、それを言葉で説明しようとすることができます。 –

+0

例えばgivennameに値が含まれていない場合はnullreferenceexceptionがコード – Nick

関連する問題