2017-05-11 4 views
1

Ich bin neu in Xml Parsing. This xml file hat den folgenden Baum:Python: Zugriff verschachtelte Kinder in XML-Datei mit ElementTree geparsten

FHRSEstablishment 
|--> Header 
| |--> ... 
|--> EstablishmentCollection 
| |--> EstablishmentDetail 
| | |-->... 
| |--> Scores 
| | |-->... 
|--> EstablishmentCollection 
| |--> EstablishmentDetail 
| | |-->... 
| |--> Scores 
| | |-->... 

aber wenn ich es mit ElementTree zugreifen und suchen die child Tags und Attribute,

import xml.etree.ElementTree as ET 
import urllib2 
tree = ET.parse(
    file=urllib2.urlopen('http://ratings.food.gov.uk/OpenDataFiles/FHRS408en-GB.xml' % i)) 
root = tree.getroot() 
for child in root: 
    print child.tag, child.attrib 

ich nur bekommen:

Header {} 
EstablishmentCollection {} 

, die ich übernehmen bedeutet, dass ihre Attribute leer sind. Warum ist das so, und wie kann ich auf die darin eingebetteten Kinder zugreifen? EstablishmentDetail und Scores?

EDIT

Dank der Antworten unten ich im Inneren des Baumes zu bekommen, aber wenn ich will, Werte erhalten, wie sie in Scores, dies nicht gelingt:

for node in root.find('.//EstablishmentDetail/Scores'): 
    rating = node.attrib.get('Hygiene') 
    print rating 

und produziert

None 
None 
None 

Warum ist das?

Antwort

2

Sie müssen Ihre Root rotieren!

das ist root.iter() würde den Trick tun!

import xml.etree.ElementTree as ET 
import urllib2 
tree =ET.parse(urllib2.urlopen('http://ratings.food.gov.uk/OpenDataFiles/FHRS408en-GB.xml')) 
root = tree.getroot() 
for child in root.iter(): 
    print child.tag, child.attrib 

Ausgang:

FHRSEstablishment {} 
Header {} 
ExtractDate {} 
ItemCount {} 
ReturnCode {} 
EstablishmentCollection {} 
EstablishmentDetail {} 
FHRSID {} 
LocalAuthorityBusinessID {} 
... 
  • Um alle Tags innerhalb EstablishmentDetail Sie benötigen den Tag und die Schleife durch seine Kinder zu finden!

Das heißt,

for child in root.find('.//EstablishmentDetail'): 
    print child.tag, child.attrib 

Ausgang:

FHRSID {} 
LocalAuthorityBusinessID {} 
BusinessName {} 
BusinessType {} 
BusinessTypeID {} 
RatingValue {} 
RatingKey {} 
RatingDate {} 
LocalAuthorityCode {} 
LocalAuthorityName {} 
LocalAuthorityWebSite {} 
LocalAuthorityEmailAddress {} 
Scores {} 
SchemeType {} 
NewRatingPending {} 
Geocode {} 
  • Um die Punktzahl für Hygiene zu erhalten, wie Sie in Kommentar erwähnt haben,

Was Sie getan haben, ist, wird es die erste Scores Tag bekommen und das wird Hygiene, ConfidenceInManagement, strukturelle Tags als Kind, wenn Sie for each in root.find('.//Scores'):rating=child.get('Hygiene') anrufen. Das heißt, offensichtlich alle drei Kind wird nicht das Element haben!

Sie müssen zuerst - finden Sie alle Scores Tag. - finden Sie Hygiene in jeder Schlagworte!

for each in root.findall('.//Scores'):rating = each.find('.//Hygiene'); print '' if rating is None else rating.text; 

Ausgang:

5 
5 
5 
0 
5 
+0

Wow, das war gut, aber ich kämpfe immer noch die letzten Werte, wie die Noten zu bekommen. Wenn ich 'für Kind in root.find ('.// ​​Scores') mache: rating = child.get ('Hygiene'); Druck Bewertung; 'Ich bekomme' None' als Ergebnis. – FaCoffee

+0

Ich habe meine Antwort bearbeitet! –

1

Hoffe, dass es nützlich sein könnte:

import xml.etree.ElementTree as etree 
with open('filename.xml') as tmpfile: 
    doc = etree.iterparse(tmpfile, events=("start", "end")) 
    doc = iter(doc) 
    event, root = doc.next() 
    num = 0 
    for event, elem in doc: 
     print event, elem 
Verwandte Themen