Конвертация json в xml в python

Рейтинг: 1Ответов: 1Опубликовано: 23.01.2023

Есть json:

{
"Response": {
    "TransactionId":"12345",
    "ResultCode": "0",
    "Fields": {
        "field1": {
            "name": "LegalCode",
            "text": "4"
            }
        },   
    "Comment": null
    }
}

Нужно с помощью xmxl получить:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Transaction>12345</TransactionId>
    <ResultCode>0</ResultCode>
    <Fields>
        <field1 name="LegalCode">4</field1>
    </Fields>
    <Comment></Comment>
</Response>

Пример конвертации есть, но он не поддерживает случаев, когда есть аттрибуты как в нашем случае: <field1 name="LegalCode">4</field1>

Ответы

▲ 1

Попробуйте:

import json
import xmltodict

json_string = '{"Response": {"TransactionId":"12345","ResultCode": "0","Fields": {"field1": {"name": "LegalCode","text": "4"}},"Comment": null}}'
json_data = json.loads(json_string)
xml_string = xmltodict.unparse(json_data, pretty=True)
print(xml_string)

Рекурсивная функция:

import json

def json_to_xml(json_obj, line_padding=""):
    json_obj_type = type(json_obj)

    if json_obj_type is list:
        for sub_elem in json_obj:
            json_to_xml(sub_elem, line_padding)

    if json_obj_type is dict:
        for tag_name in json_obj:
            sub_obj = json_obj[tag_name]
            if type(sub_obj) is list:
                for sub_elem in sub_obj:
                    json_to_xml(sub_elem, line_padding)
            else:
                if "name" in json_obj:
                    print("%s<%s name='%s'>" % (line_padding, tag_name, json_obj["name"]), end="")
                else:
                    print("%s<%s>" % (line_padding, tag_name), end="")
                json_to_xml(sub_obj, line_padding + "  ")
                print("%s</%s>" % (line_padding, tag_name))

    if json_obj_type is str:
        print(json_obj)
    elif json_obj_type is int:
        print(json_obj)
    elif json_obj_type is bool:
        print(json_obj)
    elif json_obj_type is None:
        print()

json_string = '{"Response": {"TransactionId":"12345","ResultCode": "0","Fields": {"field1": {"name": "LegalCode","text": "4"}},"Comment": null}}'
json_data = json.loads(json_string)

print("<?xml version='1.0' encoding='UTF-8'?>")
json_to_xml(json_data)

При помощи библиотеки xmljson

import json
from xmljson import badgerfish as bf

json_string = '{"Response": {"TransactionId":"12345","ResultCode": "0","Fields": {"field1": {"name": "LegalCode","text": "4"}},"Comment": null}}'
json_data = json.loads(json_string)
xml_string = bf.data(json_data)
print(xml_string)