Python格式化xml并转为字典

xml处理

一、格式化xml
xml_text = '<?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Do not forget the meeting!</body></note>'
url = "http://web.chacuo.net/formatxml"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
    "Host": "web.chacuo.net",
    "X-Requested-With": "XMLHttpRequest",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
}
form_data = {"data": xml_text, "type": "format", "beforeSend": "undefined"}
resp = requests.post(url, data=form_data, headers=headers, timeout=20)
print(resp.json()['data'][0])
二、将xml转为字典(import xmltodict)
  • xmltodict.parse()方法实现对xml字符串转为字典
  • xmltodict.unparse()方法可以将字典转换为xml字符串
import xmltodict
format_ed_xml = '<?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Do not forget the meeting!</body></note>'
dict_xml = xmltodict.parse(format_ed_xml)
print(dict_xml)
# OrderedDict([('note', OrderedDict([('to', 'George'), ('from', 'John'), ('heading', 'Reminder'), ('body', 'Do not forget the meeting!')]))])
三、 xml.parsers.expat.ExpatError: XML or text declaration not at start of entity报错解决方法
  • 第一种:按步骤一的方式,先将xml字符串格式化,然后再转字典;
  • 第二种:如果按步骤一格式化后仍有错误,原因在于一些非法字符诸如:< , > , &等被xml误认为是标签,但没有找到成对的,此时按提示多少行多少列将这些字符替换即可(可将格式化后的文本保存为xml文件,用Notepad++打开,修改保存会提示哪行出错,右下角有行列的显示
    在这里插入图片描述
  • 第三种:用IE浏览器打开步骤xml文件,然后复制xml内容再去格式化,应该就可以解决问题,如还有报错,按第二种方法解决报错
四、完整代码如下
  • 格式化xml>xml转字典>保存为xml文件
import requests
import xmltodict


def pretty_xml(text: str) -> str:
    """
    将未格式化的xml字符串格式化
    :param text: 待格式化的xml字符串
    :return: 格式化好的字符串
    """
    url = "http://web.chacuo.net/formatxml"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        "Host": "web.chacuo.net",
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    }
    form_data = {"data": text, "type": "format", "beforeSend": "undefined"}
    resp = requests.post(url, data=form_data, headers=headers, timeout=20)
    print(resp.json()['data'][0])
    return resp.json()['data'][0]


def save_xml(pretty_xml_str: str):
    """将xml存入xml文件"""
    with open("test.xml", "w", encoding="utf-8") as fp:
        fp.write(pretty_xml_str)


def xml_to_dict(format_ed_xml: str):
    """将xml转为字典"""
    dict_xml = xmltodict.parse(format_ed_xml)
    print(f"\n>>>>{dict_xml['note']['body']}")


if __name__ == "__main__":
    xml_text = '<?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Do not forget the meeting!</body></note>'
    format_xml = pretty_xml(xml_text)  # 格式化xml
    xml_to_dict(format_xml)  # 将xml转为字典
    save_xml(format_xml)   # 存xml文件
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值