用于将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第三方库


热门话题
另一个布局上的java Access文本视图   安卓在Java中,我什么时候应该用*导入整个包,而不是从包中导入单个对象?   JavaSpringMVC:请解释@RequestParam和@ModelAttribute之间的区别   java Flyway Ant构建未迁移   java“没有可供下载的文件”   如何解决java静态名称冲突?   我是否需要框架来补充JavaEE6、JSF2 WebApp?哪一个?   java如何传递HttpServletRequest参数?   只有java的视频不会播放声音。为什么?   java在Maven3中做这样的属性重写工作吗?   java计算Android中两个标记之间的距离   Javascript页面加载中的java复选框持久性问题   java序列化lambda函数的映射   java使用jersey、maven和eclipse配置swagger   java我可以在oncreate方法之外使用setContentView吗?   java在使用JAXRS响应类返回实体时遇到异常   java规范了加密和解密文本的文本编写方法   java如何更改ChoiceBox的默认大小?   java在Android上暂时禁用PIN/密码锁