nodeLists = [dom.xpath('//exercises//problem-set/entry | //exercises//multi-part/entry') for dom in doms]
assert len(nodeLists[0]) == len(nodeLists[1])

for tagName in ['solution','correct']:
    for nodeIndex in range(len(nodeLists[0])):
        entries = [nodeList[nodeIndex] for nodeList in nodeLists]
        solutions = [entry.find(tagName) for entry in entries]
        solutionStrings = []
        for solution in solutions:
            if solution is None:
                solutionStrings.append('')
            else:
                solutionStrings.append(strip_namespaces(etree.tostring(solution, with_tail=False)))
        if solutionStrings[0] != solutionStrings[1]:
            blocks = StringMatcher.matching_blocks(StringMatcher.editops(solutionStrings[0], solutionStrings[1]), solutionStrings[0], solutionStrings[1])
            if sum([block[2] for block in blocks])/max(len(solutionStrings[0]), len(solutionStrings[1])) < 0.1:
                blocks = []
            for i, col in [(0,'old'), (1,'new')]:
                pos = 0
                output = ''
                for block in blocks:
                    if block[i] > pos:
                        output += termColors[col] + solutionStrings[i][pos:block[i]] + termColors['reset']
                    output += solutionStrings[i][block[i]:block[i]+block[2]]
                    pos = block[i]+block[2]
                if pos < len(solutionStrings[i]):
                    output += termColors[col] + solutionStrings[i][pos:] + termColors['reset']
                print '===', col.upper(), '===================================================='
                print output
            print '============================================================'