From 17299a9a9419d1b869afc3fe8797cecf43eba18d Mon Sep 17 00:00:00 2001 From: Adam Bem Date: Thu, 26 Jan 2023 09:59:27 +0100 Subject: [PATCH] Added early version of libxml backend --- Backend-libXML/Parser.py | 56 ++++++++++++++ .../__pycache__/Parser.cpython-310.pyc | Bin 0 -> 1653 bytes .../__pycache__/server.cpython-310.pyc | Bin 0 -> 1419 bytes Backend-libXML/main.py | 17 +++++ Backend-libXML/sample/xpath.curl | 5 ++ Backend-libXML/sample/xpath.json | 6 ++ Backend-libXML/sample/xsd.curl | 4 + Backend-libXML/sample/xsd.json | 6 ++ Backend-libXML/sample/xslt.curl | 4 + Backend-libXML/sample/xslt.json | 6 ++ Backend-libXML/server.py | 69 ++++++++++++++++++ 11 files changed, 173 insertions(+) create mode 100644 Backend-libXML/Parser.py create mode 100644 Backend-libXML/__pycache__/Parser.cpython-310.pyc create mode 100644 Backend-libXML/__pycache__/server.cpython-310.pyc create mode 100644 Backend-libXML/main.py create mode 100644 Backend-libXML/sample/xpath.curl create mode 100644 Backend-libXML/sample/xpath.json create mode 100644 Backend-libXML/sample/xsd.curl create mode 100644 Backend-libXML/sample/xsd.json create mode 100644 Backend-libXML/sample/xslt.curl create mode 100644 Backend-libXML/sample/xslt.json create mode 100644 Backend-libXML/server.py diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py new file mode 100644 index 0000000..ca60571 --- /dev/null +++ b/Backend-libXML/Parser.py @@ -0,0 +1,56 @@ +from lxml import etree + + +def xpath(source: str, xpath: str) -> str: + """ + Method used to get nodes from XML string using XPath + :param source: XML string used for selection + :param xpath: XPath query used for selection + :return: Nodes selected using XPath + """ + root = etree.XML(source) + nsmap = root.nsmap + + # LXML doesn't accept namespace with None key, + # so it need to be deleted if exists + try: + nsmap.pop(None) + except KeyError: + print(end="") + + result = root.xpath(xpath, namespaces=nsmap) + result_string = "" + for e in result: + result_string += etree.tostring(e, pretty_print=True).decode() + "\n" + return result_string + + + +def xsd(source: str, xsd: str) -> bool: + """ + Method used to validate XML string against XSD schema + :param source: XML string used for validation + :param xsd: XSD schema to validate XML against + :return: If the validation was successful or not + """ + xml_schema = etree.XMLSchema(etree.XML(xsd)) + + xml = etree.XML(source) + + return xml_schema.validate(xml) + + +def xslt(source: str, xslt: str) -> str: + """ + Method used to transformate XML string using XSLT + :param source: Transformed XML string + :param xslt: XSLT string used to transformate XML + :return: Result of transformation + """ + xslt_transform = etree.XSLT(etree.XML(xslt)) + + xml = etree.XML(source) + + transformated = xslt_transform(xml) + print(transformated) + return str(transformated) \ No newline at end of file diff --git a/Backend-libXML/__pycache__/Parser.cpython-310.pyc b/Backend-libXML/__pycache__/Parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6014e16c40ec22553faf399efcce4c6c63a711d GIT binary patch literal 1653 zcmaJ?KW`g16eo|o(^;{VOioiID2FaW(F*9+iQO^2e6VZ;XN1}F?hq%0+OM}?$f z%Q#KR>aS4PV?Rc>t{uy@L(#9$rG1YlDY9UM0?Fg!`~Q27GFw}10^^rQfAs%O3Hb{T zt0RNM*D&2vSQJsTASHc9DN%_|6obiiGRRb_*jxULMQRqQ9H=do0X2=(e960^a-e3a zeL%Xm{sFzDOGB!?)jDL(Ol)6=^lU8sFl1KyiLLqxa?M8z_8jK7Fx_idJh`MbxuUbA zPF^H4cHXMlB~$bY-29PL9Zo!-KA;4D9-L9^0&adH6+I;&k=3+jieDr%u98_=^T*`p z+q0}rJ$ccpF|_O=xy-MKYTYGYkXibwTc_Z9e*Sw~z<8ql&?qr+S_yB&iT0v0N;@&I zrW8j{c7^kHRGk0^u1EV2SQOkDODjv!M7(pI6LbxX6;2nr??tTXO=rGpDi|>E8Yn5U6_J$o@+R;nQOD9DM8TOY5}# zY&?yo&>8muEbUfC6W*blv_q5sI*ikt-lrVGKXd9@p`i%$L{n%V!v_``%%q0W!g7n> zSa_^XE?Ld4D3k>~|MRA@crA;Ol3uUEEKlU9a$X!AJQl7$)TLa7`F(XU*S205PC;2L zm0>krGds7}7+I9Y_XFXFdcg=9#i?|{P5OYp8%zoTWmp*>g}S`KegpD*5FNI+ATJ?b zm;r_eE+#s(&&uMsi3^fj77@l~xeNCenI6D&_{iL8wUc%d_?avGH53qmB?_Oz;e9C7 z>s~pPh$rN1Bfha$Yt|)(Q0^0$4*v`gi9E@nE%v&tzzakUJKlbTOKfWX+?XQbXHj%T9d@ckbVL4SY1E|9 SUr{(Ye6TmkHru}UVdsB)p|~{w literal 0 HcmV?d00001 diff --git a/Backend-libXML/__pycache__/server.cpython-310.pyc b/Backend-libXML/__pycache__/server.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fdb3a0027d0f60b11cc74ddaea3f225ba6c6361 GIT binary patch literal 1419 zcmb_cOK%e~5VpPc?&jH)XL*OmB?kxs2_aD-R0J1Z6-5HVAzEV7rtBkl9hyc7LMm4f zcP{ObpTpHxPMo=cc+5C$;ewzNyYe^V&*Pc#c;u{7DH8bJT>8*?7ZCChC%=CjCRbqO zZviBcG$sjcQHnYPowbpILe=b5@_|TuX2N&GFqwI zL%%ubMP|wJ`8x~u&?Hf2DU*2z_ilY~c7m0-3ghz(CB%?*xVBU* zBn#wy`L^XUGLa2>I_s!Bx4u?+KQ@-#xncd>M5dox@7mqF-79lbWXR8)J^#dV(@oTH zI_^FmB=Na=_FU;U>^O4S#wqkOr zmANQa*9INcGhNu> z+8FCS(RHx;aU<1&bCAnF zcB{tL)gi!U0rfNzyAZH+dN;xz0PBGty$`4R5oQn$05k%95cNX{ClL-K96>mWa15co z4aZSKJI9~cnhgac8k_%-DMv?tP4yH;{)bf2?mXJMRB_g*TJZ#*49$@D04&FT)cD{{ zD&vah>K3-!X$0-pwqDfhS)sGOQSNRg)pB{%apNz*8rg6*$z(rP@B+XSiZw2iGTc1& P0{mW;6=`)hjw<~L)`c#S literal 0 HcmV?d00001 diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py new file mode 100644 index 0000000..9dbe0d8 --- /dev/null +++ b/Backend-libXML/main.py @@ -0,0 +1,17 @@ +import Parser + + +if __name__ == '__main__': + SOURCE = "sample/xslt.xml" + XSLT = "sample/sample.xslt" + + file = open(SOURCE, "r") + xml = file.read() + file.close() + + file = open(XSLT, "r") + xslt = file.read() + print(Parser.xslt(xml, xslt)) + + file.close() + diff --git a/Backend-libXML/sample/xpath.curl b/Backend-libXML/sample/xpath.curl new file mode 100644 index 0000000..f72790a --- /dev/null +++ b/Backend-libXML/sample/xpath.curl @@ -0,0 +1,5 @@ +#url = "localhost:8081/xpathpost" +url = "localhost:5000/xpath" +request = "POST" +data = "@xpath.json" +header = "Content-Type: application/json" diff --git a/Backend-libXML/sample/xpath.json b/Backend-libXML/sample/xpath.json new file mode 100644 index 0000000..70faa16 --- /dev/null +++ b/Backend-libXML/sample/xpath.json @@ -0,0 +1,6 @@ +{ + "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", + "process": "/books/book[name = 'The Law of Success']", + "processor": "saxon", + "version": "2.0" +} diff --git a/Backend-libXML/sample/xsd.curl b/Backend-libXML/sample/xsd.curl new file mode 100644 index 0000000..615fff6 --- /dev/null +++ b/Backend-libXML/sample/xsd.curl @@ -0,0 +1,4 @@ +url = "http://localhost:5000/xsd" +data = "@xsd.json" +header = "Content-Type: application/json" +request = POST diff --git a/Backend-libXML/sample/xsd.json b/Backend-libXML/sample/xsd.json new file mode 100644 index 0000000..91dd2f2 --- /dev/null +++ b/Backend-libXML/sample/xsd.json @@ -0,0 +1,6 @@ +{ + "data": "TestTest3", + "process": " ", + "processor": "saxon", + "version": "1.0" +} diff --git a/Backend-libXML/sample/xslt.curl b/Backend-libXML/sample/xslt.curl new file mode 100644 index 0000000..b5099ff --- /dev/null +++ b/Backend-libXML/sample/xslt.curl @@ -0,0 +1,4 @@ +url = "http://localhost:5000/xslt" +data = "@xslt.json" +header = "Content-Type: application/json" +request = POST diff --git a/Backend-libXML/sample/xslt.json b/Backend-libXML/sample/xslt.json new file mode 100644 index 0000000..f833a40 --- /dev/null +++ b/Backend-libXML/sample/xslt.json @@ -0,0 +1,6 @@ +{ + "data": "Hamlet2001-05-041falseMacbeth2000-12-131falseHarry Potter and the Sorcerer's Stone2005-04-292trueThe Long Walk2018-07-014trueMisery2018-01-314trueThink and Grow Rich2004-09-106trueThe Law of Success1982-05-096falsePatriot Games1995-10-215falseThe Sum of All Fears1992-09-195falseThe Alchemist2017-02-203falseHamlet1994-06-011falseMeasure for Measure1990-03-231falseHamlet1989-05-051trueHamlet1999-05-301trueThe Law of Success2004-11-266trueRomeo and Juliet1997-02-081trueThe Alchemist2009-08-213true", + "process": "", + "processor": "saxon", + "version": "1.0" +} diff --git a/Backend-libXML/server.py b/Backend-libXML/server.py new file mode 100644 index 0000000..b34ce99 --- /dev/null +++ b/Backend-libXML/server.py @@ -0,0 +1,69 @@ +from flask import Flask +from flask import request +from lxml import etree +import json +import time +import Parser + + +app = Flask(__name__) + +@app.route("/xpath", methods=["POST"]) +def xpath(): + request_data = request.get_json() + xml = request_data['data'] + xpath = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xpath(xml, xpath) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) + +@app.route("/xsd", methods=["POST"]) +def xsd(): + request_data = request.get_json() + xml = request_data['data'] + xsd = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xsd(xml, xsd) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) + +@app.route("/xslt", methods=["POST"]) +def xslt(): + request_data = request.get_json() + xml = request_data['data'] + xslt = request_data['process'] + + response = dict() + start = time.time_ns() + try: + response['result'] = Parser.xslt(xml, xslt) + response['status'] = "OK" + except BaseException as e: + response['result'] = str(e) + response['status'] = "ERR" + finally: + exec_time = (time.time_ns() - start) / 10**6 + response['time'] = f"{exec_time:.03f}" + response['processor'] = "libxml2 over lxml" + return json.dumps(response) \ No newline at end of file