-
Notifications
You must be signed in to change notification settings - Fork 0
/
xmlisequal.py
56 lines (49 loc) · 2.01 KB
/
xmlisequal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""Module for checking whether two XML records are the same. Ignores
comments and stray whitespace.
>>> import xmlisequal
>>> xml1 = "<xml><mytag>Hello</mytag><mytag>World</mytag></xml><!-- my comment-->"
>>> xml2 = "<xml> <mytag>Hello</mytag> <mytag>World</mytag> </xml>"
>>> xmlisequal.xmlIsEqual(xml1, xml2)
True
>>>
Doe NOT ignore differences in order:
>>> import xmlisequal
>>> xml1 = "<xml> <mytag>Hello</mytag> <mytag>World</mytag> </xml>"
>>> xml2 = "<xml> <mytag>World</mytag> <mytag>Hello</mytag> </xml>"
>>> xmlisequal.xmlIsEqual(xml1, xml2)
False
>>>
"""
from xmldiff import main as xmldiffmain
import xmldiff
import re
import logging
def xmlIsEqual(old, new, pid=''):
diff = xmldiffmain.diff_texts(old, new, diff_options={'F': 0.5, 'ratio_mode': 'fast'})
diffFiltered = []
for difference in diff:
if type(difference) is xmldiff.diff.InsertComment:
logging.debug("Comment, ignore this one %s" % str(difference))
elif type(difference) is xmldiff.diff.UpdateTextIn:
# Is this a for-reals difference or just some stray whitespace?
if difference.text is not None:
textNoWhiteSpace = re.sub(r'\s+', '', difference.text)
if len(textNoWhiteSpace) > 0:
logging.debug("Difference is not just stray whitespace, adding %s" % str(difference))
diffFiltered.append(difference)
else:
logging.debug("Stray whitespace, ignore this one %s" % str(difference))
else:
logging.debug("Difference is None, ignore this one %s" % str(difference))
else:
logging.debug("This one didn't match any of my filters, adding %s" % str(difference))
diffFiltered.append(difference)
if len(diffFiltered) > 0:
for difference in diffFiltered:
logging.info("Difference %s: %s" % (pid,str(difference)))
return False
else:
return True
if __name__ == "__main__":
import doctest
doctest.testmod()