我在编程方面相当新手,但我相信我正在寻找的数据很容易获得,但我似乎无法绕过它。
我的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,但我似乎无法获得任何结果。
答案 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文件。至少现在我知道如何扫描文件。再次感谢先生!