2015-03-25 14 views
5

Ho il seguente file XML come input:Ottenere tutte le istanze di nodo figlio utilizzando xml.etree.ElementTree

<Test> 
    <callEvents> 
    <moc> 
     <causeForTermination>0</causeForTermination> 
     <serviceCode> 
     <teleServiceCode>11</teleServiceCode> 
     </serviceCode> 
     <dialledDigits>5555555</dialledDigits> 
     <connectedNumber>77777</connectedNumber> 
    </moc> 

    <moc> 
     <causeForTermination>0</causeForTermination> 
     <serviceCode> 
     <teleServiceCode>11</teleServiceCode> 
     </serviceCode> 
     <dialledDigits>2222222</dialledDigits> 
    </moc> 
    </callEvents> 
    <callEventsCount>100</callEventsCount> 
</Test> 

voglio uscita tutti i valori per dialledDigits. Tuttavia, il mio codice mostra solo la prima istanza di dialledDigits.

dialledDigits {} 5555555 

L'output desiderato deve contenere entrambe le istanze.

dialledDigits {} 5555555 
dialledDigits {} 2222222 

Ecco il mio codice

import xml.etree.ElementTree as ET 
tree = ET.parse('as.xml') 
root = tree.getroot() 
callevent=root.find('callEvents') 

Moc1=callevent.find('moc') 

for node in Moc1.getiterator(): 
    if node.tag=='dialledDigits': 
     print node.tag, node.attrib, node.text 

risposta

6

Uso findall:

Moc1=callevent.findall('moc') 

for moc in Moc1: 
    for node in moc.getiterator(): 
     if node.tag=='dialledDigits': 
      print node.tag, node.attrib, node.text 

uscita:

dialledDigits {} 5555555 
dialledDigits {} 2222222 
+0

Ma non dovrebbe esserci un modo per farlo senza un esplicito se controllo, ma piuttosto come "per il nodo in moc.inter ("dialledDigits") "? – LazyCat

0

find() tornerà primo oggetto tag, in modo da utilizzare 012.334.che restituiscono tutta tag objects`

>>> Moc1=callevent.find('moc') 
>>> Moc1 
<Element 'moc' at 0x869a2ac> 
>>> Moc1=callevent.findall('moc') 
>>> Moc1 
[<Element 'moc' at 0x869a2ac>, <Element 'moc' at 0x869a4ec>] 
>>> 

Itera su di esso:

>>> Mocs=callevent.findall('moc') 
>>> for moc in Mocs: 
...  for node in moc.getiterator(): 
...   if node.tag=='dialledDigits': 
...    print node.tag, node.attrib, node.text 
... 
dialledDigits {} 5555555 
dialledDigits {} 2222222 
6

è anche possibile scrivere un'espressione XPath . A soli 2 linee al posto di 5 e un singolo ciclo:

for node in tree.findall('.//callEvents/moc/dialledDigits'): 
    print node.tag, node.attrib, node.text 

Demo:

>>> import xml.etree.ElementTree as ET 
>>> 
>>> 
>>> tree = ET.parse('as.xml') 
>>> root = tree.getroot() 
>>> 
>>> for node in tree.findall('.//callEvents/moc/dialledDigits'): 
...  print node.tag, node.attrib, node.text 
... 
dialledDigits {} 5555555 
dialledDigits {} 2222222 
+0

sì, xpath funzionerà, grazie. Il metodo 'xpath' non è disponibile per ET. È presente nel 'lxml'. + upvote –

Problemi correlati