Следующее содержимое XML должно быть отсортировано, а дубликаты должны быть удалены.Вид того, что будет делать `sort -u ':
<As>
<A n="t" m="d">
<p n="e">a</p>
<p n="e">Q</p>
<p n="e">ra</p>
<p n="e">a</p>
<p n="e">Q</p>
<p n="e">b</p>
<p n="r">1</p>
<p n="f">k</p>
<p n="v">q</p>
</A>
<A n="r" m="d">
<p n="f">*t</p>
<p n="c">x</p>
</A>
<A n="s" m="d"/>
</As>
Это должно стать таким, убрали дупс.
<As>
<A n="r" m="d">
<p n="c">x</p>
<p n="f">*t</p>
</A>
<A n="s" m="d"/>
<A n="t" m="d">
<p n="e">Q</p>
<p n="e">a</p>
<p n="e">b</p>
<p n="e">ra</p>
<p n="f">k</p>
<p n="r">1</p>
<p n="v">q</p>
</A>
</As>
Мне не ясно, как бы я это сделал с Python3.6.
Вот как я продвинулся с помощью других постов:
#!/usr/bin/python3.6
# vim: ts=2 shiftwidth=2
import sys
import getopt
from xml.etree import ElementTree as ET
def sort_tree(tree):
for child in tree:
sort_tree(child)
sorted_children = sorted(tree, key=lambda n: n.get('name', n.get('text', n.get('value', ''))).lower())
for child in tree:
tree.remove(child)
for child in reversed(sorted_children):
tree.insert(0, child)
def main(argv):
inputfile = None
outputfile = None
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print ('Input file is ', inputfile)
print ('Output file is ', outputfile)
if not inputfile:
return
if not outputfile:
return
xml = open(inputfile,"r").read()
print("%s\n" % xml)
tree = ET.fromstring(xml)
sort_tree(tree)
xml = ET.tostring(tree, encoding="unicode")
print('%s\n' % xml)
if __name__ == "__main__":
main(sys.argv[1:])
Как здесь должна работать "ламба"?Я предполагаю, что 'name' и 'value' могут нуждаться в переключении?Спасибо!