Как вернуть значения словаря в файл XML - PullRequest
0 голосов
/ 01 апреля 2020

У меня XML в следующем формате

<case>
    <number>162</number>
    <age>40</age>
    <sex>F</sex>
    <composition>solid</composition>
    <echogenicity>hypoechogenicity</echogenicity>
    <margins>ill defined</margins>
    <calcifications>non</calcifications>
    <tirads>4c</tirads>
    <reportbacaf/>
    <reporteco/>
    <mark>
        <image>1</image>
        <svg>[{"points": [{"x": 403, "y": 79}, {"x": 399, "y": 79}, {"x": 391, "y": 78}, {"x": 379, "y": 82}, {"x": 373, "y": 88}, {"x": 368, "y": 99}, "annotation": {}, "regionType": "freehand"}]
        </svg>
    </mark>
</case>

Теперь я хотел бы получить значение в виде пары x и y из тега, например (403,79), (399, 79) ...

Я пробовал, но получаю только значения типа строки

root = tree.getroot()
for item in root.findall('mark'):
svg = item.findall('svg')
svg_value = t[0].text

Могу ли я получить его как тип значения словаря?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Ниже

(строка JSON внутри svg недопустима и должна быть исправлена)

import xml.etree.ElementTree as ET
import json


xml = '''<case>
    <number>162</number>
    <age>40</age>
    <sex>F</sex>
    <composition>solid</composition>
    <echogenicity>hypoechogenicity</echogenicity>
    <margins>ill defined</margins>
    <calcifications>non</calcifications>
    <tirads>4c</tirads>
    <reportbacaf/>
    <reporteco/>
    <mark>
        <image>1</image>
        <svg>[{"points": [{"x": 493, "y": 79}, {"x": 399, "y": 79}, {"x": 391, "y": 78}, {"x": 379, "y": 82}, {"x": 373, "y": 88}, {"x": 368, "y": 99}], "annotation": {}, "regionType": "freehand"}]
        </svg>
    </mark>
     <mark>
        <image>5</image>
        <svg>[{"points": [{"x": 343, "y": 79}, {"x": 399, "y": 79}, {"x": 391, "y": 78}, {"x": 379, "y": 82}, {"x": 373, "y": 88}, {"x": 368, "y": 99}], "annotation": {}, "regionType": "freehand"}]
        </svg>
    </mark>
</case>'''

root = ET.fromstring(xml)
svg_lst = [s.text for s in root.findall('.//svg')]
data = [json.loads(svg) for svg in svg_lst]
print(data)

output

[[{'points': [{'x': 493, 'y': 79}, {'x': 399, 'y': 79}, {'x': 391, 'y': 78}, {'x': 379, 'y': 82}, {'x': 373, 'y': 88}, {'x': 368, 'y': 99}], 'annotation': {}, 'regionType': 'freehand'}], [{'points': [{'x': 343, 'y': 79}, {'x': 399, 'y': 79}, {'x': 391, 'y': 78}, {'x': 379, 'y': 82}, {'x': 373, 'y': 88}, {'x': 368, 'y': 99}], 'annotation': {}, 'regionType': 'freehand'}]]
0 голосов
/ 01 апреля 2020

Если эта строка представляет собой словарь Python, используйте ast.literal_eval() для анализа строки в словаре.

Если это JSON, используйте json.loads().

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

Кроме того, привкус тот, кто решил внедрить объект стороннего формата в XML файл. XML вполне может представлять эти данные в исходном виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...