2017-09-14 6 views
0

J'essaie de lire dans chaque balise enfant et attribut d'un élément dans un fichier xml. Un exemple de fichier XML est répertorié ci-dessous.Comment lire dans chaque balise enfant et attribut à partir d'un élément en XML en utilisant Python

<drCoreType Name="default"> 
     <ModelType Name="default"> 
     <ALTrVoltage Enable="No" Group="Other" Delay="0"/> 
     <ALTrCurrent Enable="Yes" Group="Minor" Delay="0"/> 
     <ALTrTeAmbient Enable="Yes" Group="Minor" Delay="5"/> 
     <ALTrTeTankTop Enable="No" Group="Minor" Delay="5"/> 
     <ALTrTeTankBottom Enable="No" Group="Minor" Delay="5"/> 
     <ALTrTeCTO Enable="No" Group="Other" Delay="5"/> 
     <ALTrTeCBO Enable="No" Group="Other" Delay="5"/> 

continue pour 100 lignes supplémentaires avec 100 étiquettes différentes. J'essaie de lire dans chaque enfant, balise et attribut ModelType, dans un tableau d'objets sans rechercher chaque nom en utilisant .find ("nom"). auriez vous des idées pour faire ça? Je suis perplexe et google n'a pas été trop utile.

+0

Quelle est la sortie désirée? Aussi qu'avez-vous essayé jusqu'ici? – Marco

Répondre

1

Il peut être possible sans, mais je vous XPath, vous pouvez le faire comme ceci:

import sys 
import pprint 
from lxml import etree 

with open(sys.argv[1]) as xml_file: 
    tree = etree.parse(xml_file) 

pprint.pprint([(element.tag, element.attrib) for element in 
     tree.xpath('//drCoreType/ModelType/*')]) 

Cela donne:

[('ALTrVoltage', {'Enable': 'No', 'Group': 'Other', 'Delay': '0'}), 
('ALTrCurrent', {'Enable': 'Yes', 'Group': 'Minor', 'Delay': '0'}), 
('ALTrTeAmbient', {'Enable': 'Yes', 'Group': 'Minor', 'Delay': '5'}), 
('ALTrTeTankTop', {'Enable': 'No', 'Group': 'Minor', 'Delay': '5'}), 
('ALTrTeTankBottom', {'Enable': 'No', 'Group': 'Minor', 'Delay': '5'}), 
('ALTrTeCTO', {'Enable': 'No', 'Group': 'Other', 'Delay': '5'}), 
('ALTrTeCBO', {'Enable': 'No', 'Group': 'Other', 'Delay': '5'})] 
+0

C'est exactement ce que je cherchais. Merci de votre aide! – Akkarris

+0

@Akkarris vous êtes les bienvenus, n'hésitez pas à signaler comme réponse si ça vaut le coup. –