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 特定格式输出另一个飞行计划文件。至少现在我知道如何扫描文件了。再次感谢先生!
我是编程新手,但我相信我正在寻找的数据很容易获得,但我似乎无法理解它。
我的 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 特定格式输出另一个飞行计划文件。至少现在我知道如何扫描文件了。再次感谢先生!