# HG changeset patch # User paulb # Date 1175990493 0 # Node ID 106f5ed40f44e7d1052b135e6fd2dd784ff3e86c # Parent 89397bce8506a8fe1a841fc803681a8f93996672 [project @ 2007-04-08 00:01:33 by paulb] Added an unfinished option for parsing in order to suppress well-formedness checks. Tidied up the parsing option parameters and their usage. diff -r 89397bce8506 -r 106f5ed40f44 libxml2dom/macrolib/macrolib.py --- a/libxml2dom/macrolib/macrolib.py Sun Apr 08 00:01:29 2007 +0000 +++ b/libxml2dom/macrolib/macrolib.py Sun Apr 08 00:01:33 2007 +0000 @@ -499,6 +499,15 @@ libxml2mod.xmlXPathFreeContext(context) return result +# Exceptions. + +class LSException(Exception): + + "DOM Level 3 Load/Save exception." + + PARSE_ERR = 81 + SERIALIZE_ERR = 82 + # Utility functions. def createDocument(namespaceURI, localName, doctype): @@ -512,14 +521,14 @@ libxml2mod.xmlCreateIntSubset(d, doctype.localName, doctype.publicId, doctype.systemId) return d -def parse(stream_or_string, html=0, htmlencoding=None): +def parse(stream_or_string, html=0, htmlencoding=None, unfinished=0): if hasattr(stream_or_string, "read"): stream = stream_or_string - return parseString(stream.read(), html, htmlencoding) + return parseString(stream.read(), html=html, htmlencoding=htmlencoding, unfinished=unfinished) else: - return parseFile(stream_or_string, html, htmlencoding) + return parseFile(stream_or_string, html=html, htmlencoding=htmlencoding, unfinished=unfinished) -def parseFile(s, html=0, htmlencoding=None): +def parseFile(s, html=0, htmlencoding=None, unfinished=0): # NOTE: Switching off validation and remote DTD resolution. if not html: context = libxml2mod.xmlCreateFileParserCtxt(s) @@ -527,11 +536,15 @@ libxml2mod.xmlParserSetValidate(context, 0) libxml2mod.xmlCtxtUseOptions(context, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET) libxml2mod.xmlParseDocument(context) - return libxml2mod.xmlParserGetDoc(context) + doc = libxml2mod.xmlParserGetDoc(context) + if unfinished or libxml2mod.xmlParserGetWellFormed(context): + return doc + else: + raise LSException(LSException.PARSE_ERR) else: return libxml2mod.htmlReadFile(s, htmlencoding, HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET) -def parseString(s, html=0, htmlencoding=None): +def parseString(s, html=0, htmlencoding=None, unfinished=0): # NOTE: Switching off validation and remote DTD resolution. if not html: context = libxml2mod.xmlCreateMemoryParserCtxt(s, len(s)) @@ -539,14 +552,18 @@ libxml2mod.xmlParserSetValidate(context, 0) libxml2mod.xmlCtxtUseOptions(context, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET) libxml2mod.xmlParseDocument(context) - return libxml2mod.xmlParserGetDoc(context) + doc = libxml2mod.xmlParserGetDoc(context) + if unfinished or libxml2mod.xmlParserGetWellFormed(context): + return doc + else: + raise LSException(LSException.PARSE_ERR) else: # NOTE: URL given as None. html_url = None return libxml2mod.htmlReadMemory(s, len(s), html_url, htmlencoding, HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET) -def parseURI(uri, html=0, htmlencoding=None): +def parseURI(uri, html=0, htmlencoding=None, unfinished=0): # NOTE: Switching off validation and remote DTD resolution. if not html: context = libxml2mod.xmlCreateURLParserCtxt(uri, 0) @@ -554,7 +571,11 @@ libxml2mod.xmlParserSetValidate(context, 0) libxml2mod.xmlCtxtUseOptions(context, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET) libxml2mod.xmlParseDocument(context) - return libxml2mod.xmlParserGetDoc(context) + doc = libxml2mod.xmlParserGetDoc(context) + if unfinished or libxml2mod.xmlParserGetWellFormed(context): + return doc + else: + raise LSException(LSException.PARSE_ERR) else: raise NotImplementedError, "parseURI does not yet support HTML"