我正在尝试重新组织一些xml文件,这些文件包含完整路由的几个部分,其结构如下:
<trk>
<name>GPSRoute.XML</name>
<trkseg>
<trkpt lat="37.077882" lon="-112.242785">
<ele>1688.00</ele>
<time>2020-04-18T01:56:39.80Z</time>
</trkpt>
<extensions>
<name>14</name>
<gte:color>#00ce00</gte:color>
</extensions>
</trkseg>
<trkseg>
<trkpt lat="37.077888" lon="-112.242783">
<ele>1688.00</ele>
<time>2020-04-18T01:56:39.80Z</time>
</trkpt>
<extensions>
<name>1</name>
<gte:color>#00ce00</gte:color>
</extensions>
</trkseg>
</trk>
我尝试按名称而不是按时间对文件进行排序,并将结果写入一个新文件。到目前为止,这是我取得的成绩,它成功地捕获了列表中的名称,但在data.sort()上出现了错误,具体如下:
“TypeError:'xml.etree.ElementTree.Element'和'xml.etree.ElementTree.Element'的实例之间不支持'<;'
如果有人能给我指出正确的方向,我将不胜感激
import xml.etree.ElementTree as ET
tree = ET.parse('Filename.xml')
root = tree.getroot()
data = []
for track in root:
for segment in track:
for extension in segment:
for name in extension.findall('name'):
print(name.text)
data.append((name))
data.sort()
tree.write('Sorted.xml')
我认为,在使用XPath3.1之前,并没有真正的方法对xml进行排序,但也有可能在这一点上混淆视听
请注意,由于您问题中的xml无效(您有未声明的名称空间),因此我使用了一个更宽容的html解析器。对于实际代码,您应该使用xml解析器,如下所示
这段代码的作用是,从每个
<trkseg>
父节点收集每个<name>
子节点(即您的目标编号)的节点值,将它们保存到列表中,对列表进行排序,使用排序后的列表按排序顺序再次选择<trkseg>
节点,并使用它们(连同开始和结束标记)创建新的xml输出:
可以将
Element
对象视为子元素作为成员的iterable。这使得对根元素的子元素进行排序变得容易。在这种情况下,我们需要为第一个子项(<name>GPSRoute.XML</name>
)创建一个例外,它不参与排序XML文档中有一个未声明的名称空间前缀,因此为了使其工作,我将
gte:color
更改为color
结果:
相关问题 更多 >
编程相关推荐