Итак, я создаю новый подэлемент с ElementTree, где текст нового узла должен быть значением словаря, ЕСЛИ ключ словаря соответствующего значения равен тексту другого узла XML в том же родительском узле.
Пример XML:
<ns0:scaleType xmlns:ns0="http://someURL.com/">
<scales>
<scale>
<names>
<name id="0">abc</name>
<name id="1" />
</names>
<alternativeExportValues>
</alternativeExportValues>
</scale>
<scale>
<names>
<name id="0">def</name>
<name id="1" />
</names>
<alternativeExportValues>
</alternativeExportValues>
</scale>
</scales>
</ns0:scaleType>
Пример CSV:
name;value
abc;10012
def;20025
Код Python сейчас:
import xml.etree.ElementTree as ET
import csv
csvData = []
with open('myCSV.csv', 'r', encoding="utf8") as f:
reader = csv.reader(f, delimiter=";")
for row in reader:
csvData.append({'name': row[0], 'value': row[1]})
tree = ET.parse('myXml.xml')
root = tree.getroot()
def my_Function():
for p in csvData:
for name in root.findall(".//name[@id='0']"):
text = name.text
if p['name'] == text:
value = p['value']
return value
my_Function()
for elem in root.iter('alternativeExportValues'):
newNode = ET.SubElement(elem, 'alternativeExportValue')
newNode.text =
tree.write("myNewXML.xml", encoding="utf-8")
Ожидаемый результат:
<ns0:scaleType xmlns:ns0="http://someURL.com/">
<scales>
<scale>
<names>
<name id="0">abc</name>
<name id="1" />
</names>
<alternativeExportValues>
<alternativeExportValue>10012</alternativeExportValue>
</alternativeExportValues>
</scale>
<scale>
<names>
<name id="0">def</name>
<name id="1" />
</names>
<alternativeExportValues>
<alternativeExportValue>20025</alternativeExportValue>
</alternativeExportValues>
</scale>
</scales>
</ns0:scaleType>
Я попытался поместить цикл for, создающий узел alternativeExportValue
, в my_Function
, но в итоге получил то же значение в newNode.text
или застрял в бесконечном цикле.
Как видно из ожидаемого результата, я хочу, чтобы dict.value был текстом для вновь созданного узла, если он соответствует <name id="0">
innerText внутри того же родителя <scale>
.