Skip to content

Categories:

XML in Python: Move seats, add links, merge labels

More automated massaging of venue XML.

from lxml import etree
import os
 
bigxml = os.path.abspath("C:\\Docume~1\\dmack\\Desktop\\seatmap\\projects\\reds\\redsVbrew269.xml")
doc = etree.parse(bigxml)
root = doc.getroot()
 
 
 
# Shove all seat and trim elements on all screens down one Y-axis point.
# Seats use y_coord system, trim uses pixel-for-pixel y_canvas.
for screens in root[8]: # For each screen node...
  for seat in screens[0]:
    new_y = int(seat[1].text) + 1
    seat[1].text = str(new_y)
  for trim in screens[1]:
    new_y = int(trim[1].text) + 21
    trim[1].text = str(new_y)
 
 
 
# Add top and bottom nav links to every screen.
# TODO: Detect non-existing previous and next screens, don't add link in those cases.
# TODO: Determine section names in next screen, reference those in current-screen link text (e.g., link: "to sections 101, 102" -- sketchy, would probably need to happen after merge, avoid row labels).
x = dict()
y = dict()
for screen in doc.iter("screen"):
  x[screen.get("number")] = 0
  y[screen.get("number")] = 0
  screen.get("number")
  for seat in screen.iter("seat"):
    for el in seat:
      if el.tag == "x_coord" and int(el.text) > x[screen.get("number")]:
        x[screen.get("number")] = int(el.text)
      elif el.tag == "y_coord" and int(el.text) > y[screen.get("number")]:
        y[screen.get("number")] = int(el.text)
  top_link = "<trimitem type='navigation'><x_canvas>%s</x_canvas><y_canvas>%s</y_canvas><trim_string>To Previous Screen</trim_string><target_screen_number>%s</target_screen_number><metadata/></trimitem>" % (str((int(x[screen.get('number')]) * 20) /2), 1, str(int(screen.get('number')) - 1))
  top_link_xml = etree.XML(top_link)
  bottom_link = "<trimitem type='navigation'><x_canvas>%s</x_canvas><y_canvas>%s</y_canvas><trim_string>To Next Screen</trim_string><target_screen_number>%s</target_screen_number><metadata/></trimitem>" % (str((int(x[screen.get('number')]) * 20) /2), str((int(y[screen.get('number')]) * 21) + 21), str( int(screen.get('number')) + 1))
  bottom_link_xml = etree.XML(bottom_link)
  for trim in screen.iter("trim"):
    trim.append( top_link_xml )
    trim.append( bottom_link_xml )
 
 
 
# Merge labels on trimitems that are 20 pixels apart.
# For each trimitem on each screen, see if there's another trimitem 20 pixels off to the right; if so, slurp that text and repeat search from the last trimitem's X-axis point.
for screens in root[8]: # For each screens node, which will contain 0 or more screen nodes.
  print '******'
  print 'screen ', screens.get('number')
  print '******'
  tr = 1
  print 'first level of trimitems for screen number', screen.get('number')
  for lhs in screens[1]: # Get our LHS item.
    print 'trimitem ', tr, ': ', lhs[0].text, 'x', lhs[1].text, 'text: "', lhs[2].text, '"'
  for lhs in screens[1]:
    if (
        lhs[2].text != 'deleteme' and              # Not an object we've sucked text from already and marked for deletion.
        lhs.get('type') != 'navigation'):          # Also not a link.
      x_cursor = int(lhs[0].text)
      for screens2 in root[8]: 
        if screens2.get('number') == screens.get('number'): 
          for rhs in screens2[1]: # Check out all trimitems on that same screen so we can compare to LHS.
            if (
                (int(rhs[0].text) - x_cursor <= 20 and     # RHS textitem is within 20 pixels to the right of LHS textitem.
                int(rhs[0].text) - x_cursor > 0) and       # RHS texitem is definitely TO the right, and not behind us.
                (int(rhs[1].text) == int(lhs[1].text)) and # RHS textitem is on LHS textitem's Y plane.
                (lhs is not rhs) and                       # Not the same object.
                rhs[2].text != 'deleteme' and              # Not an object we've sucked text from already and marked for deletion.
                rhs.get('type') != 'navigation'):          # Not a link.
              print '-', tr, 'comparing:', lhs[0].text, 'x', lhs[1].text, 'text: "', lhs[2].text, '"', ' ***vs*** ', rhs[0].text, 'x', rhs[1].text, 'text: "', rhs[2].text, '"'
              print '-- different object', int(rhs[0].text) - x_cursor, 'x points away, text: "', rhs[2].text, '"'
              lhs[2].text = lhs[2].text + rhs[2].text
              rhs[2].text = "deleteme"
              print "--- win, ", lhs[2].text
              x_cursor = int(rhs[0].text)
              print '--- just cranked up x_cursor, here is x_cursor (', x_cursor, ') - lhs[0].text (', lhs[0].text, '):', x_cursor - int(lhs[0].text)
    tr += 1
 
 
 
# Delete those trim items marked for deletion -- their text has gone on to a better place.
for screens in root[8]:
  for lhs in screens[1]:
    if (lhs[2].text == 'deleteme'):
      screens[1].remove(lhs)
 
 
 
# pretty_print XML to file and we're done.
open('c:\\docume~1\\dmack\\desktop\\out.xml','w').write(etree.tostring(doc, pretty_print=True))

Posted in Development. Tagged with , .

0 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

You must be logged in to post a comment.