提交FHIR Consent Resource出现Hl7.Fhir.Serialization.ComplexTypeReader错误
非技术岗人员暂代工作提交如下Consent FHIR Resource,该资源在公共校验工具校验无报错,但通过内部集成器调用HL7校验器时出现Hl7.Fhir.Serialization.ComplexTypeReader、“Encountered unknown member 'Scope'”、“Encountered unknown member 'Patient'”等报错:
<Consent xmlns="http://hl7.org/fhir"> <id value="123" /> <status value="inactive" /> <scope> <coding> <system value="http://terminology.hl7.org/CodeSystem/consentscope" /> <code value="patient-privacy" /> </coding> </scope> <category> <coding> <system value="http://loinc.org" /> <code value="59284-0" /> </coding> </category> <patient> <reference value="Patient/41" /> <display value="John Stifiles" /> </patient> <policyRule> <coding> <system value="http://terminology.hl7.org/CodeSystem/consentpolicycodes" /> <code value="cric" /> </coding> </policyRule> <provision> <type value="deny" /> <period> <start value="2021-09-27" /> <end value="2021-09-27" /> </period> </provision> </Consent>
- 先确认资源本身没问题,你提交的Consent XML资源符合FHIR R4及以上版本规范,公共校验工具无报错已经验证了资源本身的合法性,无需修改资源内容。
- 校验你方集成器调用的HL7校验器绑定的FHIR版本是否匹配
如果你方校验器使用的是STU3及更早的FHIR版本,旧版本的Consent资源定义中没有
scope、patient这类字段,会直接抛出未知成员报错。确认版本后将校验器升级到和资源匹配的R4/R4B版本即可解决。 - 检查集成器的资源转发逻辑是否篡改了字段格式
报错提示的未知成员是首字母大写的
Scope、Patient,但你提交的XML中字段均为小写开头,大概率是集成器在调用校验器前自动做了节点名首字母大写的转换,导致校验器无法识别不符合FHIR规范的字段名。你可以打印集成器传递给校验器的实际入参,确认字段名是否被篡改,关闭不必要的字段格式转换逻辑即可。 - 检查校验器的XML解析配置
你遇到的
Hl7.Fhir.Serialization.ComplexTypeReader是.NET版FHIR类库的序列化报错,若校验器初始化时没有开启XML节点名大小写忽略配置,或者错误加载了非对应版本的FHIR结构定义包,也会触发该类错误。你可以调整校验器配置开启XML大小写兼容,同时确认加载的是对应FHIR版本的官方结构定义包。 - 检查资源命名空间是否被篡改
若集成器在转发过程中删除了XML根节点的
http://hl7.org/fhir命名空间,会导致校验器无法按照FHIR资源规则解析节点,同样会抛出未知成员报错,确认入参的根节点命名空间是否保留完整即可。 - 快速定位方案:跳过集成器,直接将该XML资源导入你方使用的HL7校验器本地工具进行校验,如果直接校验无报错,即可100%定位问题出在集成器的资源转发处理逻辑,无需再排查资源和校验器本身的配置问题。
内容的提问来源于stack exchange,提问作者Arshdeep Singh

