【问题标题】:Why are some elements of this OpenStreetMap tree being skipped by iterparse?为什么这个 OpenStreetMap 树的某些元素会被 iterparse 跳过?
【发布时间】:2015-04-17 21:27:45
【问题描述】:

我有一个 OSM 文件,它捕获了一个小社区。 http://pastebin.com/xeWJsPeY

我的 Python 代码做了很多额外的解析,但这里可以看到主要问题的一个示例:

import xml.etree.cElementTree as CET
osmfile = open('osm_example.osm','r')
for event, elem in CET.iterparse(osmfile,events = ('start',)):
    if elem.tag == 'way':
        if elem.get('id') == "21850789":
            for child in elem:
                print CET.tostring(child,encoding='utf-8')
    elem.clear()

在这里和其他地方,我注意到缺少特定条目的标签(其中标签是一个看起来像<tag k="highway" v="residential" /> 的元素。据我所知,所有<nd .../> 元素都被正确读取。

在处理文件时我注意到的另一件事是,当我在带有'way' 标签的元素上使用tostring() 时,如果读取<tag .../> 元素时出现错误,它不会附加换行符到最后。例如,在运行时

for event, elem in CET.iterparse(osmfile,events = ('start',)):
    if elem.tag == 'way':
        print CET.tostring(elem,encoding='utf-8')
    elem.clear()

缺少<tag .../> 元素的条目的输出是

<nd ref="235476200" />
  <nd ref="1865868598" /></way><way changeset="12727901" id="21853023" timestamp="2012-08-14T15:23:13Z" uid="451048" user="bbmiller" version="8" visible="true">
  <nd ref="1865868557" />

相对于一个形成得很好,

 <tag k="tiger:zip_left" v="60061" />
  <tag k="tiger:zip_right" v="60061" />
 </way>
 <way changeset="15851022" id="21874389" timestamp="2013-04-24T16:33:28Z" uid="451693" user="bot-mode" version="3" visible="true">
  <nd ref="235666887" />
  <nd ref="235666891" />

这里发生了什么问题?

【问题讨论】:

    标签: python xml openstreetmap iterparse


    【解决方案1】:

    您似乎正在搜索子元素以响应 start 事件。但是子元素还不一定被读取。

    考虑这个片段:

    <a>foo<b/></a>
    

    start 事件发生在解析器读取 &lt;a&gt; 之后,但在它读取 foo 之前,更重要的是,在它读取 &lt;b/&gt; 之前。正如the documentation 所说:

    注意 iterparse() 只保证它在发出“start”事件时已经看到了起始标记的“>”字符,因此定义了属性,但 text 和 tail 属性的内容在那时是未定义的观点。这同样适用于子元素;它们可能存在也可能不存在。

    如果您需要一个完全填充的元素,请寻找“结束”事件。

    因此,您可能会通过以下代码获得所需的行为:

    for event, elem in CET.iterparse(osmfile,events = ('end',)):
    

    【讨论】:

    • 我使用了 'end' 并改变了我清除元素的方式。我之前避免“结束”,因为我想最后清除孩子,但我能够为此制定解决方法。谢谢。
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多