Нет реального способа сортировки xml, пока вы не дойдете до xpath 3.1, я думаю, но это возможно, если вы решите этот вопрос.
Обратите внимание, что, поскольку xml в вашем вопросе неверно (у вас есть необъявленные пространства имен), я использовал более простительный html парсер. С вашим реальным кодом вы должны использовать синтаксический анализатор xml, как указано ниже.
Этот код выполняет сбор значений узлов каждого <name>
дочернего узла (т. Е. Целевого числа) из каждого <trkseg>
родительский узел, сохраняет их в список, сортирует список, использует отсортированный список, чтобы снова выбрать узлы <trkseg>
в указанном порядке, и использует их (вместе с открывающими и закрывающими тегами) для создания нового xml.
import lxml.html as lh # with actual xml you would probably use "from lxml import etree"
trk = """your xml above"""
doc = lh.fromstring(trk) # with actual xml you should probably use "doc = etree.XML(trk)"
names = []
new_trk = """<trk>
<name>GPSRoute.XML</name>""" # this is the preamble which is left untouched
for nam in doc.xpath('//extensions//name'):
names.append(nam.text) #grab the numbers
for name in sorted(names): #sort the grabbed numbers
target = doc.xpath(f'//trkseg[.//name/text()={name}]')
for t in target:
new_trk += lh.tostring(t).decode()
new_trk += '</trk>' # append the closing tag, which is also left untouched
print(new_trk)
Вывод:
<trk>
<name>GPSRoute.XML</name><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>
<color>#00ce00</color>
</extensions>
</trkseg>
<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>
<color>#00ce00</color>
</extensions>
</trkseg>
</trk>