summaryrefslogtreecommitdiff
path: root/grc/base/ParseXML.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/base/ParseXML.py')
-rw-r--r--grc/base/ParseXML.py33
1 files changed, 26 insertions, 7 deletions
diff --git a/grc/base/ParseXML.py b/grc/base/ParseXML.py
index 56097395dd..abb6576ac2 100644
--- a/grc/base/ParseXML.py
+++ b/grc/base/ParseXML.py
@@ -20,12 +20,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
from lxml import etree
from . import odict
+xml_failures = {}
+
+
class XMLSyntaxError(Exception):
def __init__(self, error_log):
self._error_log = error_log
+ xml_failures[error_log.last_error.filename] = error_log
+
def __str__(self):
return '\n'.join(map(str, self._error_log.filter_from_errors()))
+
def validate_dtd(xml_file, dtd_file=None):
"""
Validate an xml file against its dtd.
@@ -36,13 +42,23 @@ def validate_dtd(xml_file, dtd_file=None):
@throws Exception validation fails
"""
#perform parsing, use dtd validation if dtd file is not specified
- parser = etree.XMLParser(dtd_validation=not dtd_file)
- xml = etree.parse(xml_file, parser=parser)
- if parser.error_log: raise XMLSyntaxError(parser.error_log)
- #perform dtd validation if the dtd file is specified
- if not dtd_file: return
- dtd = etree.DTD(dtd_file)
- if not dtd.validate(xml.getroot()): raise XMLSyntaxError(dtd.error_log)
+ try:
+ parser = etree.XMLParser(dtd_validation=not dtd_file)
+ xml = etree.parse(xml_file, parser=parser)
+ except etree.LxmlError:
+ pass
+ if parser.error_log:
+ raise XMLSyntaxError(parser.error_log)
+
+ # perform dtd validation if the dtd file is specified
+ if not dtd_file:
+ return
+ try:
+ dtd = etree.DTD(dtd_file)
+ if not dtd.validate(xml.getroot()):
+ raise XMLSyntaxError(dtd.error_log)
+ except etree.LxmlError:
+ raise XMLSyntaxError(dtd.error_log)
def from_file(xml_file):
"""
@@ -57,6 +73,7 @@ def from_file(xml_file):
xml = etree.parse(xml_file).getroot()
return _from_file(xml)
+
def _from_file(xml):
"""
Recursivly parse the xml tree into nested data format.
@@ -81,6 +98,7 @@ def _from_file(xml):
return odict({tag: nested_data})
+
def to_file(nested_data, xml_file):
"""
Write an xml file and use the to xml helper method to load it.
@@ -92,6 +110,7 @@ def to_file(nested_data, xml_file):
xml = _to_file(nested_data)[0]
open(xml_file, 'w').write(etree.tostring(xml, xml_declaration=True, pretty_print=True))
+
def _to_file(nested_data):
"""
Recursivly parse the nested data into xml tree format.