Python解析带xmlns的FHIR Binary响应 提取base64内容存为本地Word文档
问题核心原因
- 此前解析失败的核心原因:FHIR返回的XML带有默认命名空间
http://hl7.org/fhir,字符串拆分容易截断长base64内容,直接用ElementTree查找不带命名空间的<content>节点无法匹配到目标值。 - 临时写文件的问题:写入的是XML格式文本,并非Word文件的二进制数据,Word无法识别自然会出现格式异常。
可行实现方案(Python)
用标准库xml.etree.ElementTree做命名空间感知解析,提取base64值后解码写文件,完整代码如下:
import xml.etree.ElementTree as ET import base64 # 接口返回的XML字节串 xml_response = response.content # 解析XML根节点 root = ET.fromstring(xml_response) # 声明FHIR命名空间映射,解决节点匹配不到的问题 ns = {"fhir": "http://hl7.org/fhir"} # 提取contentType,可自动识别文件类型 content_type = root.find("fhir:contentType", ns).attrib["value"] # 提取content节点的base64值,清理所有空白字符(避免XML格式化换行导致解码失败) base64_str = "".join(root.find("fhir:content", ns).attrib["value"].split()) # 解码得到真实文件二进制 file_binary = base64.b64decode(base64_str) # 按MIME类型匹配后缀,写入本地文件 suffix_map = { "application/msword": "doc", "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "docx" } file_suffix = suffix_map.get(content_type, "bin") with open(f"/tmp/metadata.{file_suffix}", "wb") as f: f.write(file_binary)
关键注意事项
- 必须在节点查找时带上FHIR命名空间,直接写
root.find("content")会返回空,这是此前解析失败的核心原因。 - 提取base64值后必须清理所有空白字符:FHIR序列化XML时可能会把长base64内容拆成多行,属性值中会混入换行、缩进,不清理会直接导致base64解码报错。
- 不要直接把接口响应的XML内容写入文件,必须经过base64解码后才是真实的文件二进制数据。
内容的提问来源于stack exchange,提问作者Iain
相关产品推荐
相关产品推荐

