xml parsing mit xml.etree.ElementTree (Python 3.7)
Verfasst: Donnerstag 5. März 2020, 15:48
Hallo zusammen,
ich bin neu hier, ein echter Python-Frischling und hätte eine Frage zu xml-parsing mit ElementTree.
Die xml-Datei ist folgendermaßen aufgebaut (Ausschnitt, es gibt dutzende <A>'s...):
Nun geht es darum die Werte in A1, A2, A17 und A18 auszulesen und in eine Excel-Tabelle zu schreiben. Soweit funktioniert das auch einwandfrei, nur bei den Werten unter A17 und A18 komme ich auf keinen grünen Zweig da die childs von A17 und A18 jeweils den selben Namen haben (A17.1) und ich beim auslesen nur den 1. Wert zurückbekomme.
Die Fertige Tabelle sollte folgendermaßen aussehen:
A (1)| A1 | A2 | A17.1 (1. Wertepaar, hier Wert_1) | A18.1 (1. Wertepaar, hier 50)
A (1)| A1 | A2 | A17.1 (1. Wertepaar, hier Wert_2) | A18.1 (1. Wertepaar, hier 160)
A(2)
A(3)
.
.
A(n)
Mein Python-Code sieht wie folgt aus:
Ich hoffe es ist einigermaßen verständlich, ich wäre Euch für Eure Hilfe sehr dankbar!
Gruß mp123
ich bin neu hier, ein echter Python-Frischling und hätte eine Frage zu xml-parsing mit ElementTree.
Die xml-Datei ist folgendermaßen aufgebaut (Ausschnitt, es gibt dutzende <A>'s...):
Code: Alles auswählen
<Beispiel_A>
<A>
<A1>Langbezeichnung der Funktion XYZ</A1>
<A2>Kurzbezeichnung der Funktion XYZ</A2>
<A3>1</A3>
<A4>0</A4>
<A5></A5>
<A6></A6>
<A7></A7>
<A8>1</A8>
<A9>1</A9>
<A10></A10>
<A11>2</A11>
<A12>2</A12>
<A13>2</A13>
<A14>
<A14.1>Modulblock RST.XYZ</A14.1>
<A14.2>SW-VERSION Modulblock RST</A14.2>
<A14.3>NOT-EXISTING</A14.3>
<A14.4></A14.4>
</A14>
<A15>[0]- 1</A15>
<A16>1</A16>
<A17>
<A17.1>Wert 1</A17.1>
<A17.1>Wert 2</A17.1>
</A17>
<A18>
<A18.1>50</A18.1>
<A18.1>160</A18.1>
</A18>
</A>
<A>
.
.
</A>
<A>
.
.
</A>
</Beispiel_A>
Die Fertige Tabelle sollte folgendermaßen aussehen:
A (1)| A1 | A2 | A17.1 (1. Wertepaar, hier Wert_1) | A18.1 (1. Wertepaar, hier 50)
A (1)| A1 | A2 | A17.1 (1. Wertepaar, hier Wert_2) | A18.1 (1. Wertepaar, hier 160)
A(2)
A(3)
.
.
A(n)
Mein Python-Code sieht wie folgt aus:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import xlsxwriter
time = '{0:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())
time_file ='{0:%Y-%m-%d}'.format(datetime.datetime.now())
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(title='XML-Reader', filetypes=[(".xml-Datei", "*.xml")]) #Öffnet den File-Dialog um Dateien auswählen zu können
tree = ET.parse(file_path)
root = tree.getroot()
save_file = filedialog.asksaveasfilename(initialfile=(time_file+'_XML-Reader.xlsx'),title='XML-Reader',filetypes=[('Excel-Datei','*.xlsx')], defaultextension = '.xlsx')
worksheet2 = workbook.add_worksheet('Daten')
cell1 = workbook.add_format({'bold': True, 'font_color': 'blue',
'bg_color': '#E0E0E0'})
worksheet1.write(0, 0, 'Langname',cell1)
worksheet1.write(0, 1, 'Kurzname',cell1)
worksheet1.write(0, 2, 'Variablen',cell1)
worksheet1.write(0, 3, 'Werte',cell1)
worksheet1.autofilter('A1:D1')
def sheet_data():
row = 1
for dfc in root.getiterator('A'):
try:
a=dfc.find('A1').text
worksheet1.write(row, 0, a)
except AttributeError: a = ('---')
try:
b=dfc.find('A2').text
worksheet1.write(row, 1, b)
except AttributeError: b = ('---')
try:
c=dfc.find('A17/A17.1').text
worksheet1.write(row, 2, c)
except AttributeError: c = ('---')
try:
d=dfc.find('A18/A18.1').text
worksheet1.write(row, 3, d)
except AttributeError: d = ('---')
row = row+1
sheet_data()
workbook.close()
os.startfile(save_file)
Gruß mp123