使用Python和ElementTree排序XML文档

问题描述 投票:0回答:1

我正在尝试重新组织一些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:'

如果有人能指出我正确的方向,将不胜感激!

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')
python xml sorting xml-parsing elementtree
1个回答
0
投票
我认为,直到到达xpath 3.1为止,还没有真正的方法对xml进行排序,但是有可能在此方面产生混乱。

[请注意,由于您问题中的xml无效(您有未声明的名称空间),因此我使用了更为宽容的html解析器。使用您的实际代码,您应该使用xml解析器,如下所示。

此代码的作用是从每个<name>父节点收集每个<trkseg>子节点的节点值(即您的目标编号),将它们保存到列表中,对列表进行排序,然后再次使用排序后的列表按此排序顺序选择<trkseg>节点,并使用它们(以及开始和结束标记)来创建新的xml。

© www.soinside.com 2019 - 2024. All rights reserved.