问题描述
有没有办法通过独立于所使用的FHIR版本的方式将fhir包从json转换为xml?
我认为firenet的.net fhir api可以做到,但是任何给定版本的api似乎都是特定于FHIR发行版的。
解决方法
问题是FHIR捆绑包(或任何资源)隐式始终具有版本。理由是每个FHIR版本都具有(或可以具有)不同的基础数据模型。
但是,可以使用.NET FHIR API(特别是软件包https://www.nuget.org/packages/Hl7.Fhir.Serialization)进行转换,并且版本差异最小。
以下代码使用与版本无关的ISourceNode
(http://docs.simplifier.net/fhirnetapi/parsing/isourcenode.html)
using Hl7.Fhir.ElementModel;
using Hl7.Fhir.Serialization;
var xml = "<Patient xmlns=\"http://hl7.org/fhir\"><identifier><use value=\"official\" /></identifier></Patient>";
var patientNode = FhirXmlNode.Parse(xml);
var typedElement = patientNode.ToTypedElement();
var json = typedElement.ToJson();
不过,上面的代码有一个问题,因为VS会告诉您。使用不带参数的ToTypedElement()
是危险的,因为忽略版本是危险的。不过,它在很多情况下都可以使用,如果对您来说足够好,那可能就是要走的路。
一个更安全的解决方案是使用相同的代码,但另外使用所谓的IStructureDefinitionSummaryProvider
(为歉意表示歉意)为API提供特定的版本信息。可以在特定于版本的API库中找到此接口的实现,例如https://www.nuget.org/packages/Hl7.Fhir.R4。
using Hl7.Fhir.ElementModel;
using Hl7.Fhir.Serialization;
using Hl7.Fhir.Specification;
var xml = "<Patient xmlns=\"http://hl7.org/fhir\"><identifier><use value=\"official\" /></identifier></Patient>";
var patientNode = FhirXmlNode.Parse(xml);
var summaryProvider = new PocoStructureDefinitionSummaryProvider();
var typedElement = patientNode.ToTypedElement(summaryProvider);
var json = typedElement.ToJson();
您可能可以根据要读取的输入的某些属性来注入这些PocoStructureDefinitionSummaryProviders
。例如,这就是我们在Vonk FHIR server中所做的事情。
FHIR Java验证程序可以对任何版本执行此操作。根据您需要使用它的情况可能合适