【问题标题】:Read XML to Datatable dynamically动态读取 XML 到数据表
【发布时间】:2014-10-08 13:00:47
【问题描述】:

我有以下 xml 字符串,我正在尝试根据一组动态列查询数据表。我对 xml 没有任何控制权,它是从外部源传入的。

XML:

<VmapMessage>
  <MessageBody>
    <ClaimId>346117125.01*BR</ClaimId>
    <LastName>SMITH</LastName>
    <FirstName>JOHN</FirstName>
    <ClaimNumber>20222128369154</ClaimNumber>
    <DOI>20131006</DOI>
    <SOJ>OH</SOJ>
    <EmailType>V2</EmailType>
    <AdjusterName>STEPHAN WILLIAMS</AdjusterName>
    <AdjusterId>TIWI</AdjusterId>
    <AdjusterEmail>STEPHAN.WILLIAMS@COMP.COM</AdjusterEmail>
    <SendAdjusterEmailAsHTML>T</SendAdjusterEmailAsHTML>
    <AdjusterTimeZone>-8</AdjusterTimeZone>
    <AdjusterDelegateName></AdjusterDelegateName>
    <AdjusterDelegateId></AdjusterDelegateId>
    <AdjusterDelegateEmail></AdjusterDelegateEmail>
    <SendAdjusterDelegateEmailAsHTML></SendAdjusterDelegateEmailAsHTML>
    <AdjusterDelegateTimeZone></AdjusterDelegateTimeZone>
    <AdjusterDelegateStartDate></AdjusterDelegateStartDate>
    <AdjusterDelegateEndDate></AdjusterDelegateEndDate>
    <SupervisorEmail>BOB.SMITH@COMP.COM</SupervisorEmail>
    <SendSupervisorEmailAsHTML>T</SendSupervisorEmailAsHTML>
    <CarrierEmployee>N</CarrierEmployee>
    <EncryptedSubId>232228520C6IB</EncryptedSubId>
    <ChampionEmail>AMY.SMITH@COMP.COM</ChampionEmail>
    <MasterCarrierInfo>
      <MasterCarrierCode>COMP</MasterCarrierCode>
      <CarrierName>COMP'S</CarrierName>
      <VitalPointURL></VitalPointURL>
      <EmployerCode>00000016</EmployerCode>
      <OfficeCode>COMPREDCA</OfficeCode>
    </MasterCarrierInfo>
    <Details>
      <Detail>
        <Id>0005111*17228*DR3211</Id>
        <ClaimId></ClaimId>
        <RxNumber>0005073</RxNumber>
        <RxDate>20140725</RxDate>
        <DateEntered>20140917</DateEntered>
        <FillNumber></FillNumber>
        <ServiceType></ServiceType>
        <NDC>72344299106</NDC>
        <GPI>75100012333720</GPI>
        <DrugClass>*SKELETAL MUSCLE RELAXANTS*</DrugClass>
        <ServiceDescription>CYCLOBENZAPR CRE 20MG/GM</ServiceDescription>
        <Quantity>60</Quantity>
        <UnitOfMeasure></UnitOfMeasure>
        <NumberOfRefills>0</NumberOfRefills>
        <DaysSupply>30</DaysSupply>
        <BillToCarrierAmount>0</BillToCarrierAmount>
        <InvoiceAmount>188.77</InvoiceAmount>
        <PrescriberNumber></PrescriberNumber>
        <PrescriberName>SMITH, JOHN F MD</PrescriberName>
        <PrescriberPhone></PrescriberPhone>
        <DAW>0</DAW>
        <BrandGeneric>MULTISOURCE</BrandGeneric>
        <ICD9></ICD9>
        <DiagnosisDesc></DiagnosisDesc>
        <HCPC></HCPC>
        <RejectCode>75S75</RejectCode>
        <RejectReason>FM - Missing Pharmacy Telephone NumberüNDC NOT COVERED</RejectReason>
        <PharmacyName>JOHN SMITH MD</PharmacyName>
        <PharmacyPhysAddress1>6222 N SECOND ST</PharmacyPhysAddress1>
        <PharmacyPhysAddress2></PharmacyPhysAddress2>
        <PharmacyPhysCity>FRESNO</PharmacyPhysCity>
        <PharmacyPhysState>CA</PharmacyPhysState>
        <PharmacyPhysZip>937105446</PharmacyPhysZip>
        <PharmacyPhone>9493342222</PharmacyPhone>
        <StSub>0</StSub>
        <Reg>0</Reg>
        <MedStat>Y</MedStat>
        <RegExcp>0</RegExcp>
        <RejectCodes></RejectCodes>
        <EmployerName>COMP'S WEST STORES, INC.</EmployerName>
        <FirstBlock></FirstBlock>
        <Blocks>
          <Block>
            <BlockCode>75*ndc</BlockCode>
            <BlockReason>NDC NOT COVERED</BlockReason>
            <Instance>1</Instance>
          </Block>
          <Block>
            <BlockCode>76*ndc</BlockCode>
            <BlockReason>NDC NOT KNOWN</BlockReason>
            <Instance>2</Instance>
          </Block>
        </Blocks>
      </Detail>
      <Detail>
        <Id>0005111*17228*DR3212</Id>
        <ClaimId></ClaimId>
        <RxNumber>0005074</RxNumber>
        <RxDate>20140725</RxDate>
        <DateEntered>20140917</DateEntered>
        <FillNumber></FillNumber>
        <ServiceType></ServiceType>
        <NDC>72344299102</NDC>
        <GPI>12345678901234</GPI>
        <DrugClass>*SKELETAL MUSCLE RELAXANTS*</DrugClass>
        <ServiceDescription>CYCLOBENZAPR CRE 20MG/GM</ServiceDescription>
        <Quantity>60</Quantity>
        <UnitOfMeasure></UnitOfMeasure>
        <NumberOfRefills>0</NumberOfRefills>
        <DaysSupply>30</DaysSupply>
        <BillToCarrierAmount>0</BillToCarrierAmount>
        <InvoiceAmount>188.77</InvoiceAmount>
        <PrescriberNumber></PrescriberNumber>
        <PrescriberName>SMITH, JOHN F MD</PrescriberName>
        <PrescriberPhone></PrescriberPhone>
        <DAW>0</DAW>
        <BrandGeneric>MULTISOURCE</BrandGeneric>
        <ICD9></ICD9>
        <DiagnosisDesc></DiagnosisDesc>
        <HCPC></HCPC>
        <RejectCode>75S75</RejectCode>
        <RejectReason>FM - Missing Pharmacy Telephone NumberNDC NOT COVERED</RejectReason>
        <PharmacyName>JOHN SMITH MD</PharmacyName>
        <PharmacyPhysAddress1>6222 N SECOND ST</PharmacyPhysAddress1>
        <PharmacyPhysAddress2></PharmacyPhysAddress2>
        <PharmacyPhysCity>FRESNO</PharmacyPhysCity>
        <PharmacyPhysState>CA</PharmacyPhysState>
        <PharmacyPhysZip>937105446</PharmacyPhysZip>
        <PharmacyPhone>9493342222</PharmacyPhone>
        <StSub>0</StSub>
        <Reg>0</Reg>
        <MedStat>Y</MedStat>
        <RegExcp>0</RegExcp>
        <RejectCodes></RejectCodes>
        <EmployerName>COMP'S WEST STORES, INC.</EmployerName>
        <FirstBlock></FirstBlock>
        <Blocks>
          <Block>
            <BlockCode>75*ndc</BlockCode>
            <BlockReason>NDC NOT COVERED</BlockReason>
            <Instance>1</Instance>
          </Block>
        </Blocks>
      </Detail>
    </Details>
  </MessageBody>
