PYTHON   123

xmlfmt py

Guest on 21st June 2022 05:54:14 PM

  1. #!/bin/env python
  2.  
  3. import xml.etree.ElementTree as ET
  4. import sys
  5.  
  6. out = sys.stdout
  7.  
  8. NS = '{http://schemas.android.com/apk/res/android}'
  9. ANS = 'android:'
  10.  
  11. def escape(str):
  12.         out = '"'
  13.         for c in str:
  14.                 if c == '"': out += '"'
  15.                 elif c == '<': out += '&lt;'
  16.                 elif c == '>': out += '&gt;'
  17.                 elif c == '&': out += '&amp;'
  18.                 elif ord(c) < 32: out += ('&#x%04X;' % ord(c))
  19.                 elif ord(c) > 127: out += ('&#x%04X;' % ord(c))
  20.                 else: out += c
  21.         return out + '"'
  22.  
  23. def indent(level):
  24.         out.write('\t' * level)
  25.  
  26. def attcmp(a, b):
  27.         a = a.replace(NS, ANS)
  28.         b = b.replace(NS, ANS)
  29.         if a < b: return -1
  30.         if a > b: return 1
  31.         return 0
  32.  
  33. def dumptag(node, level):
  34.         out.write('\n')
  35.         indent(level); out.write('<' + node.tag)
  36.         if level == 0:
  37.                 out.write(' xmlns:android="http://schemas.android.com/apk/res/android"')
  38.         atts = node.keys()
  39.         if len(atts) > 0:
  40.                 if len(atts) > 1: out.write('\n')
  41.                 atts.sort(cmp=attcmp)
  42.                 for att in atts:
  43.                         key = att.replace(NS, ANS)
  44.                         val = escape(node.get(att))
  45.                         if len(atts) > 1:
  46.                                 indent(level+1)
  47.                                 out.write(key+'='+val+'\n')
  48.                         else:
  49.                                 out.write(' '+key+'='+val)
  50.                 if len(atts) > 1: indent(level+1)
  51.  
  52.         if len(node) > 0:
  53.                 out.write('>\n')
  54.                 for kid in node:
  55.                         dumptag(kid, level + 1)
  56.                 out.write('\n'); indent(level); out.write('</' + node.tag + '>\n')
  57.         else:
  58.                 out.write('/>\n')
  59.  
  60. for arg in sys.argv[1:]:
  61.         tree = ET.parse(arg).getroot()
  62.         out.write('<?xml version="1.0" encoding="utf-8"?>\n')
  63.         dumptag(tree, 0)

Raw Paste


Login or Register to edit or fork this paste. It's free.