在XML文件中查找元素 - 如果不是怎么办?



我想要一个循环,它检查元素"CompAttrVal名称">存在于XML文件中,并且如果它是get元素"em>";值",如果不是-设置变量"em>";值"为空。

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<root ReleaseDate="2022102110391995" StartDate="2022102110391995" EndDate="00" Version="1.0.0">
<Type name="0204N01470-00" Desc="FA Porsche 992 TOP RHD S2" OID="174188" SrcOID="174187" TID="3">
<Component name="MachineTools" OID="177350" SrcOID="378" TID="8">
<ComponentNo name="St53_DryTesting" OID="74902" SrcOID="74902" TID="19">
<CompAttrVal name="TesterECUPlugMirror" OID="74903" SrcOID="74903" TID="10" DataType="String" Value="0"></CompAttrVal>
<CompAttrVal name="TesterECUPlugAngle" OID="74904" SrcOID="74904" TID="10" DataType="String" Value="0"></CompAttrVal>
</ComponentNo>
<ComponentNo name="St73_FirewallGasket" OID="74906" SrcOID="74906" TID="19">
<CompAttrVal name="Mounting" OID="74907" SrcOID="74907" TID="10" DataType="String" Value="YES"></CompAttrVal>
</ComponentNo>
</Component>
<Component name="Pos010_GearHousing" OID="174253" SrcOID="379" TID="8">
<ComponentNo name="0204842158" OID="4485" SrcOID="4485" TID="19">
<CompAttrVal name="GearHousingDesign" OID="4545" SrcOID="4545" TID="10" DataType="String" Value="standard"></CompAttrVal>
<CompAttrVal name="TieRodDistance" OID="4546" SrcOID="4546" TID="10" DataType="String" Value="100"></CompAttrVal>
<CompAttrVal name="NumberOfStuds" OID="4547" SrcOID="4547" TID="10" DataType="String" Value="2"></CompAttrVal>
<CompAttrVal name="StudPos22X" OID="4548" SrcOID="4548" TID="10" DataType="String" Value="-13,17"></CompAttrVal>
<CompAttrVal name="StudPos22Y" OID="4549" SrcOID="4549" TID="10" DataType="String" Value="-49,17"></CompAttrVal>
<CompAttrVal name="StudPos24X" OID="4550" SrcOID="4550" TID="10" DataType="String" Value="13,17"></CompAttrVal>
<CompAttrVal name="StudPos24Y" OID="4551" SrcOID="4551" TID="10" DataType="String" Value="49,17"></CompAttrVal>
</ComponentNo>
</Component>

选项-XML文件可能包含的内容:

  1. CompAttrVal名称=";StudPos22X"StudPos22Y"StudPos24X";以及";StudPos24Y">
  2. CompAttrVal名称=";StudPos21X"StudPos21Y"StudPos23X";以及";StudPos23Y">
  3. 或者全部:CompAttrVal name=";StudPos21X"StudPos21Y"StudPos22X"StudPos22Y"StudPos23X"StudPos23Y"StudPos24X";以及";StudPos24Y">

代码:

def get_data_from_xml(path):
#print(path)

tree = ET.parse(path)
root = tree.getroot()

for Type in root.iter('Type'):
PN = Type.get('name')
#print(f"Part number: {PN}")
DS = Type.get('Desc')
#print(f"Description: {DS}")

for Component in root.iter('Component'):
CName = Component.get('name')
if CName == 'Pos010_GearHousing':
for ComponentNo in Component.iter('ComponentNo'):
GH = ComponentNo.get('name')
#print(f"Gear Housing: {GH}")   
for CompAttrVal in Component.iter('CompAttrVal'):
GH_AttrVal = CompAttrVal.get('name') 
if GH_AttrVal == 'GearHousingDesign':
GH_Design = CompAttrVal.get('Value')
if GH_Design == 'mirrored':
GH_Design_standard = ''
GH_Design_mirrored = 'x'
elif GH_Design == 'standard':
GH_Design_standard = 'x'
GH_Design_mirrored = ''
#GH - ZAM?
elif GH_AttrVal == 'TieRodDistance':
GH_Distance = CompAttrVal.get('Value')
if GH_Distance == '100':
GH_Distance100 = 'x'
GH_Distance101 = ''
elif GH_Distance == '101.8':
GH_Distance100 = ''
GH_Distance101 = 'x'
#GH - Riveting Progrs?
elif GH_AttrVal == 'NumberOfStuds':
GH_Studs = CompAttrVal.get('Value')

