Python中的Python:从孙子们那里获取文本

时间:2015-12-24 12:13:45

标签: python xml parsing parent-child kml

我在编程方面相当新手,但我相信我正在寻找的数据很容易获得,但我似乎无法绕过它。

我的XML有几个父母,每个人当然都有孩子的兄弟姐妹和带孩子的兄弟姐妹。我试图联系一个特定的孙子,其中一个兄弟姐妹在某个标签中有一个特定的单词。

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>的(只有一个)地标中的坐标。

这将为我建立一个运行编号列表和“飞行线”坐标。

当然我正在尝试python和w3学校的教程,我理解基础知识,但我似乎无法将它们放在一起。我需要一个for循环来覆盖每个孩子,还有一个嵌套循环来覆盖每个子孩子?或者我可以只在整个树中查找标签,并在有<styleUrl>#flightline</styleUrl>标签的情况下获取坐标值吗?

我一直在玩root.iter和root.findall,但我似乎无法获得任何结果。

2 个答案:

答案 0 :(得分:0)

怎么样?假设您的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)

答案 1 :(得分:0)

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

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 + '.')

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

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