C# 试图使用OOPFactory使用EligibilityBenefitDocument分析271项好处

C# 试图使用OOPFactory使用EligibilityBenefitDocument分析271项好处,c#,xml,xslt,edi,C#,Xml,Xslt,Edi,我正在尝试使用OOPFactory解析271个文件。(这里的源代码:)我目前正在努力的部分是获取福利信息。(我可以很好地获得订户和源信息) 我遵循了这篇文章中的说明: ()我可以获取包含订阅者和源信息的EligibilityBenefitDocument,但文档上的福利信息最终为null、空或其他一些没有帮助的值 我已经查看了原始的271个数据,并验证了我要查找的信息确实在那里。(作为参考,我从多个付款人处运行了多个文件) 我已经在X12SteamReader和X12Parser运行时对它们进行

我正在尝试使用OOPFactory解析271个文件。(这里的源代码:)我目前正在努力的部分是获取福利信息。(我可以很好地获得订户和源信息)

我遵循了这篇文章中的说明: ()我可以获取包含订阅者和源信息的EligibilityBenefitDocument,但文档上的福利信息最终为null、空或其他一些没有帮助的值

我已经查看了原始的271个数据,并验证了我要查找的信息确实在那里。(作为参考,我从多个付款人处运行了多个文件)

我已经在X12SteamReader和X12Parser运行时对它们进行了跟踪,并验证了数据是否一直通过解析器。看起来解析器工作得很好。我不完全确定EligiblityBenefit文档应该如何生成。它似乎使用了某种xslt翻译,但对我的271个文件来说似乎效果不太好。我已将此调整应用于xslt文件()——它清除了一些空值,但仍然无法正确解析

接下来我应该看什么

  • 我可能正在使用不受支持的EDI格式。我不知道如何判断是否是这样
  • 我已经编程很长时间了,但是我从来没有使用过.NET的XSLT特性。有没有人有关于从哪里开始的好链接
  • 如果有人有一个快速的解决方案,那就太棒了
谢谢

========= 编辑1:

以下是我的代码,它可以让事情开始:

    Dim ediFileString = path_to_my_file
    Dim fstream = New FileStream(ediFileString, FileMode.Open, FileAccess.Read)
    Dim service = New EligibilityTransformationService()
    Dim benefitDoc = service.Transform271ToBenefitResponse(fstream)
    Dim responses = benefitDoc.EligibilityBenefitResponses
我从VB.NET而不是C#调用它,但是考虑到它都编译成MSIL,并且源、接收器和订户属性都正常工作,我不认为这是BenefitInfos失败的原因

========= 编辑2:包括更多的代码,以响应请求,获取我正在尝试做的事情的更多细节

    Dim ediFileString = path_to_my_file
    Dim fstream = New FileStream(ediFileString, FileMode.Open, FileAccess.Read)
    Dim service = New EligibilityTransformationService()
    Dim benefitDoc = service.Transform271ToBenefitResponse(fstream)
    Dim responses = benefitDoc.EligibilityBenefitResponses

    Dim strClient = ""


    For Each client In benefitDoc.EligibilityBenefitResponses
        Try
            strClient = "MemberID: " + tidyNull(client.Subscriber.MemberId) + " Transaction Control Number: " + tidyNull(client.TransactionControlNumber) + Constants.vbCrLf
        Catch ex As Exception

        End Try
        Try
            strClient += "Member Name: " + tidyNull(client.Subscriber.Name.FirstName) + " " + tidyNull(client.Subscriber.Name.MiddleName) + " " + tidyNull(client.Subscriber.Name.LastName) + Constants.vbCrLf
        Catch ex As Exception

        End Try
        Try
            strClient += "Payer Name: " + tidyNull(client.Source.Name.LastName) + Constants.vbCrLf
        Catch ex As Exception

        End Try
        Try
            strClient += "Date of Birth: " + tidyNull(client.Subscriber.SerializableDateOfBirth) + Constants.vbCrLf
        Catch ex As Exception

        End Try
        Try
            strClient += "Address: " + tidyNull(client.Subscriber.Address.Line1)
            strClient += " " + tidyNull(client.Subscriber.Address.Line2) + " " + Constants.vbCrLf
            strClient += "Address: " + tidyNull(client.Subscriber.Address.City) + ", " + tidyNull(client.Subscriber.Address.StateCode) + ", " + tidyNull(client.Subscriber.Address.PostalCode) + Constants.vbCrLf
        Catch ex As Exception

        End Try

        Dim results As List(Of EligibilityBenefitInformation)


        Try
            results = client.BenefitInfos.FindAll(AddressOf searchPlanActive)
            If results.Count > 0 Then
                strClient += "Active Coverage!" + Constants.vbCrLf

            End If
        Catch ex As Exception
            strClient += "Coverage Type: Couldn't be found"
        End Try

        For Each benefit In client.BenefitInfos
            If benefit.Amount IsNot Nothing Then
                strClient &= " Code: " & benefit.Amount
            End If

            strClient &= " Percentage: " & benefit.Percentage
            Try
                strClient &= " CoverageLevel: " & benefit.CoverageLevel.Description
            Catch ex As Exception

            End Try


            Try
                strClient &= " InPlanNetwork: " & benefit.InPlanNetwork.Description
            Catch
            End Try

            Try
                strClient &= " PlanCoverageDescription: " & benefit.PlanCoverageDescription
            Catch ex As Exception

            End Try

            'strClient &= " Messages: " & benefit.Messages.FindLast()

            Try
                strClient &= " Amount: " & benefit.Amount.Value
            Catch ex As Exception

            End Try


            'strClient &= " Amount: " & benefit.AdditionalInfos
            strClient &= Constants.vbCrLf



        Next
        MsgBox(strClient)
    Next