if GH_AttrVal == 'StudPos21X':
GH_Pos21X = CompAttrVal.get('Value')
if GH_AttrVal == 'StudPos21Y':
GH_Pos21Y = CompAttrVal.get('Value')
else:
GH_Pos21X = ''
GH_Pos21Y = ''

if GH_AttrVal == 'StudPos22X':
GH_Pos22X = CompAttrVal.get('Value')
if GH_AttrVal == 'StudPos22Y':
GH_Pos22Y = CompAttrVal.get('Value')
else:
GH_Pos22X = ''
GH_Pos22Y = ''
if GH_AttrVal == 'StudPos23X':
GH_Pos23X = CompAttrVal.get('Value')
if GH_AttrVal == 'StudPos23Y':
GH_Pos23Y = CompAttrVal.get('Value')
else:
GH_Pos23X = ''
GH_Pos23Y = ''

if GH_AttrVal == 'StudPos24X':
GH_Pos24X = CompAttrVal.get('Value')
if GH_AttrVal == 'StudPos24Y':
GH_Pos24Y = CompAttrVal.get('Value')
else:
GH_Pos24X = ''
GH_Pos24Y = ''
if CName == 'Pos058_PowerPack':
for ComponentNo in Component.iter('ComponentNo'):
PP = ComponentNo.get('name')
#print(f"Power Pack: {PP}")

if CName == 'Pos082_PedalInterface':
for ComponentNo in Component.iter('ComponentNo'):
PI = ComponentNo.get('name')
#print(f"Pedal Interface: {PI}")

if CName == 'MachineTools':
for ComponentNo in Component.iter('ComponentNo'):
MT = ComponentNo.get('name')
if MT == 'St53_DryTesting':
for CompAttrVal in Component.iter('CompAttrVal'):
MT_St53 = CompAttrVal.get('name')
if MT_St53 == 'TesterECUPlugMirror':
MT_St53Mirror = CompAttrVal.get('Value') 
#print(f"Mirror: {MT_St53Mirror}")
elif MT_St53 == 'TesterECUPlugAngle':
MT_St53Angle = CompAttrVal.get('Value')
#print(f"Angle: {MT_St53Angle}")           
#St. 65 CamCheck???
elif MT == 'St73_FirewallGasket':
for CompAttrVal in Component.iter('CompAttrVal'):
MT_St73 = CompAttrVal.get('name')
if MT_St73 == 'Mounting':
global MT_St73Mounting
MT_St73Mounting = CompAttrVal.get('Value') 
#print(f"St73: {MT_St73Mounting}")

if CName == 'Pos088_FirewallGasket':
for ComponentNo in Component.iter('ComponentNo'):
Pos088 = ComponentNo.get('name')
if Pos088 == 'MountingPosition':
for CompAttrVal in Component.iter('CompAttrVal'):
TLA = CompAttrVal.get('name')
if TLA == 'ToolLifterAngle':
global MT_TLA
MT_TLA = CompAttrVal.get('Value') 

if(len(GH_Pos21X) != 0) and  (len(GH_Pos23X) != 0):
#global GH_Typgruppe_21_23
GH_Typgruppe_21_23 = 'x'
GH_Typgruppe_22_24 = ''
GH_Typgruppe_21_24 = ''
elif(len(GH_Pos22X) != 0) and  (len(GH_Pos24X) != 0):
#global GH_Typgruppe_22_24
GH_Typgruppe_21_23 = ''
GH_Typgruppe_22_24 = 'x'
GH_Typgruppe_21_24 = ''
elif(len(GH_Pos21X) != 0) and  (len(GH_Pos22X) != 0) and (len(GH_Pos23X) != 0) and (len(GH_Pos23X) != 0):
#global GH_Typgruppe_21_24
GH_Typgruppe_21_23 = ''
GH_Typgruppe_22_24 = ''
GH_Typgruppe_21_24 = 'x'