</VmapMessage>

输出中所需字段的动态列表(这是从数据库中读取的并且可以更改):

ParameterName   ParameterPath
AdjusterEmail   //MasterCarrierInfo//AdjusterEmail
EmpCode         //MasterCarrierInfo//EmployerCode
SOJ             //MessageBody//SOJ
DOI             //MessageBody//DOI
GPI             //MessageBody//Details//Detail//GPI
BlockCode       //MessageBody//Details//Detail//Blocks//Block//BlockCode

我需要将其读入如下所示的表格中:

AdjusterEmail                 EmpCode   SOJ  DOI       GPI             BlockCode
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  75*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  76*ndc
STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  12345678901234  75*ndc

每个 MessageBody 可以有多个详细记录,每个 Detail 可以有多个 Block 记录

我真的不知道从哪里开始,我尝试了很多不同的东西,包括 linq(我不知道)并且无法弄清楚......

【问题讨论】:

  • 尝试按照以下步骤使用:stackoverflow.com/questions/3458566/…
  • 您可以将整个 XML blob 作为 SQL Server 中的 XML 字段传递给它,然后使用 XQuery 从传入的 XML 变量中进行选择,并使用该选择语句在表中插入适当的值:@ 987654322@
  • @Jonathan Fields 你解决了吗?
  • 还没解决,下面的解决方案只是带回一条记录。每个消息体可以有多个详细信息,每个详细信息可以有多个块。请参阅上面更新的 xml 和更新的输出。

