在Python中解析CityGML时没有结果

1 投票
1 回答
914 浏览
提问于 2025-04-18 09:16

我现在正在处理CityGML数据,并尝试用Python解析CityGML。

为此,我使用了ElementTree,这个工具可以很好地处理任何XML文件。但是每当我尝试解析CityGML文件时,却没有得到任何结果。

举个例子,我想获取CityGML文件中所有名为“creationDate”的子标签的列表。以下是代码:

import xml.etree.ElementTree as ET
tree = ET.parse('Gasometer.xml')
root = tree.getroot()

def child_list(child):
    list_child = list(tree.iter(child))
    return list_child

date = child_list('creationDate')
print (date)

但我只得到一个空列表[]。

这是CityGML文件的最开始部分(你可以在最后找到“creationDate”标签):

<?xml version="1.0" encoding="UTF-8"?>
<CityModel>
  <cityObjectMember>
    <bldg:Building gml:id="UUID_899cac3f-e0b6-41e6-ae30-a91ce51d6d95">
      <gml:description>Wohnblock in geschlossener Bauweise</gml:description>
      <gml:boundedBy>
        <gml:Envelope srsName="urn:ogc:def:crs,crs:EPSG::3068,crs:EPSG::5783" srsDimension="3">
          <gml:lowerCorner>21549.6537889055 17204.3479916992 38.939998626709</gml:lowerCorner>
          <gml:upperCorner>21570.6420902953 17225.660050148 60.6840192923434</gml:upperCorner>
        </gml:Envelope>
      </gml:boundedBy>
      <creationDate>2014-03-28</creationDate>

这种情况不仅发生在我尝试获取子标签列表时。我无法打印任何属性或标签名称。看起来我解析文件的方式是错的。我希望有人能帮我解决这个问题,告诉我该怎么做!谢谢!

1 个回答

3

因为这是一个旧帖子,我就把这些内容留在这里,以防其他人需要它。

要解析CityGML,可以试试下面的代码,这应该能帮助你大致了解如何获取信息。

import xml.etree.ElementTree as ET
def loadfile():
    tree = ET.parse('filename')
    root = tree.getroot()

    for envelope in root.iter('{http://www.opengis.net/gml}Envelope'):
        print "ENV tag", envelope.tag
        print "ENV attrib", envelope.attrib
        print "ENV text", envelope.text

        lCorner = envelope.find('{http://www.opengis.net/gml}lowerCorner').text
        uCorner = envelope.find('{http://www.opengis.net/gml}upperCorner').text

        print "lC",lCorner 
        print "uC",uCorner

if __name__== "__main__":
    loadfile()

如果想获取srsName,可以试试以下代码:

import xml.etree.ElementTree as ET
def loadfile():
    tree = ET.parse('filename')
    root = tree.getroot()
    for envelope in root.iter('{http://www.opengis.net/gml}Envelope'):
        key = envelope.attrib
        srsName = key.get('srsName')
        print "SRS Name: ", srsName

if __name__== "__main__":
    loadfile()

希望这能帮助到你或者其他可能尝试用ElementTree解析CityGML的人。

撰写回答