#print(PN, GH, PP, DS, PI)
return PN, GH, GH_Design_standard, GH_Design_mirrored, GH_Distance100, GH_Distance101, GH_Studs, GH_Typgruppe_21_23, GH_Typgruppe_22_24, GH_Typgruppe_21_24, GH_Pos21X, GH_Pos21Y, GH_Pos22X, GH_Pos22Y, GH_Pos23X, GH_Pos23Y, GH_Pos24X, GH_Pos24Y, PP, DS, PI, MT_St53Mirror, MT_St53Angle, MT_St73Mounting, MT_TLA
pn_list = []
gh_list = []
GH_Design_standard_list = []
GH_Design_mirrored_list = []
GH_ZAM_list = []
GH_Distance100_list = []
GH_Distance101_list = []
GH_RivProg_BTR1_list = []
GH_RivProg_BTR2_list = []
GH_Studs_list = []
GH_Typgruppe_21_23_list = []
GH_Typgruppe_22_24_list = []
GH_Typgruppe_21_24_list = []
GH_Pos21X_list = []
GH_Pos21Y_list = []
GH_Pos22X_list = []
GH_Pos22Y_list = []
GH_Pos23X_list = []
GH_Pos23Y_list = []
GH_Pos24X_list = []
GH_Pos24Y_list = []
pp_list = []
ds_list = []
pi_list = []
MT_St53Mirror_list = []
MT_St53Angle_list = []
MT_St65Gasket_list = []
MT_St65Spacer_list = []
MT_St73Mounting_list = []
MT_TLA_list = []
#generowanie DF
path = 'C:/Users/STJ2TW/Desktop/Pliki XML/'
for filename in os.listdir(path):
if '.' not in filename:
if 'MASTER' not in filename:
if 'GHOST' not in filename: 
fullname = os.path.join(path, filename)
#print(fullname)
PN, GH, GH_Design_standard, GH_Design_mirrored, GH_Distance100, GH_Distance101, GH_Studs, GH_Typgruppe_21_23, GH_Typgruppe_22_24, GH_Typgruppe_21_24, GH_Pos21X, GH_Pos21Y, GH_Pos22X, GH_Pos22Y, GH_Pos23X, GH_Pos23Y, GH_Pos24X, GH_Pos24Y, PP, DS, PI, MT_St53Mirror, MT_St53Angle, MT_St73Mounting, MT_TLA = get_data_from_xml(fullname)
#print(pn, gh, pp)
pn_list.append(PN)
gh_list.append(GH)
GH_Design_standard_list.append(GH_Design_standard)
GH_Design_mirrored_list.append(GH_Design_mirrored)
#GH ZAM??
GH_Distance100_list.append(GH_Distance100)
GH_Distance101_list.append(GH_Distance101)
#GH Riveting Progs?
GH_Studs_list.append(GH_Studs)
GH_Typgruppe_21_23_list.append(GH_Typgruppe_21_23)
GH_Typgruppe_22_24_list.append(GH_Typgruppe_22_24)
GH_Typgruppe_21_24_list.append(GH_Typgruppe_21_24)
GH_Pos21X_list.append(GH_Pos21X)
GH_Pos21Y_list.append(GH_Pos21Y)
GH_Pos22X_list.append(GH_Pos22X)
GH_Pos22Y_list.append(GH_Pos22Y)
GH_Pos23X_list.append(GH_Pos23X)
GH_Pos23Y_list.append(GH_Pos23Y)
GH_Pos24X_list.append(GH_Pos24X)
GH_Pos24Y_list.append(GH_Pos24Y)
pp_list.append(PP)
ds_list.append(DS)
pi_list.append(PI)
MT_St53Mirror_list.append(MT_St53Mirror)
MT_St53Angle_list.append(MT_St53Angle)
#St. 65 CamCheck???
MT_St73Mounting_list.append(MT_St73Mounting)
MT_TLA_list.append(MT_TLA)

