2016-10-10 2 views
0

Я следующий образец XMLКак найти исходное имя элемента в XML с помощью iterparse

<osm version="0.6" generator="CGImap 0.3.3 (28791 thorn-03.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/"> 
<bounds minlat="41.9704500" minlon="-87.6928300" maxlat="41.9758200" maxlon="-87.6894800"/> 
<node id="261114295" visible="true" version="7" changeset="11129782" timestamp="2012-03-28T18:31:23Z" user="bbmiller" uid="451048" lat="41.9730791" lon="-87.6866303"/> 

, и я хочу, чтобы извлечь границы и узел из XML с помощью питона ITER parse Я пробовал следующий код-фрагмент

import xml.etree.cElementTree as ET 
import pprint 

def count_tags(filename): 
    mytags = {} 
    osmfile = open('example.osm', 'r') 
    for event, elem in ET.iterparse(osmfile,events=('end',)): 
     if elem.tag == "tag": 
      if elem.attrib['k'] in mytags: 
       mytags[elem.attrib['k']] += 1 
      else: 
       mytags[elem.attrib['k']] = 1 

, но я не могу извлечь границы и узел ... что мне не хватает?

+0

'elem.tag' никогда не будет равно "тег" , Это ваш фактический код? – larsks

+0

Я обновил XML –

ответ

0

Предполагая bounds и node один уровень под корень XML, это должно работать:

def count_tags(): 
    mytags = {} 
    for event, child in ET.iterparse('example.osm'): 
     if child.tag in ('bounds', 'node'): 
      mytags[child.tag] = child.attrib 
    print mytags 

Вызов count_tags выходов:

{ 
    'node': {'changeset': '11129782', 'uid': '451048', 'timestamp': '2012-03-28T18:31:23Z', 'lon': '-87.6866303', 'visible': 'true', 'version': '7', 'user': 'bbmiller', 'lat': '41.9730791', 'id': '261114295'}, 
    'bounds': {'minlat': '41.9704500', 'maxlon': '-87.6894800', 'minlon': '-87.6928300', 'maxlat': '41.9758200'} 
} 
+0

Я хочу сделать что-то вроде для случая, ребенок в ET.iterparse ('example.osm'): если child.tag в mytags: mytags [child.tag] = 1 еще: mytags [child.tag] + = 1 , но m получает ошибку на + =. Я хочу сохранить счет в поле значений –

+0

получил это решение .. мне пришлось использовать defaultdict (int) –