{ "info": { "author": "mmoosstt", "author_email": "diponaut@gmx.de", "bugtrack_url": null, "classifiers": [], "description": "# XmlXdiff #\n\nXmlXdiff was inspired by [X-Diff](http://www.inf.unibz.it/~nutt/Teaching/XMLDM1112/XMLDM1112Coursework/WangEtAl-ICDE2003.pdf \"X-Diff: An Effective Change Detection Algorithm for XML Documents\").\n\nSince version 0.3.2 the distance cost's algorithm is replaced by parent-identification. This might by a wrong decision but the result's for huge xml documents (see. test 9) improved in performance and quality. \n\nThis is not a bullet prove library (till now). It s more a playground to get in touch with comparing tree structures and presenting the resulting in a charming way.\n\n## dependencies ##\n * PySide2\n * svgwrite\n * lxml\n\n## installation ##\n\n```\npython pip XmlXdiff\n```\n\n## fist step ##\n\n### file example ###\n```\nfrom diffx import main\n\n_xml1 = './simple/xml1.xml'\n_xml2 = './simple/xml2.xml'\n\nmain.compare_xml(_xml1, _xml2)\nmain.save('./simple/diffx_file.svg')\n\n```\n\n### string example ###\n```\n# file example\n\nfrom diffx import main\n\n_xml1 = './simple/xml1.xml'\n_xml2 = './simple/xml2.xml'\n\nmain.compare_xml(_xml1, _xml2)\nmain.save('./simple/diffx_file.svg')\n\n```\n\n# status quo #\n![XmlXdiff example](https://github.com/mmoosstt/XmlXdiff/blob/master/tests/test1/xdiff_a_b.svg \"XmlXdiff/tests/test1\")\n\n\n# implementation #\n\n Each xml element is identified by it's xpath and a hash calculated by selecting relevant information. Start with the identification of huge xml blocks (changed/moved). Identification of parent elements by tag, text-pre, text-post, attribute-names and attribute-values. Parent xml blocks can contain further parent xml blocks.\n\n```\n \n text-pre \n \t<... children ...>\n text-post\n \n```\n\n 1. mark all xml elements as changed\n 1. iterate over parent blocks, starting with maximum children to parent blocks with less children\n 1. mark unchanged xml elements of current parent\n 1. mark moved xml elements of current parent\n 1. mark xml elements identified by tag name and attribute names of the current parent\n 1. mark xml elements identified by attributes values and element text of the current parent\n 1. mark xml elements identified by tag name of the current parent\n 1. mark xml elements with xpath that do not exist in the other xml tree as added/deleted of the current parent\n 1. Repeat 3. till all xml elements are identified\n\nAll xml elements that are still marked as changed have to be investigated\n\n## performance ##\n\n[//]: # (insert_performance_start)\n\n```\ntest1: delta_t=0.0699s xml_elements=63\ntest2: delta_t=0.0104s xml_elements=5\ntest3: delta_t=0.0154s xml_elements=10\ntest4: delta_t=0.0240s xml_elements=32\ntest5: delta_t=0.0258s xml_elements=34\ntest6: delta_t=0.0290s xml_elements=34\ntest7: delta_t=0.0124s xml_elements=8\ntest8: delta_t=0.1027s xml_elements=67\ntest9: delta_t=4.2290s xml_elements=6144\ntest11: delta_t=0.0298s xml_elements=34\ntest12: delta_t=0.0288s xml_elements=45\ntest13: delta_t=0.0442s xml_elements=75\n\n```\n\n[//]: # (insert_performance_end)\n\n## coverage ##\n\n[//]: # (insert_coverage_start)\n\n```\nName Stmts Miss Cover\n------------------------------------------------------------\nlib\\diffx\\__init__.py 21 4 81%\nlib\\diffx\\base.py 107 2 98%\nlib\\diffx\\differ.py 170 19 89%\nlib\\diffx\\hash.py 71 0 100%\nlib\\diffx\\svg\\__init__.py 0 0 100%\nlib\\diffx\\svg\\coloured_text.py 21 0 100%\nlib\\diffx\\svg\\coloured_without_text.py 12 5 58%\nlib\\diffx\\svg\\compact.py 340 34 90%\nlib\\diffx\\svg\\render_text.py 76 2 97%\nlib\\diffx\\xpath.py 54 3 94%\n------------------------------------------------------------\nTOTAL 872 69 92%\n\n```\n\n[//]: # (insert_coverage_end)\n\n## open issues ##\n * performance analysis and improvements (different hash algorithms, ...)\n * if there are some users, improve interface\n * investigation of merge interfaces\n\n## release notes ##\n\nv1.0.0\n* XmlXdiff renamed to diffx\n* ui improved diffx.main added as entry point\n* code refactored - pythonic, pep8\n* text block introduced\n* performance improved\n\n\nv0.3.3:\n * source code clean up\n * diff text without spaces \n * static code quality tools introduced\n\nv0.3.2:\n * implemented parent-identification without children context\n * split segments replaced by parent-identification (no dependency to number of child's nor content of child's)\n * color scheme changed\n * coverage improved\n\nv0.2.2:\n * search areas are split into segments between unchanged xml nodes\n * added/deleted/verified to be added\n * overlapping search areas possible now (merge proposals)\n\n## documentation ##\n![Tests](./doc/tests.md \"Executed Tests\")\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mmoosstt/XmlXdiff", "keywords": "", "license": "LGPL", "maintainer": "", "maintainer_email": "", "name": "XmlXdiff", "package_url": "https://pypi.org/project/XmlXdiff/", "platform": "", "project_url": "https://pypi.org/project/XmlXdiff/", "project_urls": { "Homepage": "https://github.com/mmoosstt/XmlXdiff" }, "release_url": "https://pypi.org/project/XmlXdiff/1.0.0/", "requires_dist": [ "PySide2", "lxml", "svgwrite" ], "requires_python": "", "summary": "Compare xml files with svg output.", "version": "1.0.0" }, "last_serial": 5402392, "releases": { "0.2.1": [ { "comment_text": "", "digests": { "md5": "e43b3e7d6930ea690a07eaf1738e15ae", "sha256": "cf3ea9c88de871cae72229a564fdb138fb1ce2a18ed29f04846dadff7c145048" }, "downloads": -1, "filename": "XmlXdiff-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e43b3e7d6930ea690a07eaf1738e15ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11453, "upload_time": "2019-01-02T20:44:46", "url": "https://files.pythonhosted.org/packages/0e/25/390203b37701e5f41c50b318cfa23ff95c9c63b607beb161c68434da7383/XmlXdiff-0.2.1-py3-none-any.whl" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "aef2e281a6501a0f75748d993db2bde6", "sha256": "4b1b68426f5154a5206cbe77596a0a439d37e2b2c92006e8974dcf033216878d" }, "downloads": -1, "filename": "XmlXdiff-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "aef2e281a6501a0f75748d993db2bde6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12629, "upload_time": "2019-01-11T23:22:36", "url": "https://files.pythonhosted.org/packages/22/e5/b68289f851bc4463a635fcd648f566461d7951f2d338c236464e51fcdd1b/XmlXdiff-0.2.2-py3-none-any.whl" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "327127d42d8291eb535bf7e8d1b99dad", "sha256": "1223f8187f9f5b8d1467bb00d45229968d67fb53d86c4898009f0f3639a41c68" }, "downloads": -1, "filename": "XmlXdiff-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "327127d42d8291eb535bf7e8d1b99dad", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12871, "upload_time": "2019-01-14T21:40:53", "url": "https://files.pythonhosted.org/packages/de/ad/1eb199c36b99ab554ad71a2e8b8418fd9a559ba364a35cd3a22777d60b29/XmlXdiff-0.2.3-py3-none-any.whl" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "638820f7931eb98d8ab37741b4c61216", "sha256": "b4a42e64ee6a843cb2b495b67e692edc799f7339bb2d114f2675698b058c431c" }, "downloads": -1, "filename": "XmlXdiff-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "638820f7931eb98d8ab37741b4c61216", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13631, "upload_time": "2019-01-20T22:15:18", "url": "https://files.pythonhosted.org/packages/df/30/73d42cfd78112e56a7f20eb58154ef7f412526745ec98e14a700113217ae/XmlXdiff-0.3.2-py3-none-any.whl" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "9b8111a2f99ed3444e93c0e0750712cd", "sha256": "e0100109ba26dec4bf9699ea7336646fe334da8f6ca1f5b5b0c149986145cb23" }, "downloads": -1, "filename": "XmlXdiff-0.3.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9b8111a2f99ed3444e93c0e0750712cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15477, "upload_time": "2019-02-05T21:34:44", "url": "https://files.pythonhosted.org/packages/9f/d8/e6ae2c58fef508d7a290b8482b6775ed6e86cc03e0e8a57099f09f3ffa0c/XmlXdiff-0.3.4-py3-none-any.whl" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "baa17711f5ec004ee479869bd26c7312", "sha256": "f3eaa07329b2470741a36d7221356550b7ba49232edafb13db7cd961c9ba426e" }, "downloads": -1, "filename": "XmlXdiff-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "baa17711f5ec004ee479869bd26c7312", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17234, "upload_time": "2019-06-14T22:16:37", "url": "https://files.pythonhosted.org/packages/e5/e2/f86e5e97369a177e9587bde7cbc521940ecb47eb5012e05fcdfccb00bf7e/XmlXdiff-1.0.0-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "baa17711f5ec004ee479869bd26c7312", "sha256": "f3eaa07329b2470741a36d7221356550b7ba49232edafb13db7cd961c9ba426e" }, "downloads": -1, "filename": "XmlXdiff-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "baa17711f5ec004ee479869bd26c7312", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17234, "upload_time": "2019-06-14T22:16:37", "url": "https://files.pythonhosted.org/packages/e5/e2/f86e5e97369a177e9587bde7cbc521940ecb47eb5012e05fcdfccb00bf7e/XmlXdiff-1.0.0-py3-none-any.whl" } ] }