我尝试使用ElementTree的iterparse
函数来解析大型OpenStreetMap(OSM)XML文件。我试图将我的OSM文件及其元素定义为类对象,以帮助我以后的分析。
现在我已经成功定义了OSM
类:
parse()
使用生成器来分析OSM文件。它产生elem
(OpenStreetMap中的元素)。reset()
重置生成器以避免耗尽。slice()
使用itertools通过传递start,stop和step的索引来创建OSM文件的视图。它返回elem
。iloc()
调用了切片函数来查找特定的elem
。getchild()
返回具有给定索引的元素的辅助元素。我的问题是:我想创建另一个类elem
来在单个元素上创建函数。但是,我必须通过调用elem
函数来生成OSM
的实例。
即我有 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)
答案 0 :(得分:0)
我找到了办法:
class Mother(object):
def __init__(self):
pass
def reproduce(self):
return Child()
class Child(object):
def __init__(self):
pass