近期使用Python对接微信开放平台,发现微信开放平台发送通知事件基本都是用xml格式的,如
- 授权结果通知
- 创建小程序结果通知
- 消息通知
- 事件通知
在解析这些xml之前思考了一下,如何才能像java一样将xml直接转换为object,方便内容解析和程序判断。
经过研究发现通过两个组件就可以非常优雅的实现这个目标。
- pydantic, 因为我现在用FastAPI框架开发api服务,本身就已经大量使用了pydantic来实现json、dict和model的转化。在类型转化和字段校验方面非常强大,用起来非常顺手。项目首页:https://pydantic-docs.helpmanual.io/
- simplexml,今天发现的一个非常轻量的xml读取和生成工具。项目首页:https://github.com/marcelnicolay/simplexml
两个工具结合之后,样例代码如下:
from pydantic import BaseModel
import simplexml
# 需要解析的xml内容
xml = """<xml>
<AppId><![CDATA[wx889188a59adb59d6]]></AppId>
<CreateTime>1596534634</CreateTime>
<InfoType><![CDATA[notify_third_fasteregister]]></InfoType>
<status>0</status>
<msg><![CDATA[OK]]></msg>
<appid><![CDATA[wxc50axxxxx]]></appid>
<auth_code><![CDATA[queryauthcode@@@SbA6yBmrVQexxxxxxxxxKO-xU-U-wFPDDOPo]]></auth_code>
<info>
<name><![CDATA[杭州九牛网络科技有限公司]]></name>
<code><![CDATA[8133010]]></code>
<code_type>1</code_type>
<legal_persona_wechat><![CDATA[lixxxxxxxx]]></legal_persona_wechat>
<legal_persona_name><![CDATA[NNNN]]></legal_persona_name>
<component_phone><![CDATA[13300000000]]></component_phone>
</info>
</xml>"""
# 定义Object对象
class CreateMiniProgramInfoNode(BaseModel):
name: str
code: str
code_type: str
legal_persona_wechat: str
legal_persona_name: str
component_phone: str
# 定义Object对象
class CreateMiniProgramNotifyRequest(BaseModel):
AppId: str
CreateTime: int
InfoType: str
appid: str
status: str
auth_code: str
msg: str
info: CreateMiniProgramInfoNode
# 读取xml,生成dict
data = simplexml.loads(xml)
print('xml -> dict:', data)
# 通过dict 生成notify对象
notify = CreateMiniProgramNotifyRequest(**data['xml'])
# 生成json
print('dict -> object:', notify.json())
# 读取notify对象的重点信息
print('object.info.code:', notify.info.code)
print('object.info.name:', notify.info.name)
运行结果
可以看到读取和转化非常方便,在读取某个字段的时可以充分利用IDE的联想功能,编码出错的概率大幅下降。
关注我的公众号 牛仔说,第一时间接收到我们更新文章。