a = {'Description': ds_list,
'Part number': pn_list,
'Gear Housing': gh_list,
'Power Pack': pp_list,
'Pedal Interface': pi_list,
'ECU PlugMirror': MT_St53Mirror_list,
'ECU PlugAngle': MT_St53Angle_list,
'CamProg_Gasket': MT_St65Gasket_list,
'CamProg_Spacer': MT_St65Spacer_list,
'Mounting ?': MT_St73Mounting_list,
'MountingPosition/ToolLifterAngle': MT_TLA_list,
'Standard': GH_Design_standard_list,
'Mirrored': GH_Design_mirrored_list,
'ZAM': GH_ZAM_list,
'100 Bore Distance': GH_Distance100_list,
'101,8 Bore Distance': GH_Distance101_list,
'Program BTR 1': GH_RivProg_BTR1_list,
'Program BTR 2': GH_RivProg_BTR2_list,
'Number of Stud Bores': GH_Studs_list,
'2_Studs_RobPos_21_23': GH_Typgruppe_21_23_list,
'2_Studs_RobPos_22_24': GH_Typgruppe_22_24_list,
'4_Studs_RobPos_21_24': GH_Typgruppe_21_24_list,
'X-Position_21': GH_Pos21X_list,
'Y-Position_21': GH_Pos21Y_list,
'X-Position_22': GH_Pos22X_list,
'Y-Position_22': GH_Pos22Y_list,
'X-Position_23': GH_Pos23X_list,
'Y-Position_23': GH_Pos23Y_list,
'X-Position_24': GH_Pos24X_list,
'Y-Position_24': GH_Pos24Y_list,

}
df = pd.DataFrame.from_dict(a, orient='index')
df = df.transpose()
#zapis DF do pliku
df = df.set_index('Description', drop = True)
df.to_excel("C:/Users/STJ2TW/Desktop/Pliki CSV/data_frames_from_xml_new.xlsx", startrow=3, freeze_panes=(5,5))
#wczytywanie pliku do edycji
wb = load_workbook(filename = "C:/Users/STJ2TW/Desktop/Pliki CSV/data_frames_from_xml_new.xlsx")
ws = wb.active
sheet = wb["Sheet1"]
#filtrowanie
ws.insert_rows(5)
sheet.auto_filter.ref = "A5:DE300"
#zapis sformatowanego pliku do .xlsx
wb.save("C:/Users/STJ2TW/Desktop/Pliki CSV/data_frames_from_xml_formatted_new.xlsx")
#df.head(10)

正如你所看到的,我有一个if/elif循环,但我知道这是完全错误的,因为我得到了一个错误:

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_18568/3904363937.py in <module>
38                 fullname = os.path.join(path, filename)
39                 #print(fullname)
---> 40                 PN, GH, GH_Design_standard, GH_Design_mirrored, GH_Distance100, GH_Distance101, GH_Studs, GH_Typgruppe_21_23, GH_Typgruppe_22_24, GH_Typgruppe_21_24, GH_Pos21X, GH_Pos21Y, GH_Pos22X, GH_Pos22Y, GH_Pos23X, GH_Pos23Y, GH_Pos24X, GH_Pos24Y, PP, DS, PI, MT_St53Mirror, MT_St53Angle, MT_St73Mounting, MT_TLA = get_data_from_xml(fullname)
41                 #print(pn, gh, pp)
42                 pn_list.append(PN)
~AppDataLocalTemp/ipykernel_18568/2804858189.py in get_data_from_xml(path)
130 
131     #print(PN, GH, PP, DS, PI)
--> 132     return PN, GH, GH_Design_standard, GH_Design_mirrored, GH_Distance100, GH_Distance101, GH_Studs, GH_Typgruppe_21_23, GH_Typgruppe_22_24, GH_Typgruppe_21_24, GH_Pos21X, GH_Pos21Y, GH_Pos22X, GH_Pos22Y, GH_Pos23X, GH_Pos23Y, GH_Pos24X, GH_Pos24Y, PP, DS, PI, MT_St53Mirror, MT_St53Angle, MT_St73Mounting, MT_TLA
UnboundLocalError: local variable 'GH_Typgruppe_21_23' referenced before assignment

如果有人能帮我或给我一条如何解决问题的线索,我将不胜感激。

您是否想过使用字典而不是单个变量。将您感兴趣的属性存储在列表或集合中:

attribs = {"StudPos21X", "StudPos21Y", "StudPos22X", "StudPos22Y", "StudPos23X", "StudPos23Y", "StudPos24X", "StudPos24Y"}

然后,在循环元素时,创建一个字典,并用XML:中的值覆盖任何默认值

values = { x: None for x in attribs } # The dictionary
for ComponentNo in Component.iter('ComponentNo'): 
name = ComponentNo.get('name')
if name in attribs:
values[name] = ComponentNo.get('value')
# Now append values to your other data structure

相关内容

最新更新