2011-04-11 162 views
1

我遇到了CoveredPersons和CoveredPerson標記值的問題。使用帶有深嵌套循環的LINQ進行XML解析

<Header> 
    <Model_Name>Sample Model Name</Model_Name> 
</Header> 
<Data> 
    <ContractNumber>0-99-54321</ContractNumber> 
    <InitialEffectiveDate>11/04/2011</InitialEffectiveDate> 
    <ContractEndDate></ContractEndDate> 
    <RenewalDate>11/04/2021</RenewalDate> 
    <NextContractBirthdate>11/04/2011</NextContractBirthdate> 
    <SmokerClassification>Non Smoker</SmokerClassification> 
    <BillingFrequency>Annually</BillingFrequency> 
    <PremiumWithTax>270.23</PremiumWithTax> 
    <AnnualPolicyFee>100.00</AnnualPolicyFee> 
    <PayerRelationToSubscriber></PayerRelationToSubscriber> 
    <PayerasPerson> 
     <FirstName>Steve</FirstName> 
     <MiddleName1></MiddleName1> 
     <LastName>Jordan</LastName> 
     <SecondLastName></SecondLastName> 
    </PayerasPerson> 
    <SubscribedOptions> 
     <OfferedEntity> 
      <Code>A-1</Code> 
      <Name>Sample Entity</Name> 
     </OfferedEntity> 
     <CoveredPersons> 
      <CoveredPerson> 
       <FirstName>Steve</FirstName> 
       <MiddleName1></MiddleName1> 
       <LastName>Square</LastName> 
       <BirthDate>01/01/1980</BirthDate> 
       <Gender>Male</Gender> 
      </CoveredPerson> 
      <EliminationPeriod></EliminationPeriod> 
     </CoveredPersons> 
     <CoverageAmount>75,000.00</CoverageAmount> 
     <PremiumWithTax>61.50</PremiumWithTax> 
     <InitialEffectiveDate>11/04/2011</InitialEffectiveDate> 
     <ContractEndDate></ContractEndDate> 
     <TerminationDate></TerminationDate> 
     <ExpirationDateToConvert>01/01/2040</ExpirationDateToConvert> 
     <CoveredPersonCount>1</CoveredPersonCount> 
    </SubscribedOptions> 
    <SubscribedOptions> 
     <OfferedEntity> 
      <Code>B-1</Code> 
      <Name>Sample Entity 2</Name> 
     </OfferedEntity> 
     <CoveredPersons> 
      <CoveredPerson> 
       <FirstName>Juan</FirstName> 
       <MiddleName1></MiddleName1> 
       <LastName>Osorio</LastName> 
       <BirthDate>01/01/1980</BirthDate> 
       <Gender>Male</Gender> 
      </CoveredPerson> 
      <EliminationPeriod></EliminationPeriod> 
     </CoveredPersons> 
     <CoverageAmount>5,000.00</CoverageAmount> 
     <PremiumWithTax>0.00</PremiumWithTax> 
     <InitialEffectiveDate>11/04/2011</InitialEffectiveDate> 
     <ContractEndDate></ContractEndDate> 
     <TerminationDate></TerminationDate> 
     <ExpirationDateToConvert>01/01/2040</ExpirationDateToConvert> 
     <CoveredPersonCount>1</CoveredPersonCount> 
    </SubscribedOptions>   
    <Subscriber> 
     <FirstName>Juan</FirstName> 
     <LastName>Osorio</LastName> 
     <MiddleName1></MiddleName1> 
     <SecondLastName>Uno</SecondLastName> 
     <Gender>Male</Gender> 
     <Age>31</Age> 
    </Subscriber> 
    <OfferedEntity> 
     <Name>Sample Base Entity</Name> 
     <Code>CODE-54321</Code> 
    </OfferedEntity> 
</Data> 

這是我到目前爲止有:


foreach (var xSubscribedOptions in (from suboptions in xDoc.Descendants("SubscribedOptions") 
             from suboptionsOffEntity in xDoc.Descendants("SubscribedOptions").Descendants("OfferedEntity") 
             from suboptionsCovPerson in xDoc.Descendants("SubscribedOptions").Descendants("CoveredPerson") 
             from suboptionsCovPersonCovPerson in xDoc.Descendants("CoveredPersons").Descendants("CoveredPerson") 
             select new 
             { 
              OfferedEntityCode = suboptionsOffEntity.Element("Code").Value, 
              OfferedEntityName = suboptionsOffEntity.Element("Name").Value, 
              SubscribedOptionsCoverageAmount = suboptions.Element("CoverageAmount").Value, 
              SubscribedOptionsPremiumWithTax = suboptions.Element("PremiumWithTax").Value, 
              SubscribedOptionsInitialEffectiveDate = suboptions.Element("InitialEffectiveDate").Value, 
              SubscribedOptionsContractEndDate = suboptions.Element("ContractEndDate").Value, 
              SubscribedOptionsTerminationDate = suboptions.Element("TerminationDate").Value, 
              SubscribedOptionsExpirationDateToConvert = suboptions.Element("ExpirationDateToConvert").Value, 
              SubscribedOptionsCoveredPersonCount = suboptions.Element("CoveredPersonCount").Value, 
              CoveredPersonFirstName = suboptionsCovPersonCovPerson.Element("FirstName").Value, 
              CoveredPersonMiddleName1 = suboptionsCovPersonCovPerson.Element("MiddleName1").Value, 
              CoveredPersonLastName = suboptionsCovPersonCovPerson.Element("LastName").Value, 
              CoveredPersonBirthDate = suboptionsCovPersonCovPerson.Element("BirthDate").Value, 
              CoveredPersonGender = suboptionsCovPersonCovPerson.Element("Gender").Value, 
              CoveredPersonEliminationPeriod = suboptionsCovPerson.Element("EliminationPeriod").Value           })) 
    { } 
+0

'後裔()'大致相當於''// XPath中 - 它的價格昂貴,所以不要使用它,除非真的需要。要枚舉直接的孩子,使用'Elements()'。 – 2011-04-12 00:12:02

回答

1

你可以使用

CoveredPersonFirstName = suboptions.XPathSelectElement("./CoveredPersons/CoveredPerson/FirstName").Value 
CoveredPersonLastName = suboptions.XPathSelectElement("./CoveredPersons/CoveredPerson/LastName").Value 

等,爲每個需要從CoveredPerson標籤檢索元素

+0

我沒有XPathSelectElement可用。 – user702756 2011-04-11 21:31:41

+0

您需要爲XPathSelectElement擴展方法包含using語句,如下所示:using System.Xml.XPath; – 2011-04-11 23:05:53

0

Inlcude

using System.Xml.XPath; 

爲了得到XPath擴展方法,如XPathSelectElement