diff --git a/Backend-libXML/Parser.py b/Backend-libXML/Parser.py
index 14ce916..7dcb211 100644
--- a/Backend-libXML/Parser.py
+++ b/Backend-libXML/Parser.py
@@ -1,31 +1,18 @@
from lxml import etree
+from io import BytesIO
-def prettify(source: str) -> str:
- """Method used to pretty format given XML
+def formatXML(source: str, prettify: bool) -> str:
+ """Method used to format XML
- :param source: XML
- :return: prettified XML
+ :param source: XML to format
+ :param prettify: sets if XML must be prettified
+ (added indentations etc.) or not
+ :return: formatted XML
"""
- prolog = ""
- prolog_start = source.find("")
-
- if prolog_start != -1:
- prolog_end = source.find("?>") + 2
- prolog = source[prolog_start:prolog_end] + "\n"
- source = source[prolog_end: ]
-
- parser = etree.XMLParser(remove_blank_text=True)
- xml = etree.fromstring(source, parser=parser)
- return prolog + etree.tostring(xml, pretty_print=True).decode()
-def minimize(source: str) -> str:
- """Method used to minimize XML by deleting not needed whitespaces.
-
- :param source: XML
- :return: minimized XML
- """
-
+ # Prolog is removed when XML is parsed
+ # so program has to copy it
prolog = ""
prolog_start = source.find("")
@@ -34,9 +21,14 @@ def minimize(source: str) -> str:
prolog = source[prolog_start:prolog_end]
source = source[prolog_end: ]
+ byte_input = BytesIO(source.encode("utf-8"))
parser = etree.XMLParser(remove_blank_text=True)
- xml = etree.fromstring(source, parser=parser)
- return prolog + etree.tostring(xml, pretty_print=False).decode()
+ xml = etree.parse(byte_input, parser=parser)
+
+ if prettify:
+ prolog += "\n"
+
+ return prolog + etree.tostring(xml, pretty_print=prettify).decode()
def xpath(source: str, xpath: str) -> str:
@@ -48,8 +40,8 @@ def xpath(source: str, xpath: str) -> str:
:return: Nodes selected using XPath
"""
-
- root = etree.XML(source)
+ byte_input = BytesIO(source.encode("utf-8"))
+ root = etree.parse(byte_input).getroot()
nsmap = root.nsmap
# LXML doesn't accept empty (None) namespace prefix,
@@ -61,7 +53,7 @@ def xpath(source: str, xpath: str) -> str:
# root.xpath can return 4 types: float, string, bool and list.
# List is the only one that can't be simply converted to str
- if result is not list:
+ if type(result) is not list:
return str(result)
else:
result_string = ""
@@ -78,9 +70,13 @@ def xsd(source: str, xsd: str) -> bool:
:param xsd: XSD schema to validate XML against
:return: Message saying, if the validation was successful or not
"""
- xml_schema = etree.XMLSchema(etree.XML(xsd))
- xml = etree.XML(source)
+ schema_input = BytesIO(xsd.encode("utf-8"))
+ xml_schema = etree.XMLSchema(etree.parse(schema_input).getroot())
+
+ document_input = BytesIO(source.encode("utf-8"))
+ xml = etree.parse(document_input).getroot()
+
if xml_schema.validate(xml):
return "XML is valid."
else:
@@ -89,16 +85,17 @@ def xsd(source: str, xsd: str) -> bool:
def xslt(source: str, xslt: str) -> str:
"""
- Method used to transformate XML string using XSLT
+ Method used to transform XML string using XSLT
:param source: XML string to transform
- :param xslt: XSLT string used to transformate XML
+ :param xslt: XSLT string used to transform XML
:return: Result of transformation
"""
- xslt_transform = etree.XSLT(etree.XML(xslt))
+ xslt_input = BytesIO(xslt.encode("utf-8"))
+ xslt_transform = etree.XSLT(etree.parse(xslt_input))
- xml = etree.XML(source)
+ document_input = BytesIO(source.encode("utf-8"))
+ xml = etree.parse(document_input).getroot()
- transformated = xslt_transform(xml)
- print(transformated)
- return str(transformated)
\ No newline at end of file
+ transformed = str(xslt_transform(xml))
+ return formatXML(transformed, True)
\ No newline at end of file
diff --git a/Backend-libXML/main.py b/Backend-libXML/main.py
index 117b089..c0a962b 100644
--- a/Backend-libXML/main.py
+++ b/Backend-libXML/main.py
@@ -15,43 +15,6 @@ cors = CORS(app, resource={
}
})
-def format_xml(request: request, type: str) -> str:
- """Function to format XML
-
- :param request: Received request
- :param type: Type of needed processing: xsd, xslt or xpath
- :raises ValueError: is raised when type is different than those provided above
- :return: response JSON converted to string and response code
- """
- start = time.time_ns()
- code = 200
- response_json = dict()
- try:
- request_data = json.loads(request.get_data(as_text=True))
- data = request_data['data']
- process = request_data['process']
- if (type == "prettify"):
- response_json['result'] = Parser.xsd(data, process)
- elif (type == "minimize"):
- response_json['result'] = Parser.xslt(data, process)
- else:
- raise ValueError("Valid operation types are: prettify, minimize")
-
- response_json['status'] = "OK"
- except KeyError as e:
- response_json['result'] = "Missing key: " + str(e)
- response_json['status'] = "ERR"
- code = 400
- except Exception as e:
- response_json['result'] = str(e)
- response_json['status'] = "ERR"
- code = 400
- finally:
- exec_time = (time.time_ns() - start) / 10**6
- response_json['time'] = f"{exec_time:.03f}"
- response_json['processor'] = "libxml2 over lxml"
- return json.dumps(response_json), code
-
def process_xml(request: request, type: str) -> str:
"""Function to process
@@ -74,9 +37,9 @@ def process_xml(request: request, type: str) -> str:
elif (type == "xpath"):
response_json['result'] = Parser.xpath(data, process)
elif (type == "prettify"):
- response_json['result'] = Parser.prettify(data)
+ response_json['result'] = Parser.formatXML(data, True)
elif (type == "minimize"):
- response_json['result'] = Parser.minimize(data)
+ response_json['result'] = Parser.formatXML(data, False)
else:
raise ValueError("Valid operation types are: xsd, xslt, xpath")
diff --git a/Samples/minimize/minimize.curl b/Samples/minimize/minimize.curl
index f75d62a..3a74ae5 100644
--- a/Samples/minimize/minimize.curl
+++ b/Samples/minimize/minimize.curl
@@ -1,3 +1,3 @@
-url = "http://localhost:5000/minimizepost"
+url = "http://localhost:5000/minimize"
data = "@minimize.json"
request = POST
diff --git a/Samples/minimize/pretty b/Samples/minimize/pretty
deleted file mode 100644
index 7690e96..0000000
--- a/Samples/minimize/pretty
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
- Hamlet
- 2001-05-04
- 1
- false
-
-
- Macbeth
- 2000-12-13
- 1
- false
-
-
- Harry Potter and the Sorcerer's Stone
- 2005-04-29
- 2
- true
-
-
- The Long Walk
- 2018-07-01
- 4
- true
-
-
- Misery
- 2018-01-31
- 4
- true
-
-
- Think and Grow Rich
- 2004-09-10
- 6
- true
-
-
- The Law of Success
- 1982-05-09
- 6
- false
-
-
- Patriot Games
- 1995-10-21
- 5
- false
-
-
- The Sum of All Fears
- 1992-09-19
- 5
- false
-
-
- The Alchemist
- 2017-02-20
- 3
- false
-
-
- Hamlet
- 1994-06-01
- 1
- false
-
-
- Measure for Measure
- 1990-03-23
- 1
- false
-
-
- Hamlet
- 1989-05-05
- 1
- true
-
-
- Hamlet
- 1999-05-30
- 1
- true
-
-
- The Law of Success
- 2004-11-26
- 6
- true
-
-
- Romeo and Juliet
- 1997-02-08
- 1
- true
-
-
- The Alchemist
- 2009-08-21
- 3
- true
-
-
diff --git a/Samples/prettify/prettify.curl b/Samples/prettify/prettify.curl
index 643474d..a10aa88 100644
--- a/Samples/prettify/prettify.curl
+++ b/Samples/prettify/prettify.curl
@@ -1,3 +1,3 @@
-url = "http://localhost:5000/prettifypost"
+url = "http://localhost:5000/prettify"
data = "@prettify.json"
request = POST
diff --git a/Samples/xpath/data.json b/Samples/xpath/data.json
index 2de1632..6216754 100644
--- a/Samples/xpath/data.json
+++ b/Samples/xpath/data.json
@@ -1,5 +1,5 @@
{
- "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",
+ "data": "\nHamlet2001-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/Samples/xpath/dataNS.json b/Samples/xpath/dataNS.json
index ec5eb94..04cff85 100644
--- a/Samples/xpath/dataNS.json
+++ b/Samples/xpath/dataNS.json
@@ -1,5 +1,5 @@
{
- "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",
+ "data": "\nHamlet2001-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": "/b:books/b:book[b:name = 'The Law of Success']",
"processor": "saxon",
"version": "2.0"
diff --git a/Samples/xpath/non-ns.curl b/Samples/xpath/non-ns.curl
index b059ae6..b54c5b6 100644
--- a/Samples/xpath/non-ns.curl
+++ b/Samples/xpath/non-ns.curl
@@ -1,4 +1,4 @@
-#url = "localhost:8081/xpathpost"
-url = "localhost:5000/xpathpost"
+#url = "localhost:8081/xpath"
+url = "localhost:5000/xpath"
request = "POST"
data = "@data.json"
diff --git a/Samples/xpath/ns.curl b/Samples/xpath/ns.curl
index 90af030..46c6341 100644
--- a/Samples/xpath/ns.curl
+++ b/Samples/xpath/ns.curl
@@ -1,4 +1,4 @@
-#url = "localhost:8081/xpathpost"
-url = "localhost:5000/xpathpost"
+#url = "localhost:8081/xpath"
+url = "localhost:5000/xpath"
request = "POST"
data = "@dataNS.json"
diff --git a/Samples/xsd/xsd.curl b/Samples/xsd/xsd.curl
index ae731a5..922856c 100644
--- a/Samples/xsd/xsd.curl
+++ b/Samples/xsd/xsd.curl
@@ -1,4 +1,4 @@
-#url = "http://localhost:8082/xsdpost"
-url = "http://localhost:5000/xsdpost"
+#url = "http://localhost:8081/xsd"
+url = "http://localhost:5000/xsd"
data = "@xsd.json"
request = POST
diff --git a/Samples/xsd/xsd.json b/Samples/xsd/xsd.json
index 91dd2f2..cc367d0 100644
--- a/Samples/xsd/xsd.json
+++ b/Samples/xsd/xsd.json
@@ -1,6 +1,6 @@
{
- "data": "TestTest3",
- "process": " ",
+ "data": "\nTestTest3",
+ "process": "\n ",
"processor": "saxon",
"version": "1.0"
}
diff --git a/Samples/xslt/xslt.curl b/Samples/xslt/xslt.curl
index a7a6f94..712c82c 100644
--- a/Samples/xslt/xslt.curl
+++ b/Samples/xslt/xslt.curl
@@ -1,3 +1,4 @@
-url = "http://localhost:5000/xsltpost"
+#url = "http://localhost:8081/xslt"
+url = "http://localhost:5000/xslt"
data = "@xslt.json"
request = POST
diff --git a/Samples/xslt/xslt.json b/Samples/xslt/xslt.json
index f833a40..47013d7 100644
--- a/Samples/xslt/xslt.json
+++ b/Samples/xslt/xslt.json
@@ -1,6 +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": "",
+ "data": "City library3451237321AdamChoke5123LaurenWong6422Harry Potter75421234Macbeth51239556Romeo and Juliet",
+ "process": "",
"processor": "saxon",
"version": "1.0"
}