用于将XML格式的HL7(2.x版)消息解析为Python对象的库

python-xml-hl7的Python项目详细描述


PyPi versionBuild Statuscodecov

python-xml-hl7

用于将XML格式的HL7(2.x版)消息解析为Python对象的库

安装

您可以使用pip:

pip install python-xml-hl7

或者从git存储库:

git clone https://github.com/weynelucas/python-xml-hl7.git
cd python-xml-hl7
python setup.py install

快速启动

例如,让我们创建一个hl7消息:

message="""<ORU_R01><MSH><MSH.1>|</MSH.1><MSH.2>^~\\&amp;</MSH.2><MSH.3>hospital</MSH.3><MSH.7>20180703111743</MSH.7><MSH.9><MSH.9.1>ORU</MSH.9.1><MSH.9.2>R01</MSH.9.2></MSH.9><MSH.12>2.3.1</MSH.12></MSH><PID><PID.2>shenzhen</PID.2><PID.3>1</PID.3><PID.5>libang</PID.5><PID.7>20091010</PID.7><PID.8>M</PID.8></PID><PV1><PV1.2>U</PV1.2><PV1.18>adult</PV1.18><PV1.44>20180726181346</PV1.44></PV1><OBR><OBR.7>20180703111743</OBR.7></OBR><OBX><OBX.2>NM</OBX.2><OBX.3>SPO2</OBX.3><OBX.5>96</OBX.5><OBX.6>%</OBX.6><OBX.7>90-100</OBX.7></OBX><OBX><OBX.2>NM</OBX.2><OBX.3>PR</OBX.3><OBX.5>68</OBX.5><OBX.6>bpm</OBX.6><OBX.7>50-120</OBX.7></OBX><OBX><OBX.2>NM</OBX.2><OBX.3>SYS</OBX.3><OBX.5>131</OBX.5><OBX.6>mmHg</OBX.6><OBX.7>90-160</OBX.7><OBX.14>20180703111713</OBX.14></OBX><OBX><OBX.2>NM</OBX.2><OBX.3>DIA</OBX.3><OBX.5>85</OBX.5><OBX.6>mmHg</OBX.6><OBX.7>50-90</OBX.7><OBX.14>20180703111713</OBX.14></OBX><OBX><OBX.2>NM</OBX.2><OBX.3>MAP</OBX.3><OBX.5>100</OBX.5><OBX.6>mmHg</OBX.6><OBX.7>60-110</OBX.7><OBX.14>20180703111713</OBX.14></OBX><OBX><OBX.2>NM</OBX.2><OBX.3>NIBP_PR</OBX.3><OBX.5>73</OBX.5><OBX.6>bpm</OBX.6><OBX.7>50-120</OBX.7><OBX.14>20180703111713</OBX.14></OBX></ORU_R01>"""

调用hl7.xml.parse()命令转换字符串消息

fromhl7.xmlimportparseh=parse(message)

此命令返回一个Message实例,包装一系列Segment对象。是否可以在段上迭代或匹配特定的段:

>>>list(h)# List all message segments[<hl7.xml.containers.MSH>,<hl7.xml.containers.PID>,<hl7.xml.containers.PV1>,<hl7.xml.containers.OBR>,<hl7.xml.containers.OBX:SPO2>,<hl7.xml.containers.OBX:PR>,<hl7.xml.containers.OBX:SYS>,<hl7.xml.containers.OBX:DIA>,<hl7.xml.containers.OBX:MAP>,<hl7.xml.containers.OBX:NIBP_PR>]>>>h[0]# Get 1st message segment<hl7.xml.containers.MSH>>>>h['OBX']# Find all OBX segments[<hl7.xml.containers.OBX:SPO2>,<hl7.xml.containers.OBX:PR>,<hl7.xml.containers.OBX:SYS>,<hl7.xml.containers.OBX:DIA>,<hl7.xml.containers.OBX:MAP>,<hl7.xml.containers.OBX:NIBP_PR>]

一个Segment实例包装了一系列Field对象,您可以对它们进行迭代:

