Python 在 XML 中:从孙子那里获取文本

Python in XML: Getting text from grandchildren

我是编程新手,但我相信我正在寻找的数据很容易获得,但我似乎无法理解它。

我的 XML 有几个 parents,当然每个人都有他们的 children 和兄弟姐妹,还有兄弟姐妹和 children。我正在尝试达到一个特定的 grandchild,其中一个兄弟姐妹在某个标签中有一个特定的词。

XML(实际上是 KML)如下所示:

<Folder>
    <name> Run-1</name>
    <Placemark>
        <name> run 1</name>
        <Snippet></Snippet>
        <styleUrl>#flightline</styleUrl>
        <LineString>
            <extrude>0</extrude>
            <altitudeMode>clampToGround</altitudeMode>
            <coordinates>54.72664746,24.91070844,2008 54.76968330,24.91068150,2008
            </coordinates>
        </LineString>
    </Placemark>
</Folder>

每个名为 Run-X 的文件夹都可以有无限数量的地标。

我只想要每个文件夹的名称和包含 <styleUrl>#flightline</styleUrl> 的(只有一个)地标中的坐标。

这将为我创建一个包含 运行 编号和 'flight line' 坐标的列表。

当然,我正在尝试 python 和 w3 学校教程,我了解基础知识,但我似乎无法将它们放在一起。我是否需要一个 for 循环来到达每个 child 和一个嵌套循环来到​​达每个 sub-child?或者如果有 <styleUrl>#flightline</styleUrl> 标签,我可以在整个树中查找标签并获取坐标值吗?

我一直在尝试 root.iter 和 root.findall,但我似乎得不到任何结果。

关注怎么样?假设您的 kml 数据位于 data.xml

from collections import OrderedDict
from xml.etree import ElementTree as ET

tree = ET.parse("data.xml")
root = tree.getroot()

result = OrderedDict()
for folder in root.iter('Folder'):
    for placemark in folder.findall('Placemark'):
        if placemark.find('styleUrl').text == '#flightline':
            result[folder.find('name').text.strip()] = placemark.find('LineString/coordinates').text.strip()

print(result)

非常感谢您的帮助。我找到了一个基于您的代码的解决方案:

for folder in root.iter('Folder'):
for placemark in folder.findall('Placemark'):
    if placemark.find('styleUrl').text == '#flightline':
        runLine = folder.find('name').text[5:]
        startLat = placemark.find('LineString/coordinates').text[:11]
        startLong = placemark.find('LineString/coordinates').text[12:23]
        endLat = placemark.find('LineString/coordinates').text[29:40]
        endLong = placemark.find('LineString/coordinates').text[41:52]
        print ('Flightline: ' + runLine + ', coordinates start: ' + startLat + ' ' + startLong + '. Coordinates end: ' + endLat + ' ' + endLong + '.')

如果你想知道,我正在尝试读取航空测量程序输出的文件(飞行路线是用来拍照的线路)并创建一个 csv 和飞行计划文件供飞机上的 GPS 读取它可以自动飞行。

现在我需要找到一种方法从初始 .kml 文件中删除 <kml> </kml> 标签(在它们可能在的任何行上),然后才打开并解析它,输出行号和坐标(自定义名称)根据 CSV 中的飞行路线,并以 Garmin 特定格式输出另一个飞行计划文件。至少现在我知道如何扫描文件了。再次感谢先生!