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))

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.