Reputation: 3
I'm new to working with FHIR and need help with parsing a FHIR-Bundle (xml) in C#. I'm able to get the URL of the patient- or organization-resource from the composition-resource in the bundle, but need to store the values of the resources (e.g. name of patient) into variables to work with them, e.g. store them to an SQL database. Can you help me please? Thx in advance!
<Bundle xmlns="http://hl7.org/fhir">
<id value="0428d416-149e-48a4-977c-394887b3d85c" />
<meta>
<lastUpdated value="2021-04-06T08:30:00Z" />
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.0.1" />
</meta>
<identifier>
<system value="https://gematik.de/fhir/NamingSystem/PrescriptionID" />
<value value="160.100.000.000.002.36" />
</identifier>
<type value="document" />
<timestamp value="2021-04-06T08:30:00Z" />
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/Composition/a054c2f3-0123-4d33-a0b3-bedec2f7d1ea" />
<resource>
<Composition>
<id value="a054c2f3-0123-4d33-a0b3-bedec2f7d1ea" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.0.1" />
</meta>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN" />
<code value="00" />
</valueCoding>
</extension>
<status value="final" />
<type>
<coding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART" />
<code value="e16A" />
</coding>
</type>
<subject>
<reference value="Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" />
</subject>
<date value="2021-04-05T08:00:00Z" />
<author>
<reference value="Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359" />
<type value="Practitioner" />
</author>
<author>
<type value="Device" />
<identifier>
<system value="https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer" />
<value value="Y/410/2107/36/999" />
</identifier>
</author>
<title value="elektronische Arzneimittelverordnung" />
<custodian>
<reference value="Organization/d2b30a70-9830-4968-ab97-688472b6f9a3" />
</custodian>
<section>
<code>
<coding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" />
<code value="Prescription" />
</coding>
</code>
<entry>
<!-- Referenz auf Verordnung (MedicationRequest) -->
<reference value="MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86" />
</entry>
</section>
<section>
<code>
<coding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" />
<code value="Coverage" />
</coding>
</code>
<entry>
<!-- Referenz auf Krankenkasse/Kostenträger -->
<reference value="Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" />
</entry>
</section>
</Composition>
</resource>
</entry>
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86" />
<resource>
<MedicationRequest>
<!-- Beispiel MedicationRequest für eine PZN-Verordnung -->
<id value="06dc1594-509a-4f4c-ada7-dfd477a02d86" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.1" />
</meta>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment" />
<code value="1" />
</valueCoding>
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee">
<valueBoolean value="false" />
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG">
<valueBoolean value="false" />
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription">
<extension url="Kennzeichen">
<valueBoolean value="false" />
</extension>
</extension>
<status value="active" />
<intent value="order" />
<medicationReference>
<reference value="Medication/f568397d-7ba2-46ac-904b-02caec933b42" />
</medicationReference>
<subject>
<reference value="Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" />
</subject>
<authoredOn value="2020-04-06" />
<requester>
<reference value="Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359" />
</requester>
<insurance>
<reference value="Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" />
</insurance>
<dosageInstruction>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag">
<valueBoolean value="true" />
</extension>
<text value="2mal tägl. 5ml" />
</dosageInstruction>
<dispenseRequest>
<quantity>
<value value="1" />
<system value="http://unitsofmeasure.org" />
<code value="{Package}" />
</quantity>
</dispenseRequest>
<substitution>
<allowedBoolean value="true" />
</substitution>
</MedicationRequest>
</resource>
</entry>
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/Medication/f568397d-7ba2-46ac-904b-02caec933b42" />
<resource>
<Medication>
<id value="f568397d-7ba2-46ac-904b-02caec933b42" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.0.1" />
</meta>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category" />
<code value="00" />
</valueCoding>
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine">
<valueBoolean value="false" />
</extension>
<extension url="http://fhir.de/StructureDefinition/normgroesse">
<valueCode value="N1" />
</extension>
<code>
<coding>
<system value="http://fhir.de/CodeSystem/ifa/pzn" />
<code value="08585997" />
</coding>
<text value="Prospan® Hustensaft 100ml N1" />
</code>
<form>
<coding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM" />
<code value="FLE" />
</coding>
</form>
</Medication>
</resource>
</entry>
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" />
<resource>
<Patient>
<id value="512ab5bc-a7ab-4fd7-81cc-16a594f747a6" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3" />
</meta>
<identifier>
<type>
<coding>
<system value="http://fhir.de/CodeSystem/identifier-type-de-basis" />
<code value="GKV" />
</coding>
</type>
<system value="http://fhir.de/NamingSystem/gkv/kvid-10" />
<value value="M310119800" />
</identifier>
<name>
<use value="official" />
<family value="Erbprinzessin von und zu der Schimmelpfennig-Hammerschmidt Federmannssohn">
<extension url="http://fhir.de/StructureDefinition/humanname-namenszusatz">
<valueString value="Erbprinzessin" />
</extension>
<extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-prefix">
<valueString value="von und zu der" />
</extension>
<extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name">
<valueString value="Schimmelpfennig-Hammerschmidt Federmannssohn" />
</extension>
</family>
<given value="Ingrid" />
</name>
<birthDate value="2010-01-31" />
<address>
<type value="both" />
<line value="Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C">
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber">
<valueString value="149-C" />
</extension>
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName">
<valueString value="Anneliese- und Georg-von-Groscurth-Plaetzchen" />
</extension>
</line>
<line value="5. OG - Hinterhof">
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator">
<valueString value="5. OG - Hinterhof" />
</extension>
</line>
<city value="Bad Homburg" />
<postalCode value="60437" />
<country value="D" />
</address>
</Patient>
</resource>
</entry>
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359" />
<resource>
<Practitioner>
<id value="e33d2afd-44c8-462b-80e5-52dbe5ebf359" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3" />
</meta>
<identifier>
<type>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/v2-0203" />
<code value="LANR" />
</coding>
</type>
<system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR" />
<value value="456456534" />
</identifier>
<name>
<use value="official" />
<family value="Weber">
<extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name">
<valueString value="Weber" />
</extension>
</family>
<given value="Maximilian" />
<prefix value="Dr.">
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier">
<valueCode value="AC" />
</extension>
</prefix>
</name>
<qualification>
<code>
<coding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type" />
<code value="00" />
</coding>
</code>
</qualification>
<qualification>
<code>
<text value="Facharzt für Kinder- und Jugendmedizin" />
</code>
</qualification>
</Practitioner>
</resource>
</entry>
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/Organization/d2b30a70-9830-4968-ab97-688472b6f9a3" />
<resource>
<Organization>
<id value="d2b30a70-9830-4968-ab97-688472b6f9a3" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3" />
</meta>
<identifier>
<type>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/v2-0203" />
<code value="BSNR" />
</coding>
</type>
<system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR" />
<value value="687777700" />
</identifier>
<name value="Kinderarztpraxis" />
<telecom>
<system value="phone" />
<value value="09411234567" />
</telecom>
<address>
<type value="both" />
<line value="Yorckstraße 15">
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber">
<valueString value="15" />
</extension>
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName">
<valueString value="Yorckstraße" />
</extension>
</line>
<line value="Hinterhaus">
<extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator">
<valueString value="Hinterhaus" />
</extension>
</line>
<city value="Regensburg" />
<postalCode value="93049" />
<country value="D" />
</address>
</Organization>
</resource>
</entry>
<entry>
<fullUrl value="http://pvs.praxis.local/fhir/Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" />
<resource>
<Coverage>
<id value="df0f2536-97b9-4bae-99cc-83ba2e8371e4" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3" />
</meta>
<extension url="http://fhir.de/StructureDefinition/gkv/besondere-personengruppe">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE" />
<code value="00" />
</valueCoding>
</extension>
<extension url="http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP" />
<code value="00" />
</valueCoding>
</extension>
<extension url="http://fhir.de/StructureDefinition/gkv/wop">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP" />
<code value="72" />
</valueCoding>
</extension>
<extension url="http://fhir.de/StructureDefinition/gkv/versichertenart">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS" />
<code value="3" />
</valueCoding>
</extension>
<status value="active" />
<type>
<coding>
<system value="http://fhir.de/CodeSystem/versicherungsart-de-basis" />
<code value="GKV" />
</coding>
</type>
<beneficiary>
<reference value="Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" />
</beneficiary>
<period>
<end value="2040-04-01" />
</period>
<payor>
<identifier>
<system value="http://fhir.de/NamingSystem/arge-ik/iknr" />
<value value="108416214" />
</identifier>
<display value="AOK Bayern" />
</payor>
</Coverage>
</resource>
</entry>
This is what I got so far ... I also have the problem to get the URLs of the author (Practitioner) or section (MedicationRequest).
using Hl7.Fhir.Model;
using Hl7.Fhir.Rest;
using Hl7.Fhir.Serialization;
using System;
using System.IO;
using System.Xml;
namespace ReadXML
{
class Program
{
static void Main(string[] args)
{
XmlReader xr = XmlReader.Create(
new StreamReader(@"<Path>"));
var parser = new FhirXmlParser();
Bundle bundle = parser.Parse<Bundle>(xr);
Console.WriteLine(bundle);
var composition = (Composition)bundle.Entry[0].Resource;
ResourceReference subjectRef = composition.Subject;
//ResourceReference authorRef = composition.Author;
ResourceReference custodianRef = composition.Custodian;
//ResourceReference medRef = composition.Section;
var absUriPatient = subjectRef.GetAbsoluteUriForReference(bundle.Entry[0].FullUrl);
//var absUriPractitioner = authorRef.GetAbsoluteUriForReference(bundle.Entry[0].FullUrl);
var absUriOrganization = custodianRef.GetAbsoluteUriForReference(bundle.Entry[0].FullUrl);
Console.WriteLine($"Patient-URL: {absUriPatient}");
//Console.WriteLine($"Practitioner-URL: {absUriPractitioner}");
Console.WriteLine($"Organization-URL: {absUriOrganization}");
var patient = (Bundle.EntryComponent)bundle.FindEntry(absUriPatient);
Console.WriteLine(patient); //How to get patient.Name ???
Console.ReadKey();
}
}
}
Upvotes: 0
Views: 3953
Reputation: 3
The solution from Marco worked very well. I'm now able to get the properties of patient and even practitioner.
But what if the resource reference is in a resource itself, like the following:
<resource>
<MedicationRequest xmlns="http://hl7.org/fhir">
<id value="e930cdee-9eb5-4b44-88b5-2a18b69f3b9a" />
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.1" />
</meta>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment">
<valueCoding>
<system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment" />
<code value="0" />
</valueCoding>
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee">
<valueBoolean value="false" />
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG">
<valueBoolean value="false" />
</extension>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription">
<extension url="Kennzeichen">
<valueBoolean value="false" />
</extension>
</extension>
<status value="active" />
<intent value="order" />
<medicationReference>
<reference value="Medication/5fe6e06c-8725-46d5-aecd-e65e041ca3de" />
</medicationReference>
<subject>
<reference value="Patient/9774f67f-a238-4daf-b4e6-679deeef3811" />
</subject>
<authoredOn value="2021-03-30" />
<requester>
<reference value="Practitioner/20597e0e-cb2a-45b3-95f0-dc3dbdb617c3" />
</requester>
<insurance>
<reference value="Coverage/1b1ffb6e-eb05-43d7-87eb-e7818fe9661a" />
</insurance>
<dosageInstruction>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag">
<valueBoolean value="true" />
</extension>
<text value="1-0-1-0" />
</dosageInstruction>
<dispenseRequest>
<quantity>
<value value="1" />
<system value="http://unitsofmeasure.org" />
<code value="{Package}" />
</quantity>
</dispenseRequest>
<substitution>
<allowedBoolean value="true" />
</substitution>
</MedicationRequest>
</resource>
I need to get the reference of medicationReference to get to the Medication resource. How to do that?
Upvotes: 0
Reputation: 91
You could do the following:
var entry = bundle.FindEntry(absUriPatient).SingleOrDefault();
var patient = entry.Resource as Patient;
Console.WriteLine($"Given name of patient: {patient?.Name[0].Given.First() }");
So the bundle.FindEntry
gives you a list bundle entries. Then take the single one and cast the entry.resource
to a Patient
. Then you have all the properties of patient.
For more information about handling with Bundle
see the Firely documentation page: https://docs.fire.ly/projects/Firely-NET-SDK/model/bundles.html
Upvotes: 2