【发布时间】:2018-03-30 23:06:52
【问题描述】:
我正在尝试使用 ElementTree 的 iterparse 函数来解析大型 OpenStreetMap (OSM) XML 文件。我正在尝试将我的 OSM 文件及其元素定义为类对象,以帮助我以后进行分析。
现在我已经成功定义了一个OSM 类:
-
parse()使用生成器迭代解析 OSM 文件。它产生elem(OpenStreetMap 中的元素)。 -
reset()重置生成器以避免耗尽。 -
slice()使用 itertools 通过传递 start、stop 和 step 的索引来查看 OSM 文件。它返回elem的列表。 -
iloc()调用切片函数来定位特定的elem。 -
getchild()返回具有给定索引的元素的次要元素。
我的问题是:我想创建另一个类elem 来在单个元素上创建函数。但是,我只能通过调用OSM 的函数来生成elem 的实例。
即我有 class1。当我调用 class1 实例的函数时,它应该创建并返回 class2 的实例。
我怎样才能做到这一点?
这是我当前的代码:
import xml.etree.cElementTree as ET
from collections import defaultdict
import itertools
class OSM:
def __init__(self, data):
self.data = data
self.parser = ET.iterparse(self.data, events=('start', ))
def parse(self):
_, root = next(self.parser)
for event, elem in self.parser:
yield elem
elem.clear()
root.clear()
def reset(self):
self.parser = ET.iterparse(self.data, events=('start', ))
def slice(self, start=0, stop=1, step=1):
self.reset()
view = []
for i in itertools.islice(self.parse(), start, stop, step):
view.append(i)
return view
def iloc(self, index):
self.reset()
return self.slice(index, index + 1)[0]
def getchild(self, index):
self.reset()
elem = self.iloc(index)
childdict = defaultdict(list)
for i, child in enumerate(list(elem)):
childdict[i] = [child.tag, child.attrib]
return dict(childdict)
【问题讨论】:
-
您可以像在代码中的任何其他位置实例化任何其他类一样执行此操作。
标签: python xml openstreetmap elementtree itertools