2011-02-06 56 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> 

如果我想獲得給定名稱和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

如果你可以假設,各個子元件只發生一次,你可以試試這個方法:

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 2011-02-06 13:20:57