============ 编辑3:

我正在尝试处理一个5010文件;OOPFactory表示,“内置规范包含所有4010标准和一些5010规范”https://x12parser.codeplex.com/(由于缺乏信誉点,还无法发布其他工作链接)

======= 编辑4:

故障似乎发生在第35行的EligibilityTransformationService.cs中。正确的信息正在将其转换为XML,但没有正确地进行反序列化

var response = EligibilityBenefitDocument.Deserialize(responseXml);
我正在调查原因

===== 编辑5: 在EligiblityTransformationService.cs中,从第32行开始,XML被转换,然后反序列化。有问题的数据最后一次出现在responseXml变量的第35行,但它从未进入response对象

看起来XSLT文件有问题

            transform.Transform(XmlReader.Create(new StringReader(xml)), new XsltArgumentList(), outputStream);
            outputStream.Position = 0;
            string responseXml = new StreamReader(outputStream).ReadToEnd();
            var response = EligibilityBenefitDocument.Deserialize(responseXml);

实际上,我在办公室的工作中也使用了同样的方法。我们经常遇到的问题是,我们收到的响应是
null
或随机值。我们要做的是继续搜索患者信息,直到找到尽可能多的可能的结果。例如,如果我们想查找保单日期信息,我们使用:

var service = new EligibilityTransformationService();
EligibilityBenefitDocument eligibilityBenefitDocument = service.Transform271ToBenefitResponse(response271Stream);
eligibilityBenefitDocument.EligibilityBenefitResponses = eligibilityBenefitDocument.EligibilityBenefitResponses;

foreach (EligibilityBenefitInformation benefitInfo in eligibilityBenefitDocument.EligibilityBenefitResponses[0].BenefitInfos)
       {               
           if (benefitInfo.InfoType.Code == "V")
               return Tuple.Create(false, "Medicare cannot process");

           if (benefitInfo.InfoType.Code == "6")
               return Tuple.Create(false, "Inactive Policy");


           if (benefitInfo.InsuranceType.Code == "HN" || benefitInfo.InsuranceType.Code == "12")
           {
               try
               {
                   return Tuple.Create(false, "MADV " + benefitInfo.Identifications[0].Id + " " + benefitInfo.RelatedEntities[0].Name.LastName);
               }
               catch
               {
                   return Tuple.Create(false, "MADV");
               }
           }
       }
我们仍在不断地处理这些响应,以尽可能准确地获取它们,但不幸的是,代码似乎可以针对不同的付款人进行更改,在得到它们可能的响应变化之前,找出每个响应的工作方式有点费时

编辑:

如果响应中没有benefitInfos,则表示您提交的患者信息不正确。我的程序中有以下检查:

if(eligiblityBenefitDocument.EligiblityBenefitResponses[0].BenefitInfos.Count() < 1)
     return "Subscriber Info Invalid"
if(eligiblityBenefitDocument.EligiblityBenefitResponses[0].BenefitInfos.Count()<1)
返回“订户信息无效”

是。这和我现在做的很相似。然而,所有响应的BenefitInfos属性总是空的。你见过吗?我更新了我的答案。如果你能给我一个你在你的项目中所做的例子,我也许能在一个更具体的答案上帮助你。确保您也输入了关于患者的所有可能的政策信息。例如,我使用firstname、lastname、policy#、dateOfBirth和ServiceType18(因为这是专门针对我的目的的),听起来您已经习惯了应用程序往返进行EDI调用并实时解析响应。我计划最终将两者结合起来,但要等到解析部分开始工作之后。现在,我正在处理一个.txt文件,其中271个响应,每行存储1个响应。我制作了这个文件,我可以检查它以查看响应是否完整。因此,我不认为这是一个不准确的政策信息的问题,因为我没有在这个小应用程序处理任何政策信息。然而,我已经继续编辑了最初的帖子,以包含我正在做的更多细节。