Jadi, saya membuat subelemen baru dengan ElementTree di mana teks dari node baru harus berupa nilai dict JIKA kunci dict dari nilai yang sesuai sama dengan teks dari node XML lain dalam Node induk yang sama.
Contoh 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>
Contoh CSV:
name;value
abc;10012
def;20025
Kode Python sekarang:
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")
Hasil yang diharapkan:
<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>
Saya mencoba memasang loop for yang membuat node alternativeExportValue
di my_Function
, tetapi akhirnya mendapatkan nilai yang sama di newNode.text
atau terjebak dalam loop tanpa akhir.
Seperti yang Anda lihat pada hasil yang diharapkan, saya ingin dict.value sebagai teks untuk Node yang baru dibuat jika cocok dengan <name id="0">
innerText dalam induk yang sama <scale>
.