Python 3.x 仅返回带有elemtree的特定标记

Python 3.x 仅返回带有elemtree的特定标记,python-3.x,xml,elementtree,Python 3.x,Xml,Elementtree,我使用elementree将一个XML文件解析为一个新的(较短的)文件,该文件包含从打开的地图中获取的数据。我知道数据包含在“节点”和“标记”中,标记具有属性。有些节点有一个带有addr:housenumber属性的标记。我能够使用iterparse读取当前文件,并使用以下代码将结果写入新文件: with open(OUTPUT_FILE, 'wb') as output: for i, element in enumerate(get_elements(OSM_FILE)): outp

我使用elementree将一个XML文件解析为一个新的(较短的)文件,该文件包含从打开的地图中获取的数据。我知道数据包含在“节点”和“标记”中,标记具有属性。有些节点有一个带有addr:housenumber属性的标记。我能够使用iterparse读取当前文件,并使用以下代码将结果写入新文件:

with open(OUTPUT_FILE, 'wb') as output:
for i, element in enumerate(get_elements(OSM_FILE)):
    output.write(ET.tostring(element, encoding='utf-8'))
get_elements函数如下所示:

def is_house_num(elem):
    return (elem.attrib['k'] == "addr:housenumber")

    for event, elem in context:
        if event == 'end' and elem.tag in tags:
            yield elem
            root.clear()
<node id="356682074" lat="40.2799548" lon="-111.6457549" version="2" timestamp="2014-08-11T20:33:35Z" changeset="24687880" uid="2253787" user="1000hikes">
    <tag k="addr:city" v="Provo"/>
    <tag k="addr:housenumber" v="3570"/>
    <tag k="addr:postcode" v="84604"/>
    <tag k="addr:street" v="Timpview Drive"/>
    <tag k="building" v="school"/>
    <tag k="ele" v="1463"/>
    <tag k="gnis:county_id" v="049"/>
    <tag k="gnis:created" v="02/25/1989"/>
    <tag k="gnis:feature_id" v="1449106"/>
    <tag k="gnis:state_id" v="49"/>
    <tag k="name" v="Timpview High School"/>
    <tag k="operator" v="Provo School District"/>
  </node>
我可以使用以下方法确定哪些节点具有正确的属性标记:

    for event, elem in context:
        if elem.tag == "node":
            for tag in elem.iter("tag"):
                if elem.attrib['k'] == "addr:housenumber":
但是,当我尝试在函数中包含最后一块代码时,我无法使它成为第一块代码中的输出仅是包含addr:housenumber属性标记的节点

我尝试筛选的文件示例如下:

  <node id="356681982" lat="40.3980061" lon="-111.8418770" version="1" timestamp="2009-03-07T14:13:58Z" changeset="749606" uid="4732" user="iandees">
    <tag k="amenity" v="school"/>
    <tag k="ele" v="1397"/>
    <tag k="gnis:county_id" v="049"/>
    <tag k="gnis:created" v="02/25/1989"/>
    <tag k="gnis:feature_id" v="1448986"/>
    <tag k="gnis:state_id" v="49"/>
    <tag k="name" v="Sego Lily School"/>
  </node>
  <node id="356682074" lat="40.2799548" lon="-111.6457549" version="2" timestamp="2014-08-11T20:33:35Z" changeset="24687880" uid="2253787" user="1000hikes">
    <tag k="addr:city" v="Provo"/>
    <tag k="addr:housenumber" v="3570"/>
    <tag k="addr:postcode" v="84604"/>
    <tag k="addr:street" v="Timpview Drive"/>
    <tag k="building" v="school"/>
    <tag k="ele" v="1463"/>
    <tag k="gnis:county_id" v="049"/>
    <tag k="gnis:created" v="02/25/1989"/>
    <tag k="gnis:feature_id" v="1449106"/>
    <tag k="gnis:state_id" v="49"/>
    <tag k="name" v="Timpview High School"/>
    <tag k="operator" v="Provo School District"/>
  </node>
  <node id="356682151" lat="40.2221771" lon="-111.6590893" version="1" timestamp="2009-03-07T14:14:14Z" changeset="749606" uid="4732" user="iandees">
    <tag k="amenity" v="school"/>
    <tag k="ele" v="1376"/>
    <tag k="gnis:county_id" v="049"/>
    <tag k="gnis:created" v="02/25/1989"/>
    <tag k="gnis:feature_id" v="1449138"/>
    <tag k="gnis:state_id" v="49"/>
    <tag k="name" v="Utah Valley Vocational School"/>
  </node>

在这种情况下,我希望新文件只包含中间节点,如下所示:

def is_house_num(elem):
    return (elem.attrib['k'] == "addr:housenumber")

    for event, elem in context:
        if event == 'end' and elem.tag in tags:
            yield elem
            root.clear()
<node id="356682074" lat="40.2799548" lon="-111.6457549" version="2" timestamp="2014-08-11T20:33:35Z" changeset="24687880" uid="2253787" user="1000hikes">
    <tag k="addr:city" v="Provo"/>
    <tag k="addr:housenumber" v="3570"/>
    <tag k="addr:postcode" v="84604"/>
    <tag k="addr:street" v="Timpview Drive"/>
    <tag k="building" v="school"/>
    <tag k="ele" v="1463"/>
    <tag k="gnis:county_id" v="049"/>
    <tag k="gnis:created" v="02/25/1989"/>
    <tag k="gnis:feature_id" v="1449106"/>
    <tag k="gnis:state_id" v="49"/>
    <tag k="name" v="Timpview High School"/>
    <tag k="operator" v="Provo School District"/>
  </node>

谢谢你为我指明了正确的方向。我可以通过修改我的get_elements函数(显然我忘了在上面包含该函数)使其工作,如下所示:


你能用一个支持xpath的库(例如lxml)来代替elementtree吗?我可以,我对其他库都不熟悉。创建新文件后,我需要能够操作数据并将其转换为JSON,这样我就可以从数据创建MongoDB数据库,因此如果有其他库可以简化这一过程,我愿意学习。输出是xml,因此无论您使用何种方法将中间节点转换为JSON,您都可以使用lxml。