Не перебирайте узлы Data
и Intensity
по отдельности. Если они не совпадают (и вы сказали, что они не соответствуют), у вас закончится синхронизация довольно быстро.
Вместо этого, итерируйте по узлам SPEC
, а затем ищите относительные Data
и Intensity
узлов. Также обратите внимание, что я использую zip
, поэтому в случае несоответствия внутри узла SPEC
создание dict будет остановлено, когда мы используем более короткий список.
tree = ET.parse('File')
root = tree.getroot()
for spec_node in root.iter('SPEC'):
d = dict(zip((data_node.text for data_node in spec_node.iter('Data')),
(intensity_node.text for intensity_node in spec_node.iter('Intensity'))))
print(d)
Для приведенного выше файла этовыводит
{'100.430000': '2950.909708', '102.269997': '114341.550674', '103.260002': '47164.957890',
'104.260002': '5102.098056'}
{'100.430000': '2950.909708', '102.269997': '114341.550674', '103.260002': '47164.957890',
'104.260002': '5102.098056'}
Обратите внимание, что .text
возвращает строку. Если вам нужны числа с плавающей запятой, используйте float(node.text)
, где это применимо.
Например, в случае несоответствия:
<DATA>
<DATA_VALUES>
<SPEC>
<Meta>1</Meta>
<Data>1</Data>
<Intensity>2</Intensity>
<Data>3</Data>
<Intensity>4</Intensity>
<Data>5</Data>
<Intensity>6</Intensity>
<Data>7</Data>
<Intensity>8</Intensity>
<Data>9</Data> <!-- This will not be in the dict -->
</SPEC>
</DATA_VALUES>
</DATA>
Созданный словарь будет
{'1': '2', '3': '4', '5': '6', '7': '8'}