>>>list(h[2])# List all fields for 3rd message segment (PV1)[<hl7.xml.containers.Field:PV1.2>,<hl7.xml.containers.Field:PV1.18>,<hl7.xml.containers.Field:PV1.44>]>>>list(h[5])# List all fields for 6th message segment (OBX)[<hl7.xml.containers.Field:OBX.2>,<hl7.xml.containers.Field:OBX.3>,<hl7.xml.containers.Field:OBX.5>,<hl7.xml.containers.Field:OBX.6>,<hl7.xml.containers.Field:OBX.7>]>>>h[5][0].value'NM'>>>h[5][2].value'62'

有不同类型的Segment,它们是:MSHPIDPV1OBROBX。它们中的每一个都有helper方法来从其各自的hl7段检索数据,而无需迭代其Field对象

msh

>>>msh=h['MSH'][0]>>>(msh.field_separator,msh.encoding_chars,msh.sending_application,msh.datetime,msh.version,msh.message_type)('|','^~\\&','hospital',datetime.datetime(2018,7,3,11,17,43),'2.3.1',('ORU','R01'))

PID

>>>pid=h['PID'][0]>>>(pid.id,pid.id_list,pid.name,pid.birthdate,pid.gender)('shenzhen','1','libang',datetime.datetime(2009,10,10,0,0),'M')

pv1

>>>pv1=h['PV1'][0]>>>(pv1.patient_class,pv1.patient_class_display,pv1.patient_type,pv1.patient_type_display,pv1.assigned_patient_location,pv1.admit_datetime)('U','Unknown','adult','Adult',None,datetime.datetime(2018,7,26,18,13,46))

obr

>>>obr=h['OBR'][0]>>>obr.datetimedatetime.datetime(2018,7,3,11,17,43)

obx

>>>obx=h['OBX'][3]# 4th OBX instance>>>(obx.identifier,obx.value_type,obx.value,obx.units,obx.reference_range,obx.datetime)('DIA','NM',85,'mmHg',(50,90),datetime.datetime(2018,7,3,11,17,13))

要通过标识符在Message中查找OBX段或值,请使用get_obxget_obx_value方法:

>>>h.get_obx('DIA')<hl7.xml.containers.OBX:DIA>>>>h.get_obx('DIA').value85>>>h.get_obx_value('SPO2')96

网络客户端

python-xml-hl7提供一个简单的网络(tcp/ip)客户端,它从Alfamed病人监视器(如VITA 200e)读取hl7消息

fromhl7.xml.clientimportAlfamedClientclient=AlfamedClient('169.254.215.35')# Default communication port is 9100client.read_message()# By default, HL7 messages are converted into Message objectsclient.read_message(parse_message=False)# Returns the original HL7 message as string

AlfamedClient用无效主机地址实例化的对象将引发AttributeError

测试

您可以使用unittest模块在本地运行测试

cd python-xml-hl7
python -m unittest tests

如果所有测试都通过,您将看到如下成功消息:

.................
----------------------------------------------------------------------
Ran 17 tests in 0.007s

OK

注释

  • hl7 v2消息的xml编码规则规范可以找到here
  • 对于任何建议、功能或错误修复,都可以报告问题here。或提交拉取请求
  • 对于以原始流格式处理HL7消息,请使用诸如python-hl7HL7apy

发行说明

  • 1.0.0-首次发布
  • 1.1.0-使用get_obxget_obx_value
  • 查找OBX
  • 1.2.0-客户端和容器对象的字符串表示法
  • 1.3.0-添加travis和codecov支持

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Spring启动测试中的java MockBean注释导致NonuniqueBeandDefinitionException   java Spring Hateoas调试模板不能为null   递归培根游戏Java程序?   java在Android中保存少量数据(对象)的最简单方法是什么?   异常处理Java中finally块的要点是什么?   是java。util。货币真的是工厂方法模式吗?   java如何输入字符以停止循环   java如何对流的某些部分执行缩减操作   java new Gson()。单例类的toJson(object)返回null   java Itext泰米尔字体显示不正确   java运行时。getRuntime()。gpg命令不起作用的exec()   java如何在preparedstatemenet中将字符连接到SQL字符串   java将同一实体的多个表示形式与lazyload合并时出错   JavaSpring、Hibernate和JPA:在entitymanager上调用persist似乎并没有提交到数据库   java osgi r6服务。组成部分注释属性列表