java 读取xml_两行代码,实现xml转dict,dict转object

d4c30f294e3c77e16aadccb1013a6d8e.png

近期使用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)

运行结果

571ef711c13e581612bdde6bcdb09aa9.png

可以看到读取和转化非常方便,在读取某个字段的时可以充分利用IDE的联想功能,编码出错的概率大幅下降。


关注我的公众号 牛仔说,第一时间接收到我们更新文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值