"sort -u" для XML-файлов, использующих python - PullRequest
0 голосов
/ 20 апреля 2019

Следующее содержимое 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' могут нуждаться в переключении?Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...