标签: c# xml linq


【解决方案1】:

您可以简单地使用下面的方法并将您的 xml 文件路径作为输入传递

 DataSet ds = new DataSet();
 ds.ReadXml("Your File Path");

您将拥有数据集,其中将包含您的 xml 的相应数据集对象。

【讨论】:

    【解决方案2】:

    有效:

     XDocument xd = null;
            using (StreamReader oReader = new StreamReader(xmlFilePath, Encoding.GetEncoding("ISO-8859-1")))
            {
                xd = XDocument.Load(oReader);
            }
    
     var records = from root in xd.Descendants("MessageBody")
                          from details in root.Elements("Details").Elements("Detail")
                          select new
                          {
                              AdjusterEmail = root.Element("AdjusterEmail").Value,
                              EmpCode = root.Element("MasterCarrierInfo").Element("EmployerCode").Value,
                              SOJ = root.Element("SOJ").Value,
                              DOI = root.Element("DOI").Value,
                              GPI = details.Element("GPI").Value,
                              BlockCode = details.Element("Blocks").Element("Block").Element("BlockCode").Value
    
                          };
    

    创建数据表来保存记录:

            DataTable dt = new DataTable();
            dt.Columns.Add("AdjusterEmail", typeof(string));
            dt.Columns.Add("EmpCode", typeof(string));
            dt.Columns.Add("SOJ", typeof(string));
            dt.Columns.Add("DOI", typeof(string));
            dt.Columns.Add("GPI", typeof(string));
            dt.Columns.Add("BlockCode", typeof(string));
    
            DataRow dr = null;
            foreach (var readValue in records)
            {
                dr = dt.NewRow();
                dr["AdjusterEmail"] = readValue.AdjusterEmail;
                dr["EmpCode"] = readValue.EmpCode;
                dr["SOJ"] = readValue.SOJ;
                dr["DOI"] = readValue.DOI;
                dr["GPI"] = readValue.GPI;
                dr["BlockCode"] = readValue.BlockCode;
                dt.Rows.Add(dr);
             }
    

    dt 包含如下:

    AdjusterEmail              EmpCode   SOJ  DOI       GPI             BlockCode
    STEPHAN.WILLIAMS@COMP.COM  00000016  OH   20131006  75100012333720  75*ndc
    STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  75100012333720  76*ndc
    STEPHAN.WILLIAMS@example.COM  00000016  OH   20131006  12345678901234  75*ndc
    

    【讨论】:

    • 这仍然只带回一条记录。每个消息体可以有多个详细信息,每个详细信息可以有多个块。请参阅上面编辑的 xml。
    • 字段列表也是动态的,我是从数据库中读取的,所以下次可能会有更多的字段或更少的字段。
    猜你喜欢
    • 2013-02-20
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多