plist не видит код plist файла

Программирую на питоне. Пишу программу для переработки файла и столкнулся с проблемой. Встроенная библиотека plistlib наотрез отказывается видеть хоть что то в коде. Она возвращает просто пустой словарь.

Вот код plist файла (он в одну строку)

<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>LLM_01</k><d><k>_isArr</k><t /><k>k_0</k><d><k>kCEK</k><i>4</i><k>k2</k><s>Unnamed 0</s><k>k4</k><s>H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==</s><k>k5</k><s>Player</s><k>k13</k><t /><k>k21</k><i>2</i><k>k16</k><i>1</i><k>k80</k><i>53</i><k>k50</k><i>35</i><k>k47</k><t /><k>k48</k><i>29</i><k>kI1</k><r>-41.8</r><k>kI2</k><r>4.97752</r><k>kI3</k><r>0.6</r><k>kI6</k><d><k>0</k><s>0</s><k>1</k><s>0</s><k>2</k><s>0</s><k>3</k><s>0</s><k>4</k><s>0</s><k>5</k><s>0</s><k>6</k><s>0</s><k>7</k><s>0</s><k>8</k><s>0</s><k>9</k><s>0</s><k>10</k><s>0</s><k>11</k><s>0</s><k>12</k><s>0</s></d></d></d><k>LLM_02</k><i>35</i></dict></plist>

Подскажите пожалуйста что делать с библиотекой.


Ответы (2 шт):

Автор решения: Namerek

Надеюсь что это Вам поможет:
pip install xmltodict

from pprint import pprint
from typing import Iterable

from xmltodict import parse

plist_text = '<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>LLM_01</k><d><k>_isArr</k><t /><k>k_0</k><d><k>kCEK</k><i>4</i><k>k2</k><s>Unnamed 0</s><k>k4</k><s>H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==</s><k>k5</k><s>Player</s><k>k13</k><t /><k>k21</k><i>2</i><k>k16</k><i>1</i><k>k80</k><i>53</i><k>k50</k><i>35</i><k>k47</k><t /><k>k48</k><i>29</i><k>kI1</k><r>-41.8</r><k>kI2</k><r>4.97752</r><k>kI3</k><r>0.6</r><k>kI6</k><d><k>0</k><s>0</s><k>1</k><s>0</s><k>2</k><s>0</s><k>3</k><s>0</s><k>4</k><s>0</s><k>5</k><s>0</s><k>6</k><s>0</s><k>7</k><s>0</s><k>8</k><s>0</s><k>9</k><s>0</s><k>10</k><s>0</s><k>11</k><s>0</s><k>12</k><s>0</s></d></d></d><k>LLM_02</k><i>35</i></dict></plist>'


def od_to_dict(obj, **kwargs):
    from typing import Mapping

    if isinstance(obj, Mapping):
        obj = dict(obj)

        for key, value in obj.items():
            obj[key] = od_to_dict(value)

    elif isinstance(obj, str):
        return obj

    elif isinstance(obj, Iterable):
        return list(map(od_to_dict, obj))

    return obj


pprint(
    od_to_dict(
        parse(
            plist_text
        )
    )
)

Если не использовать дописанную od_to_dict то на выходе получите обычный OrderedDict

{'plist': {'@gjver': '2.0',
           '@version': '1.0',
           'dict': {'d': {'d': {'d': {'k': ['0',
                                            '1',
                                            '2',
                                            '3',
                                            '4',
                                            '5',
                                            '6',
                                            '7',
                                            '8',
                                            '9',
                                            '10',
                                            '11',
                                            '12'],
                                      's': ['0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0',
                                            '0']},
                                'i': ['4', '2', '1', '53', '35', '29'],
                                'k': ['kCEK',
                                      'k2',
                                      'k4',
                                      'k5',
                                      'k13',
                                      'k21',
                                      'k16',
                                      'k80',
                                      'k50',
                                      'k47',
                                      'k48',
                                      'kI1',
                                      'kI2',
                                      'kI3',
                                      'kI6'],
                                'r': ['-41.8', '4.97752', '0.6'],
                                's': ['Unnamed 0',
                                      'H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==',
                                      'Player'],
                                't': [None, None]},
                          'k': ['_isArr', 'k_0'],
                          't': None},
                    'i': '35',
                    'k': ['LLM_01', 'LLM_02']}}}
→ Ссылка
Автор решения: Paranoik YT

Самым простым решением оказалось решение в лоб. Я просто заменяю все короткие теги на их длинные версии и получаю нужный мне словарь.

В переменной text находится код строки.

text = text.replace('k>', 'key>').replace('d>', 'dict>').replace('s>', 'string>').replace('r>', 'real>')
text = text.replace('<t />', '<true/>').replace('<f />', '<false/>').replace('i>', 'integer>')
→ Ссылка