|
| 1 | +""" |
| 2 | +将 dict/list 转换为 XML 字符串的工具函数,用于替代 dicttoxml 库(GPL 许可证风险)。 |
| 3 | +仅依赖 Python 标准库。 |
| 4 | +""" |
| 5 | + |
| 6 | +import xml.etree.ElementTree as ET |
| 7 | + |
| 8 | + |
| 9 | +def _add_element(parent: ET.Element, key: str, value, item_func=None): |
| 10 | + """递归地将值添加为 XML 子元素。""" |
| 11 | + elem = ET.SubElement(parent, key) |
| 12 | + |
| 13 | + if isinstance(value, dict): |
| 14 | + for k, v in value.items(): |
| 15 | + _add_element(elem, k, v, item_func) |
| 16 | + elif isinstance(value, list): |
| 17 | + item_name = item_func(key) if item_func else 'item' |
| 18 | + for item in value: |
| 19 | + _add_element(elem, item_name, item, item_func) |
| 20 | + elif isinstance(value, bool): |
| 21 | + elem.text = str(value).lower() |
| 22 | + elif value is None: |
| 23 | + elem.text = '' |
| 24 | + else: |
| 25 | + elem.text = str(value) |
| 26 | + |
| 27 | + |
| 28 | +def dict_to_xml(data: dict | list, root_name: str = 'root', item_func=None) -> str: |
| 29 | + """ |
| 30 | + 将 dict 或 list 转换为 XML 字符串。 |
| 31 | +
|
| 32 | + :param data: 要转换的 dict 或 list |
| 33 | + :param root_name: XML 根元素名称 |
| 34 | + :param item_func: 列表项元素名的函数,接收父元素名,返回子元素名 |
| 35 | + :return: XML 字符串 |
| 36 | + """ |
| 37 | + root = ET.Element(root_name) |
| 38 | + |
| 39 | + if isinstance(data, dict): |
| 40 | + for key, value in data.items(): |
| 41 | + _add_element(root, key, value, item_func) |
| 42 | + elif isinstance(data, list): |
| 43 | + item_name = item_func(root_name) if item_func else 'item' |
| 44 | + for item in data: |
| 45 | + _add_element(root, item_name, item, item_func) |
| 46 | + else: |
| 47 | + root.text = str(data) |
| 48 | + |
| 49 | + return ET.tostring(root, encoding='unicode', xml_declaration=False) |
0 commit comments