ดังนั้น ฉันกำลังสร้างองค์ประกอบย่อยใหม่ด้วย ElementTree โดยที่ข้อความของโหนดใหม่ควรเป็นค่า dict หากคีย์ dict ของค่าที่สอดคล้องกันเท่ากับข้อความของโหนด 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 loop ที่สร้างโหนด alternativeExportValue
ใน my_Function
แต่สุดท้ายก็ได้รับค่าเดียวกันใน newNode.text
หรือติดอยู่ในลูปไม่มีที่สิ้นสุด
ดังที่คุณเห็นในผลลัพธ์ที่คาดหวัง ฉันต้องการให้ dict.value เป็นข้อความสำหรับโหนดที่สร้างขึ้นใหม่ ถ้ามันตรงกับ <name id="0">
innerText ภายในพาเรนต์เดียวกัน <scale>