lxml.etree.ElementTree变音符号乱码:指定编码为何不生效?
Python 3.6 实现JSON转可浏览器预览的XML格式
嘿,我来给你梳理下用Python 3.6把UTF-8编码的标准JSON响应转换成能在Firefox、Chrome、IE或Edge里正常查看的XML格式的实现思路,全程只用lxml的两个模块搞定,不用额外工具:
核心工具选择
- 用
lxml.builder来快速给JSON数据套上XML标签,它的语法简洁,很适合构建嵌套的XML结构; - 用
lxml.etree.ElementTree的write方法生成XML文件,这个方法能帮我们处理好编码和浏览器兼容性问题。
关键实现要点
- 编码一致性:因为JSON是标准UTF-8编码,生成XML时必须指定
encoding='UTF-8',还要开启xml_declaration=True,这样浏览器能正确识别编码,避免乱码; - XML结构可读性:开启
pretty_print=True,生成的XML会自动换行缩进,在浏览器里查看时结构更清晰; - 特殊字符处理:
lxml会自动转义JSON里的特殊字符(比如&、<、>),不用担心破坏XML的合法性。
示例测试代码
from lxml import etree from lxml.builder import E import json # 模拟UTF-8编码的JSON响应数据 json_response = ''' { "response": { "status": "success", "data": { "id": 123, "content": "Hello & World!", "tags": ["python", "xml", "json"] } } } ''' # 解析JSON为Python数据结构 parsed_data = json.loads(json_response) # 构建XML节点 root = E('api_response') status = E('status', parsed_data['response']['status']) data_node = E('data') data_node.append(E('id', str(parsed_data['response']['data']['id']))) data_node.append(E('content', parsed_data['response']['data']['content'])) tags = E('tags') for tag in parsed_data['response']['data']['tags']: tags.append(E('tag', tag)) data_node.append(tags) # 组装XML树 root.append(status) root.append(data_node) # 生成可浏览器查看的XML文件 tree = etree.ElementTree(root) tree.write( 'result.xml', encoding='UTF-8', xml_declaration=True, pretty_print=True )
浏览器查看注意事项
生成的XML文件直接用浏览器打开就能看到格式化后的结构啦,要是遇到显示异常,先检查XML文件开头的声明是否正确——应该有<?xml version='1.0' encoding='UTF-8'?>这一行,这是浏览器正确解析的关键。
内容的提问来源于stack exchange,提问作者RolfBly
相关产品推荐
相关产品推荐

