не удается разобрать json в xml с помощью xmltodict.unparse при преобразовании списка json - PullRequest
0 голосов
/ 08 ноября 2019

Попытка сделать это, используя xmltodict.unparse:

У меня есть такая структура в json:

"organisations": [
    {"organisation": "org1"}, 
    {"organisation": "org2"}, 
    {"organisation": "org3"}
]

Но получается так в xml:

<organisations><organisation>org1</organisation></organisations>
<organisations><organisation>org2</organisation></organisations>
<organisations><organisation>org2</organisation></organisations>

Я хотел вот так:

<organisations>
    <organisation>org1</organisation>
    <organisation>org2</organisation>
    <organisation>org2</organisation>
</organisations>

Я использую xmltodict.unparse

def dict_to_xml(d, pretty_print=False, indent=DEFAULT_INDENT, document_root="root"):
    if len(d.keys()) != 1:
        d = {
            document_root: d
        }

    res = xmltodict.unparse(d, indent=indent, short_empty_elements=True)

    if pretty_print:
        res = pretty_print_xml(res).strip()

    return res

Кто-нибудь знает, что делать без взлома xmltodict ??

спасибо

1 Ответ

0 голосов
/ 08 ноября 2019

Я не очень разбираюсь в XML, но мне стало любопытно по этому вопросу, и я заметил:

В списках, которые указаны под ключом в словаре, ключ используется в качестве тега для каждого элемента.

Мой подход заключался в обратном инжиниринге результата, который вы ищете:

expected = '''
    <organisations>
        <organisation>org1</organisation>
        <organisation>org2</organisation>
        <organisation>org2</organisation>
    </organisations>
'''

print(json.dumps(xmltodict.parse(expected), indent=4))

вывод:

{
    "organisations": {
        "organisation": [
            "org1",
            "org2",
            "org2"
        ]
    }
}

И "круговое отключение", которое дает результат, который вам нужен:

reverse = {
    "organisations": {
        "organisation": [
            "org1",
            "org2",
            "org2"
        ]
    }
}

print(xmltodict.unparse(reverse, pretty=True))

вывод:

<?xml version="1.0" encoding="utf-8"?>
<organisations>
    <organisation>org1</organisation>
    <organisation>org2</organisation>
    <organisation>org2</organisation>
</organisations>

HTH!

...