From scoder at codespeak.net Thu Jun 1 12:12:19 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 12:12:19 +0200 (CEST) Subject: [Lxml-checkins] r28043 - lxml/trunk/src/lxml Message-ID: <20060601101219.928861006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 12:12:17 2006 New Revision: 28043 Modified: lxml/trunk/src/lxml/parser.pxi Log: fixed memory leak in setup code Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Thu Jun 1 12:12:17 2006 @@ -76,6 +76,7 @@ on iconv and the local Python installation, so we simply check if we find a matching encoding handler. """ + cdef tree.xmlCharEncodingHandler* enchandler cdef Py_ssize_t l cdef char* buffer cdef char* enc @@ -83,8 +84,10 @@ l = python.PyUnicode_GET_DATA_SIZE(utext) buffer = python.PyUnicode_AS_DATA(utext) enc = _findEncodingName(buffer, l) - if tree.xmlFindCharEncodingHandler(enc) is not NULL: + enchandler = tree.xmlFindCharEncodingHandler(enc) + if enchandler is not NULL: global _UNICODE_ENCODING + tree.xmlCharEncCloseFunc(enchandler) _UNICODE_ENCODING = enc cdef char* _findEncodingName(char* buffer, int size): @@ -123,7 +126,7 @@ self._c_url = NULL else: self._c_url = _cstr(url) - self._bytes_utf = '' + self._bytes_utf = '' self._bytes_read = 0 cdef xmlparser.xmlParserInput* _createParserInput(self, xmlParserCtxt* ctxt): From scoder at codespeak.net Thu Jun 1 12:51:18 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 12:51:18 +0200 (CEST) Subject: [Lxml-checkins] r28044 - lxml/trunk/src/lxml Message-ID: <20060601105118.4797C1006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 12:51:16 2006 New Revision: 28044 Modified: lxml/trunk/src/lxml/serializer.pxi Log: small cleanup Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Thu Jun 1 12:51:16 2006 @@ -118,13 +118,13 @@ raise IOError, "Could not create I/O writer context." return c_buffer - cdef int write(self, char* c_buffer, int len): + cdef int write(self, char* c_buffer, int size): try: if self._filelike is None: raise IOError, "File is already closed" - py_buffer = python.PyString_FromStringAndSize(c_buffer, len) + py_buffer = python.PyString_FromStringAndSize(c_buffer, size) self._filelike.write(py_buffer) - return len + return size except Exception: self._exc_context._store_raised() return -1 From scoder at codespeak.net Thu Jun 1 15:48:28 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 15:48:28 +0200 (CEST) Subject: [Lxml-checkins] r28046 - lxml/trunk Message-ID: <20060601134828.5EDFE1006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 15:48:25 2006 New Revision: 28046 Modified: lxml/trunk/CHANGES.txt Log: mark setup leak fixed Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 1 15:48:25 2006 @@ -31,6 +31,8 @@ Bugs fixed ---------- +* Memory leak in unicode related setup code + * Element now raises ValueError on empty tag names * Namespace fixing after moving elements between documents could fail if the From scoder at codespeak.net Thu Jun 1 15:50:35 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 15:50:35 +0200 (CEST) Subject: [Lxml-checkins] r28047 - lxml/trunk/src/lxml Message-ID: <20060601135035.0542C1006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 15:50:34 2006 New Revision: 28047 Modified: lxml/trunk/src/lxml/etree.pyx Log: show failed index when raising IndexError Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 1 15:50:34 2006 @@ -564,7 +564,7 @@ cdef xmlNode* c_next c_node = _findChild(self._c_node, index) if c_node is NULL: - raise IndexError + raise IndexError, index c_next = element._c_node.next _removeText(c_node.next) tree.xmlReplaceNode(c_node, element._c_node) @@ -575,7 +575,7 @@ cdef xmlNode* c_node c_node = _findChild(self._c_node, index) if c_node is NULL: - raise IndexError + raise IndexError, index _removeText(c_node.next) _removeNode(c_node) From scoder at codespeak.net Thu Jun 1 16:12:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 16:12:56 +0200 (CEST) Subject: [Lxml-checkins] r28048 - in lxml/trunk: . src/lxml Message-ID: <20060601141256.161911006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 16:12:53 2006 New Revision: 28048 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/extensions.pxi Log: fixed memory leak in XPath extension functions Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 1 16:12:53 2006 @@ -31,6 +31,8 @@ Bugs fixed ---------- +* Memory leak in XPath extension functions + * Memory leak in unicode related setup code * Element now raises ValueError on empty tag names Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Thu Jun 1 16:12:53 2006 @@ -337,7 +337,9 @@ try: args = [] for i from 0 <= i < nargs: - o = _unwrapXPathObject(xpath.valuePop(ctxt), doc) + obj = xpath.valuePop(ctxt) + o = _unwrapXPathObject(obj, doc) + _freeXPathObject(obj) python.PyList_Append(args, o) python.PyList_Reverse(args) From scoder at codespeak.net Thu Jun 1 16:33:46 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 16:33:46 +0200 (CEST) Subject: [Lxml-checkins] r28049 - in lxml/trunk: . src/lxml Message-ID: <20060601143346.A41401006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 16:33:43 2006 New Revision: 28049 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/apihelpers.pxi Log: fixed memory leak in _Attrib.items() Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 1 16:33:43 2006 @@ -31,6 +31,8 @@ Bugs fixed ---------- +* Memory leak in Element.attrib.items() and Element.attrib.values() + * Memory leak in XPath extension functions * Memory leak in unicode related setup code Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Thu Jun 1 16:33:43 2006 @@ -87,7 +87,9 @@ else: value = tree.xmlGetNsProp(c_element, c_attrib_node.name, c_attrib_node.ns.href) - return funicode(value) + result = funicode(value) + tree.xmlFree(value) + return result cdef object _getAttributeValue(_NodeBase element, key, default): cdef char* c_result From scoder at codespeak.net Thu Jun 1 17:43:14 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 17:43:14 +0200 (CEST) Subject: [Lxml-checkins] r28051 - lxml/trunk/src/lxml/tests Message-ID: <20060601154314.6236A1006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 17:43:12 2006 New Revision: 28051 Modified: lxml/trunk/src/lxml/tests/test_elementtree.py Log: new test case that triggers a memory leak Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Thu Jun 1 17:43:12 2006 @@ -799,7 +799,17 @@ a) self.assertXML('', c) - + + def test_setitem_replace(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + SubElement(a, 'b') + d = Element('d') + a[0] = d + self.assertXML('', a) + def test_setitem_indexerror(self): Element = self.etree.Element SubElement = self.etree.SubElement From scoder at codespeak.net Thu Jun 1 17:57:54 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 17:57:54 +0200 (CEST) Subject: [Lxml-checkins] r28052 - in lxml/trunk: . src/lxml Message-ID: <20060601155754.7F6A01006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 17:57:52 2006 New Revision: 28052 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.pyx Log: fixed memory leak in Element.__setitem__ Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 1 17:57:52 2006 @@ -31,6 +31,8 @@ Bugs fixed ---------- +* Memory leak in Element.__setitem__ + * Memory leak in Element.attrib.items() and Element.attrib.values() * Memory leak in XPath extension functions Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 1 17:57:52 2006 @@ -570,7 +570,8 @@ tree.xmlReplaceNode(c_node, element._c_node) _moveTail(c_next, element._c_node) moveNodeToDocument(element, self._doc) - + attemptDeallocation(c_node) + def __delitem__(self, Py_ssize_t index): cdef xmlNode* c_node c_node = _findChild(self._c_node, index) From faassen at codespeak.net Thu Jun 1 19:37:20 2006 From: faassen at codespeak.net (faassen at codespeak.net) Date: Thu, 1 Jun 2006 19:37:20 +0200 (CEST) Subject: [Lxml-checkins] r28053 - lxml/www Message-ID: <20060601173720.99C041006D@code0.codespeak.net> Author: faassen Date: Thu Jun 1 19:37:19 2006 New Revision: 28053 Modified: lxml/www/publish.py Log: Include FAQ.txt too. Modified: lxml/www/publish.py ============================================================================== --- lxml/www/publish.py (original) +++ lxml/www/publish.py Thu Jun 1 19:37:19 2006 @@ -9,7 +9,7 @@ for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', - 'build.txt', 'performance.txt', 'resolvers.txt']: + 'build.txt', 'FAQ.txt', 'performance.txt', 'resolvers.txt']: path = os.path.join(lxml_path, 'doc', name) outname = os.path.splitext(name)[0] + '.html' outpath = os.path.join(dirname, outname) From faassen at codespeak.net Thu Jun 1 19:39:46 2006 From: faassen at codespeak.net (faassen at codespeak.net) Date: Thu, 1 Jun 2006 19:39:46 +0200 (CEST) Subject: [Lxml-checkins] r28054 - in lxml/trunk: . doc Message-ID: <20060601173946.036181006D@code0.codespeak.net> Author: faassen Date: Thu Jun 1 19:39:46 2006 New Revision: 28054 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/main.txt lxml/trunk/doc/performance.txt Log: Update some text. Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 1 19:39:46 2006 @@ -28,6 +28,9 @@ * Comment texts can be changed through the API +* See also the features added for lxml 1.0beta (below) to find out + more about what's new. + Bugs fixed ---------- Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Thu Jun 1 19:39:46 2006 @@ -27,6 +27,8 @@ .. _`installation instructions`: installation.html +* `lxml 1.0`_, released 2006-06-01 (`changes for 1.0`_) + * `lxml 0.9.2`_, released 2006-05-10 (`changes for 0.9.2`_) * `lxml 0.9.1`_, released 2006-03-30 (`changes for 0.9.1`_) @@ -43,6 +45,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 1.0`: lxml-1.0.tgz .. _`lxml 0.9.2`: lxml-0.9.2.tgz .. _`lxml 0.9.1`: lxml-0.9.1.tgz .. _`lxml 0.9`: lxml-0.9.tgz @@ -52,6 +55,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`CHANGES for 1.0`: changes-1.0.html .. _`CHANGES for 0.9.2`: changes-0.9.2.html .. _`CHANGES for 0.9.1`: changes-0.9.1.html .. _`CHANGES for 0.9`: changes-0.9.html Modified: lxml/trunk/doc/performance.txt ============================================================================== --- lxml/trunk/doc/performance.txt (original) +++ lxml/trunk/doc/performance.txt Thu Jun 1 19:39:46 2006 @@ -1,10 +1,14 @@ Benchmarks and speed ==================== -As an XML library, lxml.etree is very fast. It is also slow. It depends on -what you do with it. This text describes where lxml.etree (lxe) excels, gives -hints on some performance traps and compares the overall performance to the -original ElementTree_ (ET) and cElementTree_ (cET) libraries by Fredrik Lundh. +As an XML library, lxml.etree is very fast. It is also slow. As with +all software, it depends on what you do with it. Rest assured that +lxml is fast enough for most applications, so lxml is probably fast +enough for yours. + +This text describes where lxml.etree (lxe) excels, gives hints on some +performance traps and compares the overall performance to the original +ElementTree_ (ET) and cElementTree_ (cET) libraries by Fredrik Lundh. The cElementTree library is a fast C-implementation of the original ElementTree. From faassen at codespeak.net Thu Jun 1 19:44:44 2006 From: faassen at codespeak.net (faassen at codespeak.net) Date: Thu, 1 Jun 2006 19:44:44 +0200 (CEST) Subject: [Lxml-checkins] r28055 - lxml/trunk/src/lxml Message-ID: <20060601174444.AE70B1006D@code0.codespeak.net> Author: faassen Date: Thu Jun 1 19:44:43 2006 New Revision: 28055 Modified: lxml/trunk/src/lxml/ (props changed) Log: Ignore lxml-version.h in SVN. From scoder at codespeak.net Thu Jun 1 19:47:34 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 19:47:34 +0200 (CEST) Subject: [Lxml-checkins] r28057 - lxml/trunk Message-ID: <20060601174734.F20DE1006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 19:47:33 2006 New Revision: 28057 Modified: lxml/trunk/CHANGES.txt Log: moved reference to beta version to top of CHANGES.txt Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 1 19:47:33 2006 @@ -7,6 +7,9 @@ Features added -------------- +See also the features added for lxml 1.0beta (below) to find out more about +what's new. + * Element.getiterator() and the findall() methods support finding arbitrary elements from a namespace (pattern ``{namespace}*``) @@ -28,9 +31,6 @@ * Comment texts can be changed through the API -* See also the features added for lxml 1.0beta (below) to find out - more about what's new. - Bugs fixed ---------- From scoder at codespeak.net Thu Jun 1 19:51:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 1 Jun 2006 19:51:41 +0200 (CEST) Subject: [Lxml-checkins] r28058 - lxml/trunk/src/lxml Message-ID: <20060601175141.626BA1006D@code0.codespeak.net> Author: scoder Date: Thu Jun 1 19:51:39 2006 New Revision: 28058 Modified: lxml/trunk/src/lxml/xmlerror.pxd Log: added entries to declaration xmlError C structure Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Thu Jun 1 19:51:39 2006 @@ -12,6 +12,9 @@ char* message xmlErrorLevel level char* file + char* str1 + char* str2 + char* str3 int line ctypedef void (*xmlGenericErrorFunc)(void* ctxt, char* msg, ...) From scoder at codespeak.net Fri Jun 2 12:01:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 12:01:10 +0200 (CEST) Subject: [Lxml-checkins] r28081 - in lxml/trunk: . src/lxml Message-ID: <20060602100110.B4BDE10070@code0.codespeak.net> Author: scoder Date: Fri Jun 2 12:01:01 2006 New Revision: 28081 Added: lxml/trunk/update-error-constants.py Modified: lxml/trunk/src/lxml/xmlerror.pxd lxml/trunk/src/lxml/xmlerror.pxi Log: support regenerating constants in xmlerror.px? automatically with a script, split long strings to support MSVC Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Fri Jun 2 12:01:01 2006 @@ -1,11 +1,771 @@ +# --- BEGIN: GENERATED CONSTANTS --- cdef extern from "libxml/xmlerror.h": ctypedef enum xmlErrorLevel: - XML_ERR_NONE = 0 - XML_ERR_WARNING = 1 # A simple warning - XML_ERR_ERROR = 2 # A recoverable error - XML_ERR_FATAL = 3 # A fatal error + XML_ERR_NONE = 0 + XML_ERR_WARNING = 1 # A simple warning + XML_ERR_ERROR = 2 # A recoverable error + XML_ERR_FATAL = 3 # A fatal error + ctypedef enum xmlErrorDomain: + XML_FROM_NONE = 0 + XML_FROM_PARSER = 1 # The XML parser + XML_FROM_TREE = 2 # The tree module + XML_FROM_NAMESPACE = 3 # The XML Namespace module + XML_FROM_DTD = 4 # The XML DTD validation with parser contex + XML_FROM_HTML = 5 # The HTML parser + XML_FROM_MEMORY = 6 # The memory allocator + XML_FROM_OUTPUT = 7 # The serialization code + XML_FROM_IO = 8 # The Input/Output stack + XML_FROM_FTP = 9 # The FTP module + XML_FROM_HTTP = 10 # The HTTP module + XML_FROM_XINCLUDE = 11 # The XInclude processing + XML_FROM_XPATH = 12 # The XPath module + XML_FROM_XPOINTER = 13 # The XPointer module + XML_FROM_REGEXP = 14 # The regular expressions module + XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module + XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module + XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module + XML_FROM_RELAXNGP = 18 # The Relax-NG parser module + XML_FROM_RELAXNGV = 19 # The Relax-NG validator module + XML_FROM_CATALOG = 20 # The Catalog module + XML_FROM_C14N = 21 # The Canonicalization module + XML_FROM_XSLT = 22 # The XSLT engine from libxslt + XML_FROM_VALID = 23 # The XML DTD validation with valid context + XML_FROM_CHECK = 24 # The error checking module + XML_FROM_WRITER = 25 # The xmlwriter module + XML_FROM_MODULE = 26 # The dynamically loaded module modul + XML_FROM_I18N = 27 # The module handling character conversion + + ctypedef enum xmlParserErrors: + XML_ERR_OK = 0 + XML_ERR_INTERNAL_ERROR = 1 # 1 + XML_ERR_NO_MEMORY = 2 # 2 + XML_ERR_DOCUMENT_START = 3 # 3 + XML_ERR_DOCUMENT_EMPTY = 4 # 4 + XML_ERR_DOCUMENT_END = 5 # 5 + XML_ERR_INVALID_HEX_CHARREF = 6 # 6 + XML_ERR_INVALID_DEC_CHARREF = 7 # 7 + XML_ERR_INVALID_CHARREF = 8 # 8 + XML_ERR_INVALID_CHAR = 9 # 9 + XML_ERR_CHARREF_AT_EOF = 10 # 10 + XML_ERR_CHARREF_IN_PROLOG = 11 # 11 + XML_ERR_CHARREF_IN_EPILOG = 12 # 12 + XML_ERR_CHARREF_IN_DTD = 13 # 13 + XML_ERR_ENTITYREF_AT_EOF = 14 # 14 + XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 + XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 + XML_ERR_ENTITYREF_IN_DTD = 17 # 17 + XML_ERR_PEREF_AT_EOF = 18 # 18 + XML_ERR_PEREF_IN_PROLOG = 19 # 19 + XML_ERR_PEREF_IN_EPILOG = 20 # 20 + XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 + XML_ERR_ENTITYREF_NO_NAME = 22 # 22 + XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 + XML_ERR_PEREF_NO_NAME = 24 # 24 + XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 + XML_ERR_UNDECLARED_ENTITY = 26 # 26 + XML_WAR_UNDECLARED_ENTITY = 27 # 27 + XML_ERR_UNPARSED_ENTITY = 28 # 28 + XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 + XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 + XML_ERR_UNKNOWN_ENCODING = 31 # 31 + XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 + XML_ERR_STRING_NOT_STARTED = 33 # 33 + XML_ERR_STRING_NOT_CLOSED = 34 # 34 + XML_ERR_NS_DECL_ERROR = 35 # 35 + XML_ERR_ENTITY_NOT_STARTED = 36 # 36 + XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 + XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 + XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 + XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 + XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 + XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 + XML_ERR_LITERAL_NOT_STARTED = 43 # 43 + XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 + XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 + XML_ERR_PI_NOT_STARTED = 46 # 46 + XML_ERR_PI_NOT_FINISHED = 47 # 47 + XML_ERR_NOTATION_NOT_STARTED = 48 # 48 + XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 + XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 + XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 + XML_ERR_MIXED_NOT_STARTED = 52 # 52 + XML_ERR_MIXED_NOT_FINISHED = 53 # 53 + XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 + XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 + XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 + XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 + XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 + XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 + XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 + XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 + XML_ERR_MISPLACED_CDATA_END = 62 # 62 + XML_ERR_CDATA_NOT_FINISHED = 63 # 63 + XML_ERR_RESERVED_XML_NAME = 64 # 64 + XML_ERR_SPACE_REQUIRED = 65 # 65 + XML_ERR_SEPARATOR_REQUIRED = 66 # 66 + XML_ERR_NMTOKEN_REQUIRED = 67 # 67 + XML_ERR_NAME_REQUIRED = 68 # 68 + XML_ERR_PCDATA_REQUIRED = 69 # 69 + XML_ERR_URI_REQUIRED = 70 # 70 + XML_ERR_PUBID_REQUIRED = 71 # 71 + XML_ERR_LT_REQUIRED = 72 # 72 + XML_ERR_GT_REQUIRED = 73 # 73 + XML_ERR_LTSLASH_REQUIRED = 74 # 74 + XML_ERR_EQUAL_REQUIRED = 75 # 75 + XML_ERR_TAG_NAME_MISMATCH = 76 # 76 + XML_ERR_TAG_NOT_FINISHED = 77 # 77 + XML_ERR_STANDALONE_VALUE = 78 # 78 + XML_ERR_ENCODING_NAME = 79 # 79 + XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 + XML_ERR_INVALID_ENCODING = 81 # 81 + XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 + XML_ERR_CONDSEC_INVALID = 83 # 83 + XML_ERR_VALUE_REQUIRED = 84 # 84 + XML_ERR_NOT_WELL_BALANCED = 85 # 85 + XML_ERR_EXTRA_CONTENT = 86 # 86 + XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 + XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 + XML_ERR_ENTITY_LOOP = 89 # 89 + XML_ERR_ENTITY_BOUNDARY = 90 # 90 + XML_ERR_INVALID_URI = 91 # 91 + XML_ERR_URI_FRAGMENT = 92 # 92 + XML_WAR_CATALOG_PI = 93 # 93 + XML_ERR_NO_DTD = 94 # 94 + XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 + XML_ERR_VERSION_MISSING = 96 # 96 + XML_WAR_UNKNOWN_VERSION = 97 # 97 + XML_WAR_LANG_VALUE = 98 # 98 + XML_WAR_NS_URI = 99 # 99 + XML_WAR_NS_URI_RELATIVE = 100 # 100 + XML_ERR_MISSING_ENCODING = 101 # 101 + XML_WAR_SPACE_VALUE = 102 # 102 + XML_ERR_NOT_STANDALONE = 103 # 103 + XML_ERR_ENTITY_PROCESSING = 104 # 104 + XML_ERR_NOTATION_PROCESSING = 105 # 105 + XML_WAR_NS_COLUMN = 106 # 106 + XML_WAR_ENTITY_REDEFINED = 107 # 107 + XML_NS_ERR_XML_NAMESPACE = 200 + XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 + XML_NS_ERR_QNAME = 202 # 202 + XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 + XML_NS_ERR_EMPTY = 204 # 204 + XML_DTD_ATTRIBUTE_DEFAULT = 500 + XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 + XML_DTD_ATTRIBUTE_VALUE = 502 # 502 + XML_DTD_CONTENT_ERROR = 503 # 503 + XML_DTD_CONTENT_MODEL = 504 # 504 + XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 + XML_DTD_DIFFERENT_PREFIX = 506 # 506 + XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 + XML_DTD_ELEM_NAMESPACE = 508 # 508 + XML_DTD_ELEM_REDEFINED = 509 # 509 + XML_DTD_EMPTY_NOTATION = 510 # 510 + XML_DTD_ENTITY_TYPE = 511 # 511 + XML_DTD_ID_FIXED = 512 # 512 + XML_DTD_ID_REDEFINED = 513 # 513 + XML_DTD_ID_SUBSET = 514 # 514 + XML_DTD_INVALID_CHILD = 515 # 515 + XML_DTD_INVALID_DEFAULT = 516 # 516 + XML_DTD_LOAD_ERROR = 517 # 517 + XML_DTD_MISSING_ATTRIBUTE = 518 # 518 + XML_DTD_MIXED_CORRUPT = 519 # 519 + XML_DTD_MULTIPLE_ID = 520 # 520 + XML_DTD_NO_DOC = 521 # 521 + XML_DTD_NO_DTD = 522 # 522 + XML_DTD_NO_ELEM_NAME = 523 # 523 + XML_DTD_NO_PREFIX = 524 # 524 + XML_DTD_NO_ROOT = 525 # 525 + XML_DTD_NOTATION_REDEFINED = 526 # 526 + XML_DTD_NOTATION_VALUE = 527 # 527 + XML_DTD_NOT_EMPTY = 528 # 528 + XML_DTD_NOT_PCDATA = 529 # 529 + XML_DTD_NOT_STANDALONE = 530 # 530 + XML_DTD_ROOT_NAME = 531 # 531 + XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 + XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 + XML_DTD_UNKNOWN_ELEM = 534 # 534 + XML_DTD_UNKNOWN_ENTITY = 535 # 535 + XML_DTD_UNKNOWN_ID = 536 # 536 + XML_DTD_UNKNOWN_NOTATION = 537 # 537 + XML_DTD_STANDALONE_DEFAULTED = 538 # 538 + XML_DTD_XMLID_VALUE = 539 # 539 + XML_DTD_XMLID_TYPE = 540 # 540 + XML_HTML_STRUCURE_ERROR = 800 + XML_HTML_UNKNOWN_TAG = 801 # 801 + XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 + XML_RNGP_ATTR_CONFLICT = 1001 # 1001 + XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 + XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 + XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 + XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 + XML_RNGP_CHOICE_CONTENT = 1006 # 1006 + XML_RNGP_CHOICE_EMPTY = 1007 # 1007 + XML_RNGP_CREATE_FAILURE = 1008 # 1008 + XML_RNGP_DATA_CONTENT = 1009 # 1009 + XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 + XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 + XML_RNGP_DEFINE_EMPTY = 1012 # 1012 + XML_RNGP_DEFINE_MISSING = 1013 # 1013 + XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 + XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 + XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 + XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 + XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 + XML_RNGP_ELEMENT_NAME = 1019 # 1019 + XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 + XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 + XML_RNGP_EMPTY = 1022 # 1022 + XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 + XML_RNGP_EMPTY_CONTENT = 1024 # 1024 + XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 + XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 + XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 + XML_RNGP_EXCEPT_MISSING = 1028 # 1028 + XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 + XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 + XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 + XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 + XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 + XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 + XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 + XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 + XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 + XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 + XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 + XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 + XML_RNGP_HREF_ERROR = 1041 # 1041 + XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 + XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 + XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 + XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 + XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 + XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 + XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 + XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 + XML_RNGP_INVALID_URI = 1050 # 1050 + XML_RNGP_INVALID_VALUE = 1051 # 1051 + XML_RNGP_MISSING_HREF = 1052 # 1052 + XML_RNGP_NAME_MISSING = 1053 # 1053 + XML_RNGP_NEED_COMBINE = 1054 # 1054 + XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 + XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 + XML_RNGP_NSNAME_NO_NS = 1057 # 1057 + XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 + XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 + XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 + XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 + XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 + XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 + XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 + XML_RNGP_PARSE_ERROR = 1065 # 1065 + XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 + XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 + XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 + XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 + XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 + XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 + XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 + XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 + XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 + XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 + XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 + XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 + XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 + XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 + XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 + XML_RNGP_PAT_LIST_LIST = 1081 # 1081 + XML_RNGP_PAT_LIST_REF = 1082 # 1082 + XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 + XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 + XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 + XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 + XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 + XML_RNGP_PAT_START_ATTR = 1088 # 1088 + XML_RNGP_PAT_START_DATA = 1089 # 1089 + XML_RNGP_PAT_START_EMPTY = 1090 # 1090 + XML_RNGP_PAT_START_GROUP = 1091 # 1091 + XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 + XML_RNGP_PAT_START_LIST = 1093 # 1093 + XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 + XML_RNGP_PAT_START_TEXT = 1095 # 1095 + XML_RNGP_PAT_START_VALUE = 1096 # 1096 + XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 + XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 + XML_RNGP_REF_CYCLE = 1099 # 1099 + XML_RNGP_REF_NAME_INVALID = 1100 # 1100 + XML_RNGP_REF_NO_DEF = 1101 # 1101 + XML_RNGP_REF_NO_NAME = 1102 # 1102 + XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 + XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 + XML_RNGP_START_CONTENT = 1105 # 1105 + XML_RNGP_START_EMPTY = 1106 # 1106 + XML_RNGP_START_MISSING = 1107 # 1107 + XML_RNGP_TEXT_EXPECTED = 1108 # 1108 + XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 + XML_RNGP_TYPE_MISSING = 1110 # 1110 + XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 + XML_RNGP_TYPE_VALUE = 1112 # 1112 + XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 + XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 + XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 + XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 + XML_RNGP_URI_FRAGMENT = 1117 # 1117 + XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 + XML_RNGP_VALUE_EMPTY = 1119 # 1119 + XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 + XML_RNGP_XMLNS_NAME = 1121 # 1121 + XML_RNGP_XML_NS = 1122 # 1122 + XML_XPATH_EXPRESSION_OK = 1200 + XML_XPATH_NUMBER_ERROR = 1201 # 1201 + XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 + XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 + XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 + XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 + XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 + XML_XPATH_EXPR_ERROR = 1207 # 1207 + XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 + XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 + XML_XPATH_INVALID_OPERAND = 1210 # 1210 + XML_XPATH_INVALID_TYPE = 1211 # 1211 + XML_XPATH_INVALID_ARITY = 1212 # 1212 + XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 + XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 + XML_XPATH_MEMORY_ERROR = 1215 # 1215 + XML_XPTR_SYNTAX_ERROR = 1216 # 1216 + XML_XPTR_RESOURCE_ERROR = 1217 # 1217 + XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 + XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 + XML_XPATH_ENCODING_ERROR = 1220 # 1220 + XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 + XML_TREE_INVALID_HEX = 1300 + XML_TREE_INVALID_DEC = 1301 # 1301 + XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 + XML_SAVE_NOT_UTF8 = 1400 + XML_SAVE_CHAR_INVALID = 1401 # 1401 + XML_SAVE_NO_DOCTYPE = 1402 # 1402 + XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 + XML_REGEXP_COMPILE_ERROR = 1450 + XML_IO_UNKNOWN = 1500 + XML_IO_EACCES = 1501 # 1501 + XML_IO_EAGAIN = 1502 # 1502 + XML_IO_EBADF = 1503 # 1503 + XML_IO_EBADMSG = 1504 # 1504 + XML_IO_EBUSY = 1505 # 1505 + XML_IO_ECANCELED = 1506 # 1506 + XML_IO_ECHILD = 1507 # 1507 + XML_IO_EDEADLK = 1508 # 1508 + XML_IO_EDOM = 1509 # 1509 + XML_IO_EEXIST = 1510 # 1510 + XML_IO_EFAULT = 1511 # 1511 + XML_IO_EFBIG = 1512 # 1512 + XML_IO_EINPROGRESS = 1513 # 1513 + XML_IO_EINTR = 1514 # 1514 + XML_IO_EINVAL = 1515 # 1515 + XML_IO_EIO = 1516 # 1516 + XML_IO_EISDIR = 1517 # 1517 + XML_IO_EMFILE = 1518 # 1518 + XML_IO_EMLINK = 1519 # 1519 + XML_IO_EMSGSIZE = 1520 # 1520 + XML_IO_ENAMETOOLONG = 1521 # 1521 + XML_IO_ENFILE = 1522 # 1522 + XML_IO_ENODEV = 1523 # 1523 + XML_IO_ENOENT = 1524 # 1524 + XML_IO_ENOEXEC = 1525 # 1525 + XML_IO_ENOLCK = 1526 # 1526 + XML_IO_ENOMEM = 1527 # 1527 + XML_IO_ENOSPC = 1528 # 1528 + XML_IO_ENOSYS = 1529 # 1529 + XML_IO_ENOTDIR = 1530 # 1530 + XML_IO_ENOTEMPTY = 1531 # 1531 + XML_IO_ENOTSUP = 1532 # 1532 + XML_IO_ENOTTY = 1533 # 1533 + XML_IO_ENXIO = 1534 # 1534 + XML_IO_EPERM = 1535 # 1535 + XML_IO_EPIPE = 1536 # 1536 + XML_IO_ERANGE = 1537 # 1537 + XML_IO_EROFS = 1538 # 1538 + XML_IO_ESPIPE = 1539 # 1539 + XML_IO_ESRCH = 1540 # 1540 + XML_IO_ETIMEDOUT = 1541 # 1541 + XML_IO_EXDEV = 1542 # 1542 + XML_IO_NETWORK_ATTEMPT = 1543 # 1543 + XML_IO_ENCODER = 1544 # 1544 + XML_IO_FLUSH = 1545 # 1545 + XML_IO_WRITE = 1546 # 1546 + XML_IO_NO_INPUT = 1547 # 1547 + XML_IO_BUFFER_FULL = 1548 # 1548 + XML_IO_LOAD_ERROR = 1549 # 1549 + XML_IO_ENOTSOCK = 1550 # 1550 + XML_IO_EISCONN = 1551 # 1551 + XML_IO_ECONNREFUSED = 1552 # 1552 + XML_IO_ENETUNREACH = 1553 # 1553 + XML_IO_EADDRINUSE = 1554 # 1554 + XML_IO_EALREADY = 1555 # 1555 + XML_IO_EAFNOSUPPORT = 1556 # 1556 + XML_XINCLUDE_RECURSION = 1600 + XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 + XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 + XML_XINCLUDE_NO_HREF = 1603 # 1603 + XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 + XML_XINCLUDE_HREF_URI = 1605 # 1605 + XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 + XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 + XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 + XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 + XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 + XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 + XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 + XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 + XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 + XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 + XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 + XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 + XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 + XML_CATALOG_MISSING_ATTR = 1650 + XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 + XML_CATALOG_PREFER_VALUE = 1652 # 1652 + XML_CATALOG_NOT_CATALOG = 1653 # 1653 + XML_CATALOG_RECURSION = 1654 # 1654 + XML_SCHEMAP_PREFIX_UNDEFINED = 1700 + XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 + XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 + XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 + XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 + XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 + XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 + XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 + XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 + XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 + XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 + XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 + XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 + XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 + XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 + XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 + XML_SCHEMAP_INVALID_FACET = 1716 # 1716 + XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 + XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 + XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 + XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 + XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 + XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 + XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 + XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 + XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 + XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 + XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 + XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 + XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 + XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 + XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 + XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 + XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 + XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 + XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 + XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 + XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 + XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 + XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 + XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 + XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 + XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 + XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 + XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 + XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 + XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 + XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 + XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 + XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 + XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 + XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 + XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 + XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 + XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 + XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 + XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 + XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 + XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 + XML_SCHEMAP_NOROOT = 1759 # 1759 + XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 + XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 + XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 + XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 + XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 + XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 + XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 + XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 + XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 + XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 + XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 + XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 + XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 + XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 + XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 + XML_SCHEMAP_RECURSIVE = 1775 # 1775 + XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 + XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 + XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 + XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 + XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 + XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 + XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 + XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 + XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 + XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 + XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 + XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 + XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 + XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 + XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 + XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 + XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 + XML_SCHEMAV_NOROOT = 1801 + XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 + XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 + XML_SCHEMAV_MISSING = 1804 # 1804 + XML_SCHEMAV_WRONGELEM = 1805 # 1805 + XML_SCHEMAV_NOTYPE = 1806 # 1806 + XML_SCHEMAV_NOROLLBACK = 1807 # 1807 + XML_SCHEMAV_ISABSTRACT = 1808 # 1808 + XML_SCHEMAV_NOTEMPTY = 1809 # 1809 + XML_SCHEMAV_ELEMCONT = 1810 # 1810 + XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 + XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 + XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 + XML_SCHEMAV_INVALIDATTR = 1814 # 1814 + XML_SCHEMAV_INVALIDELEM = 1815 # 1815 + XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 + XML_SCHEMAV_CONSTRUCT = 1817 # 1817 + XML_SCHEMAV_INTERNAL = 1818 # 1818 + XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 + XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 + XML_SCHEMAV_ATTRINVALID = 1821 # 1821 + XML_SCHEMAV_VALUE = 1822 # 1822 + XML_SCHEMAV_FACET = 1823 # 1823 + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 + XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 + XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 + XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 + XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 + XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 + XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 + XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 + XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 + XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 + XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 + XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 + XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 + XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 + XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 + XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 + XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 + XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 + XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 + XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 + XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 + XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 + XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 + XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 + XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 + XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 + XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 + XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 + XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 + XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 + XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 + XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 + XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 + XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 + XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 + XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 + XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 + XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 + XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 + XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 + XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 + XML_SCHEMAV_CVC_AU = 1874 # 1874 + XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 + XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 + XML_SCHEMAV_CVC_IDC = 1877 # 1877 + XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 + XML_XPTR_UNKNOWN_SCHEME = 1900 + XML_XPTR_CHILDSEQ_START = 1901 # 1901 + XML_XPTR_EVAL_FAILED = 1902 # 1902 + XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 + XML_C14N_CREATE_CTXT = 1950 + XML_C14N_REQUIRES_UTF8 = 1951 # 1951 + XML_C14N_CREATE_STACK = 1952 # 1952 + XML_C14N_INVALID_NODE = 1953 # 1953 + XML_C14N_UNKNOW_NODE = 1954 # 1954 + XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 + XML_FTP_PASV_ANSWER = 2000 + XML_FTP_EPSV_ANSWER = 2001 # 2001 + XML_FTP_ACCNT = 2002 # 2002 + XML_FTP_URL_SYNTAX = 2003 # 2003 + XML_HTTP_URL_SYNTAX = 2020 + XML_HTTP_USE_IP = 2021 # 2021 + XML_HTTP_UNKNOWN_HOST = 2022 # 2022 + XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 + XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 + XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 + XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 + XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 + XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 + XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 + XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 + XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 + XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 + XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 + XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 + XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 + XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 + XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 + XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 + XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 + XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 + XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 + XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 + XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 + XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 + XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 + XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 + XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 + XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 + XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 + XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 + XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 + XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 + XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 + XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 + XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 + XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 + XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 + XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 + XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 + XML_SCHEMAP_NO_XMLNS = 3056 # 3056 + XML_SCHEMAP_NO_XSI = 3057 # 3057 + XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 + XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 + XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 + XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 + XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 + XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 + XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 + XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 + XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 + XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 + XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 + XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C + XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 + XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 + XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 + XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 + XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 + XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 + XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 + XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 + XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 + XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 + XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 + XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 + XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 + XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 + XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 + XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 + XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 + XML_MODULE_OPEN = 4900 # 4900 + XML_MODULE_CLOSE = 4901 # 4901 + XML_CHECK_FOUND_ELEMENT = 5000 + XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 + XML_CHECK_FOUND_TEXT = 5002 # 5002 + XML_CHECK_FOUND_CDATA = 5003 # 5003 + XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 + XML_CHECK_FOUND_ENTITY = 5005 # 5005 + XML_CHECK_FOUND_PI = 5006 # 5006 + XML_CHECK_FOUND_COMMENT = 5007 # 5007 + XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 + XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 + XML_CHECK_FOUND_NOTATION = 5010 # 5010 + XML_CHECK_UNKNOWN_NODE = 5011 # 5011 + XML_CHECK_ENTITY_TYPE = 5012 # 5012 + XML_CHECK_NO_PARENT = 5013 # 5013 + XML_CHECK_NO_DOC = 5014 # 5014 + XML_CHECK_NO_NAME = 5015 # 5015 + XML_CHECK_NO_ELEM = 5016 # 5016 + XML_CHECK_WRONG_DOC = 5017 # 5017 + XML_CHECK_NO_PREV = 5018 # 5018 + XML_CHECK_WRONG_PREV = 5019 # 5019 + XML_CHECK_NO_NEXT = 5020 # 5020 + XML_CHECK_WRONG_NEXT = 5021 # 5021 + XML_CHECK_NOT_DTD = 5022 # 5022 + XML_CHECK_NOT_ATTR = 5023 # 5023 + XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 + XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 + XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 + XML_CHECK_NOT_NS_DECL = 5027 # 5027 + XML_CHECK_NO_HREF = 5028 # 5028 + XML_CHECK_WRONG_PARENT = 5029 # 5029 + XML_CHECK_NS_SCOPE = 5030 # 5030 + XML_CHECK_NS_ANCESTOR = 5031 # 5031 + XML_CHECK_NOT_UTF8 = 5032 # 5032 + XML_CHECK_NO_DICT = 5033 # 5033 + XML_CHECK_NOT_NCNAME = 5034 # 5034 + XML_CHECK_OUTSIDE_DICT = 5035 # 5035 + XML_CHECK_WRONG_NAME = 5036 # 5036 + XML_CHECK_NAME_NOT_NULL = 5037 # 5037 + XML_I18N_NO_NAME = 6000 + XML_I18N_NO_HANDLER = 6001 # 6001 + XML_I18N_EXCESS_HANDLER = 6002 # 6002 + XML_I18N_CONV_FAILED = 6003 # 6003 + XML_I18N_NO_OUTPUT = 6004 # 6004 + XML_CHECK_ = 6005 # 5033 + XML_CHECK_X = 6006 # 503 +# --- END: GENERATED CONSTANTS --- + +cdef extern from "libxml/xmlerror.h": ctypedef struct xmlError: int domain int code @@ -22,763 +782,6 @@ cdef void xmlSetGenericErrorFunc(void* ctxt, xmlGenericErrorFunc func) cdef void xmlSetStructuredErrorFunc(void* ctxt, xmlStructuredErrorFunc func) - - ctypedef enum xmlErrorDomain: - XML_FROM_NONE = 0 - XML_FROM_PARSER = 1 # The XML parser - XML_FROM_TREE = 2 # The tree module - XML_FROM_NAMESPACE = 3 # The XML Namespace module - XML_FROM_DTD = 4 # The XML DTD validation with parser contex - XML_FROM_HTML = 5 # The HTML parser - XML_FROM_MEMORY = 6 # The memory allocator - XML_FROM_OUTPUT = 7 # The serialization code - XML_FROM_IO = 8 # The Input/Output stack - XML_FROM_FTP = 9 # The FTP module - XML_FROM_HTTP = 10 # The FTP module - XML_FROM_XINCLUDE = 11 # The XInclude processing - XML_FROM_XPATH = 12 # The XPath module - XML_FROM_XPOINTER = 13 # The XPointer module - XML_FROM_REGEXP = 14 # The regular expressions module - XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module - XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module - XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module - XML_FROM_RELAXNGP = 18 # The Relax-NG parser module - XML_FROM_RELAXNGV = 19 # The Relax-NG validator module - XML_FROM_CATALOG = 20 # The Catalog module - XML_FROM_C14N = 21 # The Canonicalization module - XML_FROM_XSLT = 22 # The XSLT engine from libxslt - XML_FROM_VALID = 23 # The XML DTD validation with valid context - XML_FROM_CHECK = 24 # The error checking module - XML_FROM_WRITER = 25 # The xmlwriter module - XML_FROM_MODULE = 26 # The dynamically loaded module modu - XML_FROM_I18N = 27 # The module handling character conversion - - ctypedef enum xmlParserErrors: - XML_ERR_OK = 0 - XML_ERR_INTERNAL_ERROR = 1 # 1 - XML_ERR_NO_MEMORY = 2 # 2 - XML_ERR_DOCUMENT_START = 3 # 3 - XML_ERR_DOCUMENT_EMPTY = 4 # 4 - XML_ERR_DOCUMENT_END = 5 # 5 - XML_ERR_INVALID_HEX_CHARREF = 6 # 6 - XML_ERR_INVALID_DEC_CHARREF = 7 # 7 - XML_ERR_INVALID_CHARREF = 8 # 8 - XML_ERR_INVALID_CHAR = 9 # 9 - XML_ERR_CHARREF_AT_EOF = 10 # 10 - XML_ERR_CHARREF_IN_PROLOG = 11 # 11 - XML_ERR_CHARREF_IN_EPILOG = 12 # 12 - XML_ERR_CHARREF_IN_DTD = 13 # 13 - XML_ERR_ENTITYREF_AT_EOF = 14 # 14 - XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 - XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 - XML_ERR_ENTITYREF_IN_DTD = 17 # 17 - XML_ERR_PEREF_AT_EOF = 18 # 18 - XML_ERR_PEREF_IN_PROLOG = 19 # 19 - XML_ERR_PEREF_IN_EPILOG = 20 # 20 - XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 - XML_ERR_ENTITYREF_NO_NAME = 22 # 22 - XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 - XML_ERR_PEREF_NO_NAME = 24 # 24 - XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 - XML_ERR_UNDECLARED_ENTITY = 26 # 26 - XML_WAR_UNDECLARED_ENTITY = 27 # 27 - XML_ERR_UNPARSED_ENTITY = 28 # 28 - XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 - XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 - XML_ERR_UNKNOWN_ENCODING = 31 # 31 - XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 - XML_ERR_STRING_NOT_STARTED = 33 # 33 - XML_ERR_STRING_NOT_CLOSED = 34 # 34 - XML_ERR_NS_DECL_ERROR = 35 # 35 - XML_ERR_ENTITY_NOT_STARTED = 36 # 36 - XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 - XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 - XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 - XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 - XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 - XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 - XML_ERR_LITERAL_NOT_STARTED = 43 # 43 - XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 - XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 - XML_ERR_PI_NOT_STARTED = 46 # 46 - XML_ERR_PI_NOT_FINISHED = 47 # 47 - XML_ERR_NOTATION_NOT_STARTED = 48 # 48 - XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 - XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 - XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 - XML_ERR_MIXED_NOT_STARTED = 52 # 52 - XML_ERR_MIXED_NOT_FINISHED = 53 # 53 - XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 - XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 - XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 - XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 - XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 - XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 - XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 - XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 - XML_ERR_MISPLACED_CDATA_END = 62 # 62 - XML_ERR_CDATA_NOT_FINISHED = 63 # 63 - XML_ERR_RESERVED_XML_NAME = 64 # 64 - XML_ERR_SPACE_REQUIRED = 65 # 65 - XML_ERR_SEPARATOR_REQUIRED = 66 # 66 - XML_ERR_NMTOKEN_REQUIRED = 67 # 67 - XML_ERR_NAME_REQUIRED = 68 # 68 - XML_ERR_PCDATA_REQUIRED = 69 # 69 - XML_ERR_URI_REQUIRED = 70 # 70 - XML_ERR_PUBID_REQUIRED = 71 # 71 - XML_ERR_LT_REQUIRED = 72 # 72 - XML_ERR_GT_REQUIRED = 73 # 73 - XML_ERR_LTSLASH_REQUIRED = 74 # 74 - XML_ERR_EQUAL_REQUIRED = 75 # 75 - XML_ERR_TAG_NAME_MISMATCH = 76 # 76 - XML_ERR_TAG_NOT_FINISHED = 77 # 77 - XML_ERR_STANDALONE_VALUE = 78 # 78 - XML_ERR_ENCODING_NAME = 79 # 79 - XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 - XML_ERR_INVALID_ENCODING = 81 # 81 - XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 - XML_ERR_CONDSEC_INVALID = 83 # 83 - XML_ERR_VALUE_REQUIRED = 84 # 84 - XML_ERR_NOT_WELL_BALANCED = 85 # 85 - XML_ERR_EXTRA_CONTENT = 86 # 86 - XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 - XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 - XML_ERR_ENTITY_LOOP = 89 # 89 - XML_ERR_ENTITY_BOUNDARY = 90 # 90 - XML_ERR_INVALID_URI = 91 # 91 - XML_ERR_URI_FRAGMENT = 92 # 92 - XML_WAR_CATALOG_PI = 93 # 93 - XML_ERR_NO_DTD = 94 # 94 - XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 - XML_ERR_VERSION_MISSING = 96 # 96 - XML_WAR_UNKNOWN_VERSION = 97 # 97 - XML_WAR_LANG_VALUE = 98 # 98 - XML_WAR_NS_URI = 99 # 99 - XML_WAR_NS_URI_RELATIVE = 100 # 100 - XML_ERR_MISSING_ENCODING = 101 # 101 - XML_WAR_SPACE_VALUE = 102 # 102 - XML_ERR_NOT_STANDALONE = 103 # 103 - XML_ERR_ENTITY_PROCESSING = 104 # 104 - XML_ERR_NOTATION_PROCESSING = 105 # 105 - XML_WAR_NS_COLUMN = 106 # 106 - XML_WAR_ENTITY_REDEFINED = 107 # 107 - XML_NS_ERR_XML_NAMESPACE = 200 - XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 - XML_NS_ERR_QNAME = 202 # 202 - XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 - XML_NS_ERR_EMPTY = 204 # 204 - XML_DTD_ATTRIBUTE_DEFAULT = 500 - XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 - XML_DTD_ATTRIBUTE_VALUE = 502 # 502 - XML_DTD_CONTENT_ERROR = 503 # 503 - XML_DTD_CONTENT_MODEL = 504 # 504 - XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 - XML_DTD_DIFFERENT_PREFIX = 506 # 506 - XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 - XML_DTD_ELEM_NAMESPACE = 508 # 508 - XML_DTD_ELEM_REDEFINED = 509 # 509 - XML_DTD_EMPTY_NOTATION = 510 # 510 - XML_DTD_ENTITY_TYPE = 511 # 511 - XML_DTD_ID_FIXED = 512 # 512 - XML_DTD_ID_REDEFINED = 513 # 513 - XML_DTD_ID_SUBSET = 514 # 514 - XML_DTD_INVALID_CHILD = 515 # 515 - XML_DTD_INVALID_DEFAULT = 516 # 516 - XML_DTD_LOAD_ERROR = 517 # 517 - XML_DTD_MISSING_ATTRIBUTE = 518 # 518 - XML_DTD_MIXED_CORRUPT = 519 # 519 - XML_DTD_MULTIPLE_ID = 520 # 520 - XML_DTD_NO_DOC = 521 # 521 - XML_DTD_NO_DTD = 522 # 522 - XML_DTD_NO_ELEM_NAME = 523 # 523 - XML_DTD_NO_PREFIX = 524 # 524 - XML_DTD_NO_ROOT = 525 # 525 - XML_DTD_NOTATION_REDEFINED = 526 # 526 - XML_DTD_NOTATION_VALUE = 527 # 527 - XML_DTD_NOT_EMPTY = 528 # 528 - XML_DTD_NOT_PCDATA = 529 # 529 - XML_DTD_NOT_STANDALONE = 530 # 530 - XML_DTD_ROOT_NAME = 531 # 531 - XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 - XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 - XML_DTD_UNKNOWN_ELEM = 534 # 534 - XML_DTD_UNKNOWN_ENTITY = 535 # 535 - XML_DTD_UNKNOWN_ID = 536 # 536 - XML_DTD_UNKNOWN_NOTATION = 537 # 537 - XML_DTD_STANDALONE_DEFAULTED = 538 # 538 - XML_DTD_XMLID_VALUE = 539 # 539 - XML_DTD_XMLID_TYPE = 540 # 540 - XML_HTML_STRUCURE_ERROR = 800 - XML_HTML_UNKNOWN_TAG = 801 # 801 - XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 - XML_RNGP_ATTR_CONFLICT = 1001 # 1001 - XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 - XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 - XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 - XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 - XML_RNGP_CHOICE_CONTENT = 1006 # 1006 - XML_RNGP_CHOICE_EMPTY = 1007 # 1007 - XML_RNGP_CREATE_FAILURE = 1008 # 1008 - XML_RNGP_DATA_CONTENT = 1009 # 1009 - XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 - XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 - XML_RNGP_DEFINE_EMPTY = 1012 # 1012 - XML_RNGP_DEFINE_MISSING = 1013 # 1013 - XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 - XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 - XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 - XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 - XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 - XML_RNGP_ELEMENT_NAME = 1019 # 1019 - XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 - XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 - XML_RNGP_EMPTY = 1022 # 1022 - XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 - XML_RNGP_EMPTY_CONTENT = 1024 # 1024 - XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 - XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 - XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 - XML_RNGP_EXCEPT_MISSING = 1028 # 1028 - XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 - XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 - XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 - XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 - XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 - XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 - XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 - XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 - XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 - XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 - XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 - XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 - XML_RNGP_HREF_ERROR = 1041 # 1041 - XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 - XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 - XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 - XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 - XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 - XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 - XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 - XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 - XML_RNGP_INVALID_URI = 1050 # 1050 - XML_RNGP_INVALID_VALUE = 1051 # 1051 - XML_RNGP_MISSING_HREF = 1052 # 1052 - XML_RNGP_NAME_MISSING = 1053 # 1053 - XML_RNGP_NEED_COMBINE = 1054 # 1054 - XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 - XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 - XML_RNGP_NSNAME_NO_NS = 1057 # 1057 - XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 - XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 - XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 - XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 - XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 - XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 - XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 - XML_RNGP_PARSE_ERROR = 1065 # 1065 - XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 - XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 - XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 - XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 - XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 - XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 - XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 - XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 - XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 - XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 - XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 - XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 - XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 - XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 - XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 - XML_RNGP_PAT_LIST_LIST = 1081 # 1081 - XML_RNGP_PAT_LIST_REF = 1082 # 1082 - XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 - XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 - XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 - XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 - XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 - XML_RNGP_PAT_START_ATTR = 1088 # 1088 - XML_RNGP_PAT_START_DATA = 1089 # 1089 - XML_RNGP_PAT_START_EMPTY = 1090 # 1090 - XML_RNGP_PAT_START_GROUP = 1091 # 1091 - XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 - XML_RNGP_PAT_START_LIST = 1093 # 1093 - XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 - XML_RNGP_PAT_START_TEXT = 1095 # 1095 - XML_RNGP_PAT_START_VALUE = 1096 # 1096 - XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 - XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 - XML_RNGP_REF_CYCLE = 1099 # 1099 - XML_RNGP_REF_NAME_INVALID = 1100 # 1100 - XML_RNGP_REF_NO_DEF = 1101 # 1101 - XML_RNGP_REF_NO_NAME = 1102 # 1102 - XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 - XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 - XML_RNGP_START_CONTENT = 1105 # 1105 - XML_RNGP_START_EMPTY = 1106 # 1106 - XML_RNGP_START_MISSING = 1107 # 1107 - XML_RNGP_TEXT_EXPECTED = 1108 # 1108 - XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 - XML_RNGP_TYPE_MISSING = 1110 # 1110 - XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 - XML_RNGP_TYPE_VALUE = 1112 # 1112 - XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 - XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 - XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 - XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 - XML_RNGP_URI_FRAGMENT = 1117 # 1117 - XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 - XML_RNGP_VALUE_EMPTY = 1119 # 1119 - XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 - XML_RNGP_XMLNS_NAME = 1121 # 1121 - XML_RNGP_XML_NS = 1122 # 1122 - XML_XPATH_EXPRESSION_OK = 1200 - XML_XPATH_NUMBER_ERROR = 1201 # 1201 - XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 - XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 - XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 - XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 - XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 - XML_XPATH_EXPR_ERROR = 1207 # 1207 - XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 - XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 - XML_XPATH_INVALID_OPERAND = 1210 # 1210 - XML_XPATH_INVALID_TYPE = 1211 # 1211 - XML_XPATH_INVALID_ARITY = 1212 # 1212 - XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 - XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 - XML_XPATH_MEMORY_ERROR = 1215 # 1215 - XML_XPTR_SYNTAX_ERROR = 1216 # 1216 - XML_XPTR_RESOURCE_ERROR = 1217 # 1217 - XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 - XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 - XML_XPATH_ENCODING_ERROR = 1220 # 1220 - XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 - XML_TREE_INVALID_HEX = 1300 - XML_TREE_INVALID_DEC = 1301 # 1301 - XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 - XML_SAVE_NOT_UTF8 = 1400 - XML_SAVE_CHAR_INVALID = 1401 # 1401 - XML_SAVE_NO_DOCTYPE = 1402 # 1402 - XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 - XML_REGEXP_COMPILE_ERROR = 1450 - XML_IO_UNKNOWN = 1500 - XML_IO_EACCES = 1501 # 1501 - XML_IO_EAGAIN = 1502 # 1502 - XML_IO_EBADF = 1503 # 1503 - XML_IO_EBADMSG = 1504 # 1504 - XML_IO_EBUSY = 1505 # 1505 - XML_IO_ECANCELED = 1506 # 1506 - XML_IO_ECHILD = 1507 # 1507 - XML_IO_EDEADLK = 1508 # 1508 - XML_IO_EDOM = 1509 # 1509 - XML_IO_EEXIST = 1510 # 1510 - XML_IO_EFAULT = 1511 # 1511 - XML_IO_EFBIG = 1512 # 1512 - XML_IO_EINPROGRESS = 1513 # 1513 - XML_IO_EINTR = 1514 # 1514 - XML_IO_EINVAL = 1515 # 1515 - XML_IO_EIO = 1516 # 1516 - XML_IO_EISDIR = 1517 # 1517 - XML_IO_EMFILE = 1518 # 1518 - XML_IO_EMLINK = 1519 # 1519 - XML_IO_EMSGSIZE = 1520 # 1520 - XML_IO_ENAMETOOLONG = 1521 # 1521 - XML_IO_ENFILE = 1522 # 1522 - XML_IO_ENODEV = 1523 # 1523 - XML_IO_ENOENT = 1524 # 1524 - XML_IO_ENOEXEC = 1525 # 1525 - XML_IO_ENOLCK = 1526 # 1526 - XML_IO_ENOMEM = 1527 # 1527 - XML_IO_ENOSPC = 1528 # 1528 - XML_IO_ENOSYS = 1529 # 1529 - XML_IO_ENOTDIR = 1530 # 1530 - XML_IO_ENOTEMPTY = 1531 # 1531 - XML_IO_ENOTSUP = 1532 # 1532 - XML_IO_ENOTTY = 1533 # 1533 - XML_IO_ENXIO = 1534 # 1534 - XML_IO_EPERM = 1535 # 1535 - XML_IO_EPIPE = 1536 # 1536 - XML_IO_ERANGE = 1537 # 1537 - XML_IO_EROFS = 1538 # 1538 - XML_IO_ESPIPE = 1539 # 1539 - XML_IO_ESRCH = 1540 # 1540 - XML_IO_ETIMEDOUT = 1541 # 1541 - XML_IO_EXDEV = 1542 # 1542 - XML_IO_NETWORK_ATTEMPT = 1543 # 1543 - XML_IO_ENCODER = 1544 # 1544 - XML_IO_FLUSH = 1545 # 1545 - XML_IO_WRITE = 1546 # 1546 - XML_IO_NO_INPUT = 1547 # 1547 - XML_IO_BUFFER_FULL = 1548 # 1548 - XML_IO_LOAD_ERROR = 1549 # 1549 - XML_IO_ENOTSOCK = 1550 # 1550 - XML_IO_EISCONN = 1551 # 1551 - XML_IO_ECONNREFUSED = 1552 # 1552 - XML_IO_ENETUNREACH = 1553 # 1553 - XML_IO_EADDRINUSE = 1554 # 1554 - XML_IO_EALREADY = 1555 # 1555 - XML_IO_EAFNOSUPPORT = 1556 # 1556 - XML_XINCLUDE_RECURSION = 1600 - XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 - XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 - XML_XINCLUDE_NO_HREF = 1603 # 1603 - XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 - XML_XINCLUDE_HREF_URI = 1605 # 1605 - XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 - XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 - XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 - XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 - XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 - XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 - XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 - XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 - XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 - XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 - XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 - XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 - XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 - XML_CATALOG_MISSING_ATTR = 1650 - XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 - XML_CATALOG_PREFER_VALUE = 1652 # 1652 - XML_CATALOG_NOT_CATALOG = 1653 # 1653 - XML_CATALOG_RECURSION = 1654 # 1654 - XML_SCHEMAP_PREFIX_UNDEFINED = 1700 - XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 - XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 - XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 - XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 - XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 - XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 - XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 - XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 - XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 - XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 - XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 - XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 - XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 - XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 - XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 - XML_SCHEMAP_INVALID_FACET = 1716 # 1716 - XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 - XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 - XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 - XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 - XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 - XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 - XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 - XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 - XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 - XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 - XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 - XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 - XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 - XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 - XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 - XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 - XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 - XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 - XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 - XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 - XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 - XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 - XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 - XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 - XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 - XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 - XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 - XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 - XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 - XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 - XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 - XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 - XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 - XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 - XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 - XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 - XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 - XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 - XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 - XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 - XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 - XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 - XML_SCHEMAP_NOROOT = 1759 # 1759 - XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 - XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 - XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 - XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 - XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 - XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 - XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 - XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 - XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 - XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 - XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 - XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 - XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 - XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 - XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 - XML_SCHEMAP_RECURSIVE = 1775 # 1775 - XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 - XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 - XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 - XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 - XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 - XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 - XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 - XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 - XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 - XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 - XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 - XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 - XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 - XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 - XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 - XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 - XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 - XML_SCHEMAV_NOROOT = 1801 - XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 - XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 - XML_SCHEMAV_MISSING = 1804 # 1804 - XML_SCHEMAV_WRONGELEM = 1805 # 1805 - XML_SCHEMAV_NOTYPE = 1806 # 1806 - XML_SCHEMAV_NOROLLBACK = 1807 # 1807 - XML_SCHEMAV_ISABSTRACT = 1808 # 1808 - XML_SCHEMAV_NOTEMPTY = 1809 # 1809 - XML_SCHEMAV_ELEMCONT = 1810 # 1810 - XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 - XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 - XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 - XML_SCHEMAV_INVALIDATTR = 1814 # 1814 - XML_SCHEMAV_INVALIDELEM = 1815 # 1815 - XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 - XML_SCHEMAV_CONSTRUCT = 1817 # 1817 - XML_SCHEMAV_INTERNAL = 1818 # 1818 - XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 - XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 - XML_SCHEMAV_ATTRINVALID = 1821 # 1821 - XML_SCHEMAV_VALUE = 1822 # 1822 - XML_SCHEMAV_FACET = 1823 # 1823 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 - XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 - XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 - XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 - XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 - XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 - XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 - XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 - XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 - XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 - XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 - XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 - XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 - XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 - XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 - XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 - XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 - XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 - XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 - XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 - XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 - XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 - XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 - XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 - XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 - XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 - XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 - XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 - XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 - XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 - XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 - XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 - XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 - XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 - XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 - XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 - XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 - XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 - XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 - XML_SCHEMAV_CVC_AU = 1874 # 1874 - XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 - XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 - XML_SCHEMAV_CVC_IDC = 1877 # 1877 - XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 - XML_XPTR_UNKNOWN_SCHEME = 1900 - XML_XPTR_CHILDSEQ_START = 1901 # 1901 - XML_XPTR_EVAL_FAILED = 1902 # 1902 - XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 - XML_C14N_CREATE_CTXT = 1950 - XML_C14N_REQUIRES_UTF8 = 1951 # 1951 - XML_C14N_CREATE_STACK = 1952 # 1952 - XML_C14N_INVALID_NODE = 1953 # 1953 - XML_C14N_UNKNOW_NODE = 1954 # 1954 - XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 - XML_FTP_PASV_ANSWER = 2000 - XML_FTP_EPSV_ANSWER = 2001 # 2001 - XML_FTP_ACCNT = 2002 # 2002 - XML_FTP_URL_SYNTAX = 2003 # 2003 - XML_HTTP_URL_SYNTAX = 2020 - XML_HTTP_USE_IP = 2021 # 2021 - XML_HTTP_UNKNOWN_HOST = 2022 # 2022 - XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 - XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 - XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 - XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 - XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 - XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 - XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 - XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 - XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 - XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 - XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 - XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 - XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 - XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 - XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 - XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 - XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 - XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 - XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 - XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 - XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 - XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 - XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 - XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 - XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 - XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 - XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 - XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 - XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 - XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 - XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 - XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 - XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 - XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 - XML_SCHEMAP_NO_XMLNS = 3056 # 3056 - XML_SCHEMAP_NO_XSI = 3057 # 3057 - XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 - XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 - XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 - XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 - XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 - XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 - XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 - XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 - XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 - XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C - XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 - XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 - XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 - XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 - XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 - XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 - XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 - XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 - XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 - XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 - XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 - XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 - XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 - XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 - XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 - XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 - XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 - XML_MODULE_OPEN = 4900 # 4900 - XML_MODULE_CLOSE = 4901 # 4901 - XML_CHECK_FOUND_ELEMENT = 5000 - XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 - XML_CHECK_FOUND_TEXT = 5002 # 5002 - XML_CHECK_FOUND_CDATA = 5003 # 5003 - XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 - XML_CHECK_FOUND_ENTITY = 5005 # 5005 - XML_CHECK_FOUND_PI = 5006 # 5006 - XML_CHECK_FOUND_COMMENT = 5007 # 5007 - XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 - XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 - XML_CHECK_FOUND_NOTATION = 5010 # 5010 - XML_CHECK_UNKNOWN_NODE = 5011 # 5011 - XML_CHECK_ENTITY_TYPE = 5012 # 5012 - XML_CHECK_NO_PARENT = 5013 # 5013 - XML_CHECK_NO_DOC = 5014 # 5014 - XML_CHECK_NO_NAME = 5015 # 5015 - XML_CHECK_NO_ELEM = 5016 # 5016 - XML_CHECK_WRONG_DOC = 5017 # 5017 - XML_CHECK_NO_PREV = 5018 # 5018 - XML_CHECK_WRONG_PREV = 5019 # 5019 - XML_CHECK_NO_NEXT = 5020 # 5020 - XML_CHECK_WRONG_NEXT = 5021 # 5021 - XML_CHECK_NOT_DTD = 5022 # 5022 - XML_CHECK_NOT_ATTR = 5023 # 5023 - XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 - XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 - XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 - XML_CHECK_NOT_NS_DECL = 5027 # 5027 - XML_CHECK_NO_HREF = 5028 # 5028 - XML_CHECK_WRONG_PARENT = 5029 # 5029 - XML_CHECK_NS_SCOPE = 5030 # 5030 - XML_CHECK_NS_ANCESTOR = 5031 # 5031 - XML_CHECK_NOT_UTF8 = 5032 # 5032 - XML_CHECK_NO_DICT = 5033 # 5033 - XML_CHECK_NOT_NCNAME = 5034 # 5034 - XML_CHECK_OUTSIDE_DICT = 5035 # 5035 - XML_CHECK_WRONG_NAME = 5036 # 5036 - XML_CHECK_NAME_NOT_NULL = 5037 # 5037 - XML_I18N_NO_NAME = 6000 - XML_I18N_NO_HANDLER = 6001 # 6001 - XML_I18N_EXCESS_HANDLER = 6002 # 6002 - XML_I18N_CONV_FAILED = 6003 # 6003 - XML_I18N_NO_OUTPUT = 6004 # 6004 - XML_CHECK_ = 6005 # 5033 - XML_CHECK_X = 6006 # 503 cdef extern from "libxml/globals.h": cdef void xmlThrDefSetGenericErrorFunc(void* ctx, Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Fri Jun 2 12:01:01 2006 @@ -378,7 +378,7 @@ xmlerror.xmlSetStructuredErrorFunc(NULL, _receiveError) ################################################################################ -## CONSTANTS FROM "xmlerror.h" +## CONSTANTS FROM "xmlerror.h" (or rather libxml-xmlerror.html) ################################################################################ cdef void __initErrorConstants(): @@ -400,779 +400,831 @@ class ErrorLevels: "Libxml2 error levels" -cdef object __ERROR_LEVELS -__ERROR_LEVELS = """ - XML_ERR_NONE = 0 - XML_ERR_WARNING = 1 : A simple warning - XML_ERR_ERROR = 2 : A recoverable error - XML_ERR_FATAL = 3 : A fatal error -""" - class ErrorDomains: "Libxml2 error domains" -cdef object __ERROR_DOMAINS -__ERROR_DOMAINS = """ - XML_FROM_NONE = 0 - XML_FROM_PARSER = 1 : The XML parser - XML_FROM_TREE = 2 : The tree module - XML_FROM_NAMESPACE = 3 : The XML Namespace module - XML_FROM_DTD = 4 : The XML DTD validation with parser contex - XML_FROM_HTML = 5 : The HTML parser - XML_FROM_MEMORY = 6 : The memory allocator - XML_FROM_OUTPUT = 7 : The serialization code - XML_FROM_IO = 8 : The Input/Output stack - XML_FROM_FTP = 9 : The FTP module - XML_FROM_HTTP = 10 : The HTTP module - XML_FROM_XINCLUDE = 11 : The XInclude processing - XML_FROM_XPATH = 12 : The XPath module - XML_FROM_XPOINTER = 13 : The XPointer module - XML_FROM_REGEXP = 14 : The regular expressions module - XML_FROM_DATATYPE = 15 : The W3C XML Schemas Datatype module - XML_FROM_SCHEMASP = 16 : The W3C XML Schemas parser module - XML_FROM_SCHEMASV = 17 : The W3C XML Schemas validation module - XML_FROM_RELAXNGP = 18 : The Relax-NG parser module - XML_FROM_RELAXNGV = 19 : The Relax-NG validator module - XML_FROM_CATALOG = 20 : The Catalog module - XML_FROM_C14N = 21 : The Canonicalization module - XML_FROM_XSLT = 22 : The XSLT engine from libxslt - XML_FROM_VALID = 23 : The XML DTD validation with valid context - XML_FROM_CHECK = 24 : The error checking module - XML_FROM_WRITER = 25 : The xmlwriter module - XML_FROM_MODULE = 26 : The dynamically loaded module modul - XML_FROM_I18N = 27 : The module handling character conversion -""" - class ErrorTypes: "Libxml2 error types" +# --- BEGIN: GENERATED CONSTANTS --- +cdef object __ERROR_LEVELS +__ERROR_LEVELS = """\ +XML_ERR_NONE = 0 +XML_ERR_WARNING = 1 # A simple warning +XML_ERR_ERROR = 2 # A recoverable error +XML_ERR_FATAL = 3 # A fatal error +""" + +cdef object __ERROR_DOMAINS +__ERROR_DOMAINS = """\ +XML_FROM_NONE = 0 +XML_FROM_PARSER = 1 # The XML parser +XML_FROM_TREE = 2 # The tree module +XML_FROM_NAMESPACE = 3 # The XML Namespace module +XML_FROM_DTD = 4 # The XML DTD validation with parser contex +XML_FROM_HTML = 5 # The HTML parser +XML_FROM_MEMORY = 6 # The memory allocator +XML_FROM_OUTPUT = 7 # The serialization code +XML_FROM_IO = 8 # The Input/Output stack +XML_FROM_FTP = 9 # The FTP module +XML_FROM_HTTP = 10 # The HTTP module +XML_FROM_XINCLUDE = 11 # The XInclude processing +XML_FROM_XPATH = 12 # The XPath module +XML_FROM_XPOINTER = 13 # The XPointer module +XML_FROM_REGEXP = 14 # The regular expressions module +XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module +XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module +XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module +XML_FROM_RELAXNGP = 18 # The Relax-NG parser module +XML_FROM_RELAXNGV = 19 # The Relax-NG validator module +XML_FROM_CATALOG = 20 # The Catalog module +XML_FROM_C14N = 21 # The Canonicalization module +XML_FROM_XSLT = 22 # The XSLT engine from libxslt +""" + \ +"""\ +XML_FROM_VALID = 23 # The XML DTD validation with valid context +XML_FROM_CHECK = 24 # The error checking module +XML_FROM_WRITER = 25 # The xmlwriter module +XML_FROM_MODULE = 26 # The dynamically loaded module modul +XML_FROM_I18N = 27 # The module handling character conversion +""" + cdef object __ERROR_TYPES -__ERROR_TYPES = """ - XML_ERR_OK = 0 - XML_ERR_INTERNAL_ERROR = 1 : 1 - XML_ERR_NO_MEMORY = 2 : 2 - XML_ERR_DOCUMENT_START = 3 : 3 - XML_ERR_DOCUMENT_EMPTY = 4 : 4 - XML_ERR_DOCUMENT_END = 5 : 5 - XML_ERR_INVALID_HEX_CHARREF = 6 : 6 - XML_ERR_INVALID_DEC_CHARREF = 7 : 7 - XML_ERR_INVALID_CHARREF = 8 : 8 - XML_ERR_INVALID_CHAR = 9 : 9 - XML_ERR_CHARREF_AT_EOF = 10 : 10 - XML_ERR_CHARREF_IN_PROLOG = 11 : 11 - XML_ERR_CHARREF_IN_EPILOG = 12 : 12 - XML_ERR_CHARREF_IN_DTD = 13 : 13 - XML_ERR_ENTITYREF_AT_EOF = 14 : 14 - XML_ERR_ENTITYREF_IN_PROLOG = 15 : 15 - XML_ERR_ENTITYREF_IN_EPILOG = 16 : 16 - XML_ERR_ENTITYREF_IN_DTD = 17 : 17 - XML_ERR_PEREF_AT_EOF = 18 : 18 - XML_ERR_PEREF_IN_PROLOG = 19 : 19 - XML_ERR_PEREF_IN_EPILOG = 20 : 20 - XML_ERR_PEREF_IN_INT_SUBSET = 21 : 21 - XML_ERR_ENTITYREF_NO_NAME = 22 : 22 - XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 : 23 - XML_ERR_PEREF_NO_NAME = 24 : 24 - XML_ERR_PEREF_SEMICOL_MISSING = 25 : 25 - XML_ERR_UNDECLARED_ENTITY = 26 : 26 - XML_WAR_UNDECLARED_ENTITY = 27 : 27 - XML_ERR_UNPARSED_ENTITY = 28 : 28 - XML_ERR_ENTITY_IS_EXTERNAL = 29 : 29 - XML_ERR_ENTITY_IS_PARAMETER = 30 : 30 - XML_ERR_UNKNOWN_ENCODING = 31 : 31 - XML_ERR_UNSUPPORTED_ENCODING = 32 : 32 - XML_ERR_STRING_NOT_STARTED = 33 : 33 - XML_ERR_STRING_NOT_CLOSED = 34 : 34 - XML_ERR_NS_DECL_ERROR = 35 : 35 - XML_ERR_ENTITY_NOT_STARTED = 36 : 36 - XML_ERR_ENTITY_NOT_FINISHED = 37 : 37 - XML_ERR_LT_IN_ATTRIBUTE = 38 : 38 - XML_ERR_ATTRIBUTE_NOT_STARTED = 39 : 39 - XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 : 40 - XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 : 41 - XML_ERR_ATTRIBUTE_REDEFINED = 42 : 42 - XML_ERR_LITERAL_NOT_STARTED = 43 : 43 - XML_ERR_LITERAL_NOT_FINISHED = 44 : 44 - XML_ERR_COMMENT_NOT_FINISHED = 45 : 45 - XML_ERR_PI_NOT_STARTED = 46 : 46 - XML_ERR_PI_NOT_FINISHED = 47 : 47 - XML_ERR_NOTATION_NOT_STARTED = 48 : 48 - XML_ERR_NOTATION_NOT_FINISHED = 49 : 49 - XML_ERR_ATTLIST_NOT_STARTED = 50 : 50 - XML_ERR_ATTLIST_NOT_FINISHED = 51 : 51 - XML_ERR_MIXED_NOT_STARTED = 52 : 52 - XML_ERR_MIXED_NOT_FINISHED = 53 : 53 - XML_ERR_ELEMCONTENT_NOT_STARTED = 54 : 54 - XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 : 55 - XML_ERR_XMLDECL_NOT_STARTED = 56 : 56 - XML_ERR_XMLDECL_NOT_FINISHED = 57 : 57 - XML_ERR_CONDSEC_NOT_STARTED = 58 : 58 - XML_ERR_CONDSEC_NOT_FINISHED = 59 : 59 - XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 : 60 - XML_ERR_DOCTYPE_NOT_FINISHED = 61 : 61 - XML_ERR_MISPLACED_CDATA_END = 62 : 62 - XML_ERR_CDATA_NOT_FINISHED = 63 : 63 - XML_ERR_RESERVED_XML_NAME = 64 : 64 - XML_ERR_SPACE_REQUIRED = 65 : 65 - XML_ERR_SEPARATOR_REQUIRED = 66 : 66 - XML_ERR_NMTOKEN_REQUIRED = 67 : 67 - XML_ERR_NAME_REQUIRED = 68 : 68 - XML_ERR_PCDATA_REQUIRED = 69 : 69 - XML_ERR_URI_REQUIRED = 70 : 70 - XML_ERR_PUBID_REQUIRED = 71 : 71 - XML_ERR_LT_REQUIRED = 72 : 72 - XML_ERR_GT_REQUIRED = 73 : 73 - XML_ERR_LTSLASH_REQUIRED = 74 : 74 - XML_ERR_EQUAL_REQUIRED = 75 : 75 - XML_ERR_TAG_NAME_MISMATCH = 76 : 76 - XML_ERR_TAG_NOT_FINISHED = 77 : 77 - XML_ERR_STANDALONE_VALUE = 78 : 78 - XML_ERR_ENCODING_NAME = 79 : 79 - XML_ERR_HYPHEN_IN_COMMENT = 80 : 80 - XML_ERR_INVALID_ENCODING = 81 : 81 - XML_ERR_EXT_ENTITY_STANDALONE = 82 : 82 - XML_ERR_CONDSEC_INVALID = 83 : 83 - XML_ERR_VALUE_REQUIRED = 84 : 84 - XML_ERR_NOT_WELL_BALANCED = 85 : 85 - XML_ERR_EXTRA_CONTENT = 86 : 86 - XML_ERR_ENTITY_CHAR_ERROR = 87 : 87 - XML_ERR_ENTITY_PE_INTERNAL = 88 : 88 - XML_ERR_ENTITY_LOOP = 89 : 89 - XML_ERR_ENTITY_BOUNDARY = 90 : 90 - XML_ERR_INVALID_URI = 91 : 91 - XML_ERR_URI_FRAGMENT = 92 : 92 - XML_WAR_CATALOG_PI = 93 : 93 - XML_ERR_NO_DTD = 94 : 94 - XML_ERR_CONDSEC_INVALID_KEYWORD = 95 : 95 - XML_ERR_VERSION_MISSING = 96 : 96 - XML_WAR_UNKNOWN_VERSION = 97 : 97 - XML_WAR_LANG_VALUE = 98 : 98 - XML_WAR_NS_URI = 99 : 99 - XML_WAR_NS_URI_RELATIVE = 100 : 100 - XML_ERR_MISSING_ENCODING = 101 : 101 - XML_WAR_SPACE_VALUE = 102 : 102 - XML_ERR_NOT_STANDALONE = 103 : 103 - XML_ERR_ENTITY_PROCESSING = 104 : 104 - XML_ERR_NOTATION_PROCESSING = 105 : 105 - XML_WAR_NS_COLUMN = 106 : 106 - XML_WAR_ENTITY_REDEFINED = 107 : 107 - XML_NS_ERR_XML_NAMESPACE = 200 - XML_NS_ERR_UNDEFINED_NAMESPACE = 201 : 201 - XML_NS_ERR_QNAME = 202 : 202 - XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 : 203 - XML_NS_ERR_EMPTY = 204 : 204 - XML_DTD_ATTRIBUTE_DEFAULT = 500 - XML_DTD_ATTRIBUTE_REDEFINED = 501 : 501 - XML_DTD_ATTRIBUTE_VALUE = 502 : 502 - XML_DTD_CONTENT_ERROR = 503 : 503 - XML_DTD_CONTENT_MODEL = 504 : 504 - XML_DTD_CONTENT_NOT_DETERMINIST = 505 : 505 - XML_DTD_DIFFERENT_PREFIX = 506 : 506 - XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 : 507 - XML_DTD_ELEM_NAMESPACE = 508 : 508 - XML_DTD_ELEM_REDEFINED = 509 : 509 - XML_DTD_EMPTY_NOTATION = 510 : 510 - XML_DTD_ENTITY_TYPE = 511 : 511 - XML_DTD_ID_FIXED = 512 : 512 - XML_DTD_ID_REDEFINED = 513 : 513 - XML_DTD_ID_SUBSET = 514 : 514 - XML_DTD_INVALID_CHILD = 515 : 515 - XML_DTD_INVALID_DEFAULT = 516 : 516 - XML_DTD_LOAD_ERROR = 517 : 517 - XML_DTD_MISSING_ATTRIBUTE = 518 : 518 - XML_DTD_MIXED_CORRUPT = 519 : 519 - XML_DTD_MULTIPLE_ID = 520 : 520 - XML_DTD_NO_DOC = 521 : 521 - XML_DTD_NO_DTD = 522 : 522 - XML_DTD_NO_ELEM_NAME = 523 : 523 - XML_DTD_NO_PREFIX = 524 : 524 - XML_DTD_NO_ROOT = 525 : 525 - XML_DTD_NOTATION_REDEFINED = 526 : 526 - XML_DTD_NOTATION_VALUE = 527 : 527 - XML_DTD_NOT_EMPTY = 528 : 528 - XML_DTD_NOT_PCDATA = 529 : 529 - XML_DTD_NOT_STANDALONE = 530 : 530 - XML_DTD_ROOT_NAME = 531 : 531 - XML_DTD_STANDALONE_WHITE_SPACE = 532 : 532 - XML_DTD_UNKNOWN_ATTRIBUTE = 533 : 533 - XML_DTD_UNKNOWN_ELEM = 534 : 534 - XML_DTD_UNKNOWN_ENTITY = 535 : 535 - XML_DTD_UNKNOWN_ID = 536 : 536 - XML_DTD_UNKNOWN_NOTATION = 537 : 537 - XML_DTD_STANDALONE_DEFAULTED = 538 : 538 - XML_DTD_XMLID_VALUE = 539 : 539 - XML_DTD_XMLID_TYPE = 540 : 540 - XML_HTML_STRUCURE_ERROR = 800 - XML_HTML_UNKNOWN_TAG = 801 : 801 - XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 - XML_RNGP_ATTR_CONFLICT = 1001 : 1001 - XML_RNGP_ATTRIBUTE_CHILDREN = 1002 : 1002 - XML_RNGP_ATTRIBUTE_CONTENT = 1003 : 1003 - XML_RNGP_ATTRIBUTE_EMPTY = 1004 : 1004 - XML_RNGP_ATTRIBUTE_NOOP = 1005 : 1005 - XML_RNGP_CHOICE_CONTENT = 1006 : 1006 - XML_RNGP_CHOICE_EMPTY = 1007 : 1007 - XML_RNGP_CREATE_FAILURE = 1008 : 1008 - XML_RNGP_DATA_CONTENT = 1009 : 1009 - XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 : 1010 - XML_RNGP_DEFINE_CREATE_FAILED = 1011 : 1011 - XML_RNGP_DEFINE_EMPTY = 1012 : 1012 - XML_RNGP_DEFINE_MISSING = 1013 : 1013 - XML_RNGP_DEFINE_NAME_MISSING = 1014 : 1014 - XML_RNGP_ELEM_CONTENT_EMPTY = 1015 : 1015 - XML_RNGP_ELEM_CONTENT_ERROR = 1016 : 1016 - XML_RNGP_ELEMENT_EMPTY = 1017 : 1017 - XML_RNGP_ELEMENT_CONTENT = 1018 : 1018 - XML_RNGP_ELEMENT_NAME = 1019 : 1019 - XML_RNGP_ELEMENT_NO_CONTENT = 1020 : 1020 - XML_RNGP_ELEM_TEXT_CONFLICT = 1021 : 1021 - XML_RNGP_EMPTY = 1022 : 1022 - XML_RNGP_EMPTY_CONSTRUCT = 1023 : 1023 - XML_RNGP_EMPTY_CONTENT = 1024 : 1024 - XML_RNGP_EMPTY_NOT_EMPTY = 1025 : 1025 - XML_RNGP_ERROR_TYPE_LIB = 1026 : 1026 - XML_RNGP_EXCEPT_EMPTY = 1027 : 1027 - XML_RNGP_EXCEPT_MISSING = 1028 : 1028 - XML_RNGP_EXCEPT_MULTIPLE = 1029 : 1029 - XML_RNGP_EXCEPT_NO_CONTENT = 1030 : 1030 - XML_RNGP_EXTERNALREF_EMTPY = 1031 : 1031 - XML_RNGP_EXTERNAL_REF_FAILURE = 1032 : 1032 - XML_RNGP_EXTERNALREF_RECURSE = 1033 : 1033 - XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 : 1034 - XML_RNGP_FOREIGN_ELEMENT = 1035 : 1035 - XML_RNGP_GRAMMAR_CONTENT = 1036 : 1036 - XML_RNGP_GRAMMAR_EMPTY = 1037 : 1037 - XML_RNGP_GRAMMAR_MISSING = 1038 : 1038 - XML_RNGP_GRAMMAR_NO_START = 1039 : 1039 - XML_RNGP_GROUP_ATTR_CONFLICT = 1040 : 1040 - XML_RNGP_HREF_ERROR = 1041 : 1041 - XML_RNGP_INCLUDE_EMPTY = 1042 : 1042 - XML_RNGP_INCLUDE_FAILURE = 1043 : 1043 - XML_RNGP_INCLUDE_RECURSE = 1044 : 1044 - XML_RNGP_INTERLEAVE_ADD = 1045 : 1045 - XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 : 1046 - XML_RNGP_INTERLEAVE_EMPTY = 1047 : 1047 - XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 : 1048 - XML_RNGP_INVALID_DEFINE_NAME = 1049 : 1049 - XML_RNGP_INVALID_URI = 1050 : 1050 - XML_RNGP_INVALID_VALUE = 1051 : 1051 - XML_RNGP_MISSING_HREF = 1052 : 1052 - XML_RNGP_NAME_MISSING = 1053 : 1053 - XML_RNGP_NEED_COMBINE = 1054 : 1054 - XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 : 1055 - XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 : 1056 - XML_RNGP_NSNAME_NO_NS = 1057 : 1057 - XML_RNGP_PARAM_FORBIDDEN = 1058 : 1058 - XML_RNGP_PARAM_NAME_MISSING = 1059 : 1059 - XML_RNGP_PARENTREF_CREATE_FAILED = 1060 : 1060 - XML_RNGP_PARENTREF_NAME_INVALID = 1061 : 1061 - XML_RNGP_PARENTREF_NO_NAME = 1062 : 1062 - XML_RNGP_PARENTREF_NO_PARENT = 1063 : 1063 - XML_RNGP_PARENTREF_NOT_EMPTY = 1064 : 1064 - XML_RNGP_PARSE_ERROR = 1065 : 1065 - XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 : 1066 - XML_RNGP_PAT_ATTR_ATTR = 1067 : 1067 - XML_RNGP_PAT_ATTR_ELEM = 1068 : 1068 - XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 : 1069 - XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 : 1070 - XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 : 1071 - XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 : 1072 - XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 : 1073 - XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 : 1074 - XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 : 1075 - XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 : 1076 - XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 : 1077 - XML_RNGP_PAT_LIST_ATTR = 1078 : 1078 - XML_RNGP_PAT_LIST_ELEM = 1079 : 1079 - XML_RNGP_PAT_LIST_INTERLEAVE = 1080 : 1080 - XML_RNGP_PAT_LIST_LIST = 1081 : 1081 - XML_RNGP_PAT_LIST_REF = 1082 : 1082 - XML_RNGP_PAT_LIST_TEXT = 1083 : 1083 - XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 : 1084 - XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 : 1085 - XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 : 1086 - XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 : 1087 - XML_RNGP_PAT_START_ATTR = 1088 : 1088 - XML_RNGP_PAT_START_DATA = 1089 : 1089 - XML_RNGP_PAT_START_EMPTY = 1090 : 1090 - XML_RNGP_PAT_START_GROUP = 1091 : 1091 - XML_RNGP_PAT_START_INTERLEAVE = 1092 : 1092 - XML_RNGP_PAT_START_LIST = 1093 : 1093 - XML_RNGP_PAT_START_ONEMORE = 1094 : 1094 - XML_RNGP_PAT_START_TEXT = 1095 : 1095 - XML_RNGP_PAT_START_VALUE = 1096 : 1096 - XML_RNGP_PREFIX_UNDEFINED = 1097 : 1097 - XML_RNGP_REF_CREATE_FAILED = 1098 : 1098 - XML_RNGP_REF_CYCLE = 1099 : 1099 - XML_RNGP_REF_NAME_INVALID = 1100 : 1100 - XML_RNGP_REF_NO_DEF = 1101 : 1101 - XML_RNGP_REF_NO_NAME = 1102 : 1102 - XML_RNGP_REF_NOT_EMPTY = 1103 : 1103 - XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 : 1104 - XML_RNGP_START_CONTENT = 1105 : 1105 - XML_RNGP_START_EMPTY = 1106 : 1106 - XML_RNGP_START_MISSING = 1107 : 1107 - XML_RNGP_TEXT_EXPECTED = 1108 : 1108 - XML_RNGP_TEXT_HAS_CHILD = 1109 : 1109 - XML_RNGP_TYPE_MISSING = 1110 : 1110 - XML_RNGP_TYPE_NOT_FOUND = 1111 : 1111 - XML_RNGP_TYPE_VALUE = 1112 : 1112 - XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 : 1113 - XML_RNGP_UNKNOWN_COMBINE = 1114 : 1114 - XML_RNGP_UNKNOWN_CONSTRUCT = 1115 : 1115 - XML_RNGP_UNKNOWN_TYPE_LIB = 1116 : 1116 - XML_RNGP_URI_FRAGMENT = 1117 : 1117 - XML_RNGP_URI_NOT_ABSOLUTE = 1118 : 1118 - XML_RNGP_VALUE_EMPTY = 1119 : 1119 - XML_RNGP_VALUE_NO_CONTENT = 1120 : 1120 - XML_RNGP_XMLNS_NAME = 1121 : 1121 - XML_RNGP_XML_NS = 1122 : 1122 - XML_XPATH_EXPRESSION_OK = 1200 - XML_XPATH_NUMBER_ERROR = 1201 : 1201 - XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 : 1202 - XML_XPATH_START_LITERAL_ERROR = 1203 : 1203 - XML_XPATH_VARIABLE_REF_ERROR = 1204 : 1204 - XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 : 1205 - XML_XPATH_INVALID_PREDICATE_ERROR = 1206 : 1206 - XML_XPATH_EXPR_ERROR = 1207 : 1207 - XML_XPATH_UNCLOSED_ERROR = 1208 : 1208 - XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 : 1209 - XML_XPATH_INVALID_OPERAND = 1210 : 1210 - XML_XPATH_INVALID_TYPE = 1211 : 1211 - XML_XPATH_INVALID_ARITY = 1212 : 1212 - XML_XPATH_INVALID_CTXT_SIZE = 1213 : 1213 - XML_XPATH_INVALID_CTXT_POSITION = 1214 : 1214 - XML_XPATH_MEMORY_ERROR = 1215 : 1215 - XML_XPTR_SYNTAX_ERROR = 1216 : 1216 - XML_XPTR_RESOURCE_ERROR = 1217 : 1217 - XML_XPTR_SUB_RESOURCE_ERROR = 1218 : 1218 - XML_XPATH_UNDEF_PREFIX_ERROR = 1219 : 1219 - XML_XPATH_ENCODING_ERROR = 1220 : 1220 - XML_XPATH_INVALID_CHAR_ERROR = 1221 : 1221 - XML_TREE_INVALID_HEX = 1300 - XML_TREE_INVALID_DEC = 1301 : 1301 - XML_TREE_UNTERMINATED_ENTITY = 1302 : 1302 - XML_SAVE_NOT_UTF8 = 1400 - XML_SAVE_CHAR_INVALID = 1401 : 1401 - XML_SAVE_NO_DOCTYPE = 1402 : 1402 - XML_SAVE_UNKNOWN_ENCODING = 1403 : 1403 - XML_REGEXP_COMPILE_ERROR = 1450 - XML_IO_UNKNOWN = 1500 - XML_IO_EACCES = 1501 : 1501 - XML_IO_EAGAIN = 1502 : 1502 - XML_IO_EBADF = 1503 : 1503 - XML_IO_EBADMSG = 1504 : 1504 - XML_IO_EBUSY = 1505 : 1505 - XML_IO_ECANCELED = 1506 : 1506 - XML_IO_ECHILD = 1507 : 1507 - XML_IO_EDEADLK = 1508 : 1508 - XML_IO_EDOM = 1509 : 1509 - XML_IO_EEXIST = 1510 : 1510 - XML_IO_EFAULT = 1511 : 1511 - XML_IO_EFBIG = 1512 : 1512 - XML_IO_EINPROGRESS = 1513 : 1513 - XML_IO_EINTR = 1514 : 1514 - XML_IO_EINVAL = 1515 : 1515 - XML_IO_EIO = 1516 : 1516 - XML_IO_EISDIR = 1517 : 1517 - XML_IO_EMFILE = 1518 : 1518 - XML_IO_EMLINK = 1519 : 1519 - XML_IO_EMSGSIZE = 1520 : 1520 - XML_IO_ENAMETOOLONG = 1521 : 1521 - XML_IO_ENFILE = 1522 : 1522 - XML_IO_ENODEV = 1523 : 1523 - XML_IO_ENOENT = 1524 : 1524 - XML_IO_ENOEXEC = 1525 : 1525 - XML_IO_ENOLCK = 1526 : 1526 - XML_IO_ENOMEM = 1527 : 1527 - XML_IO_ENOSPC = 1528 : 1528 - XML_IO_ENOSYS = 1529 : 1529 - XML_IO_ENOTDIR = 1530 : 1530 - XML_IO_ENOTEMPTY = 1531 : 1531 - XML_IO_ENOTSUP = 1532 : 1532 - XML_IO_ENOTTY = 1533 : 1533 - XML_IO_ENXIO = 1534 : 1534 - XML_IO_EPERM = 1535 : 1535 - XML_IO_EPIPE = 1536 : 1536 - XML_IO_ERANGE = 1537 : 1537 - XML_IO_EROFS = 1538 : 1538 - XML_IO_ESPIPE = 1539 : 1539 - XML_IO_ESRCH = 1540 : 1540 - XML_IO_ETIMEDOUT = 1541 : 1541 - XML_IO_EXDEV = 1542 : 1542 - XML_IO_NETWORK_ATTEMPT = 1543 : 1543 - XML_IO_ENCODER = 1544 : 1544 - XML_IO_FLUSH = 1545 : 1545 - XML_IO_WRITE = 1546 : 1546 - XML_IO_NO_INPUT = 1547 : 1547 - XML_IO_BUFFER_FULL = 1548 : 1548 - XML_IO_LOAD_ERROR = 1549 : 1549 - XML_IO_ENOTSOCK = 1550 : 1550 - XML_IO_EISCONN = 1551 : 1551 - XML_IO_ECONNREFUSED = 1552 : 1552 - XML_IO_ENETUNREACH = 1553 : 1553 - XML_IO_EADDRINUSE = 1554 : 1554 - XML_IO_EALREADY = 1555 : 1555 - XML_IO_EAFNOSUPPORT = 1556 : 1556 - XML_XINCLUDE_RECURSION = 1600 - XML_XINCLUDE_PARSE_VALUE = 1601 : 1601 - XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 : 1602 - XML_XINCLUDE_NO_HREF = 1603 : 1603 - XML_XINCLUDE_NO_FALLBACK = 1604 : 1604 - XML_XINCLUDE_HREF_URI = 1605 : 1605 - XML_XINCLUDE_TEXT_FRAGMENT = 1606 : 1606 - XML_XINCLUDE_TEXT_DOCUMENT = 1607 : 1607 - XML_XINCLUDE_INVALID_CHAR = 1608 : 1608 - XML_XINCLUDE_BUILD_FAILED = 1609 : 1609 - XML_XINCLUDE_UNKNOWN_ENCODING = 1610 : 1610 - XML_XINCLUDE_MULTIPLE_ROOT = 1611 : 1611 - XML_XINCLUDE_XPTR_FAILED = 1612 : 1612 - XML_XINCLUDE_XPTR_RESULT = 1613 : 1613 - XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 : 1614 - XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 : 1615 - XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 : 1616 - XML_XINCLUDE_DEPRECATED_NS = 1617 : 1617 - XML_XINCLUDE_FRAGMENT_ID = 1618 : 1618 - XML_CATALOG_MISSING_ATTR = 1650 - XML_CATALOG_ENTRY_BROKEN = 1651 : 1651 - XML_CATALOG_PREFER_VALUE = 1652 : 1652 - XML_CATALOG_NOT_CATALOG = 1653 : 1653 - XML_CATALOG_RECURSION = 1654 : 1654 - XML_SCHEMAP_PREFIX_UNDEFINED = 1700 - XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 : 1701 - XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 : 1702 - XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 : 1703 - XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 : 1704 - XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 : 1705 - XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 : 1706 - XML_SCHEMAP_EXTENSION_NO_BASE = 1707 : 1707 - XML_SCHEMAP_FACET_NO_VALUE = 1708 : 1708 - XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 : 1709 - XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 : 1710 - XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 : 1711 - XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 : 1712 - XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 : 1713 - XML_SCHEMAP_INVALID_BOOLEAN = 1714 : 1714 - XML_SCHEMAP_INVALID_ENUM = 1715 : 1715 - XML_SCHEMAP_INVALID_FACET = 1716 : 1716 - XML_SCHEMAP_INVALID_FACET_VALUE = 1717 : 1717 - XML_SCHEMAP_INVALID_MAXOCCURS = 1718 : 1718 - XML_SCHEMAP_INVALID_MINOCCURS = 1719 : 1719 - XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 : 1720 - XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 : 1721 - XML_SCHEMAP_NOATTR_NOREF = 1722 : 1722 - XML_SCHEMAP_NOTATION_NO_NAME = 1723 : 1723 - XML_SCHEMAP_NOTYPE_NOREF = 1724 : 1724 - XML_SCHEMAP_REF_AND_SUBTYPE = 1725 : 1725 - XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 : 1726 - XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 : 1727 - XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 : 1728 - XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 : 1729 - XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 : 1730 - XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 : 1731 - XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 : 1732 - XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 : 1733 - XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 : 1734 - XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 : 1735 - XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 : 1736 - XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 : 1737 - XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 : 1738 - XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 : 1739 - XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 : 1740 - XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 : 1741 - XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 : 1742 - XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 : 1743 - XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 : 1744 - XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 : 1745 - XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 : 1746 - XML_SCHEMAP_UNKNOWN_REF = 1747 : 1747 - XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 : 1748 - XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 : 1749 - XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 : 1750 - XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 : 1751 - XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 : 1752 - XML_SCHEMAP_UNKNOWN_TYPE = 1753 : 1753 - XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 : 1754 - XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 : 1755 - XML_SCHEMAP_REGEXP_INVALID = 1756 : 1756 - XML_SCHEMAP_FAILED_LOAD = 1757 : 1757 - XML_SCHEMAP_NOTHING_TO_PARSE = 1758 : 1758 - XML_SCHEMAP_NOROOT = 1759 : 1759 - XML_SCHEMAP_REDEFINED_GROUP = 1760 : 1760 - XML_SCHEMAP_REDEFINED_TYPE = 1761 : 1761 - XML_SCHEMAP_REDEFINED_ELEMENT = 1762 : 1762 - XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 : 1763 - XML_SCHEMAP_REDEFINED_ATTR = 1764 : 1764 - XML_SCHEMAP_REDEFINED_NOTATION = 1765 : 1765 - XML_SCHEMAP_FAILED_PARSE = 1766 : 1766 - XML_SCHEMAP_UNKNOWN_PREFIX = 1767 : 1767 - XML_SCHEMAP_DEF_AND_PREFIX = 1768 : 1768 - XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 : 1769 - XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 : 1770 - XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 : 1771 - XML_SCHEMAP_NOT_SCHEMA = 1772 : 1772 - XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 : 1773 - XML_SCHEMAP_INVALID_ATTR_USE = 1774 : 1774 - XML_SCHEMAP_RECURSIVE = 1775 : 1775 - XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 : 1776 - XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 : 1777 - XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 : 1778 - XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 : 1779 - XML_SCHEMAP_INVALID_ATTR_NAME = 1780 : 1780 - XML_SCHEMAP_REF_AND_CONTENT = 1781 : 1781 - XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 : 1782 - XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 : 1783 - XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 : 1784 - XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 : 1785 - XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 : 1786 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 : 1787 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 : 1788 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 : 1789 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 : 1790 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 : 1791 - XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 : 1792 - XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 : 1793 - XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 : 1794 - XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 : 1795 - XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 : 1796 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 : 1797 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 : 1798 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 : 1799 - XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 : 1800 - XML_SCHEMAV_NOROOT = 1801 - XML_SCHEMAV_UNDECLAREDELEM = 1802 : 1802 - XML_SCHEMAV_NOTTOPLEVEL = 1803 : 1803 - XML_SCHEMAV_MISSING = 1804 : 1804 - XML_SCHEMAV_WRONGELEM = 1805 : 1805 - XML_SCHEMAV_NOTYPE = 1806 : 1806 - XML_SCHEMAV_NOROLLBACK = 1807 : 1807 - XML_SCHEMAV_ISABSTRACT = 1808 : 1808 - XML_SCHEMAV_NOTEMPTY = 1809 : 1809 - XML_SCHEMAV_ELEMCONT = 1810 : 1810 - XML_SCHEMAV_HAVEDEFAULT = 1811 : 1811 - XML_SCHEMAV_NOTNILLABLE = 1812 : 1812 - XML_SCHEMAV_EXTRACONTENT = 1813 : 1813 - XML_SCHEMAV_INVALIDATTR = 1814 : 1814 - XML_SCHEMAV_INVALIDELEM = 1815 : 1815 - XML_SCHEMAV_NOTDETERMINIST = 1816 : 1816 - XML_SCHEMAV_CONSTRUCT = 1817 : 1817 - XML_SCHEMAV_INTERNAL = 1818 : 1818 - XML_SCHEMAV_NOTSIMPLE = 1819 : 1819 - XML_SCHEMAV_ATTRUNKNOWN = 1820 : 1820 - XML_SCHEMAV_ATTRINVALID = 1821 : 1821 - XML_SCHEMAV_VALUE = 1822 : 1822 - XML_SCHEMAV_FACET = 1823 : 1823 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 : 1824 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 : 1825 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 : 1826 - XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 : 1827 - XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 : 1828 - XML_SCHEMAV_CVC_FACET_VALID = 1829 : 1829 - XML_SCHEMAV_CVC_LENGTH_VALID = 1830 : 1830 - XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 : 1831 - XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 : 1832 - XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 : 1833 - XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 : 1834 - XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 : 1835 - XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 : 1836 - XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 : 1837 - XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 : 1838 - XML_SCHEMAV_CVC_PATTERN_VALID = 1839 : 1839 - XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 : 1840 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 : 1841 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 : 1842 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 : 1843 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 : 1844 - XML_SCHEMAV_CVC_ELT_1 = 1845 : 1845 - XML_SCHEMAV_CVC_ELT_2 = 1846 : 1846 - XML_SCHEMAV_CVC_ELT_3_1 = 1847 : 1847 - XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 : 1848 - XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 : 1849 - XML_SCHEMAV_CVC_ELT_4_1 = 1850 : 1850 - XML_SCHEMAV_CVC_ELT_4_2 = 1851 : 1851 - XML_SCHEMAV_CVC_ELT_4_3 = 1852 : 1852 - XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 : 1853 - XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 : 1854 - XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 : 1855 - XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 : 1856 - XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 : 1857 - XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 : 1858 - XML_SCHEMAV_CVC_ELT_6 = 1859 : 1859 - XML_SCHEMAV_CVC_ELT_7 = 1860 : 1860 - XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 : 1861 - XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 : 1862 - XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 : 1863 - XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 : 1864 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 : 1865 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 : 1866 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 : 1867 - XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 : 1868 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 : 1869 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 : 1870 - XML_SCHEMAV_ELEMENT_CONTENT = 1871 : 1871 - XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 : 1872 - XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 : 1873 - XML_SCHEMAV_CVC_AU = 1874 : 1874 - XML_SCHEMAV_CVC_TYPE_1 = 1875 : 1875 - XML_SCHEMAV_CVC_TYPE_2 = 1876 : 1876 - XML_SCHEMAV_CVC_IDC = 1877 : 1877 - XML_SCHEMAV_CVC_WILDCARD = 1878 : 1878 - XML_XPTR_UNKNOWN_SCHEME = 1900 - XML_XPTR_CHILDSEQ_START = 1901 : 1901 - XML_XPTR_EVAL_FAILED = 1902 : 1902 - XML_XPTR_EXTRA_OBJECTS = 1903 : 1903 - XML_C14N_CREATE_CTXT = 1950 - XML_C14N_REQUIRES_UTF8 = 1951 : 1951 - XML_C14N_CREATE_STACK = 1952 : 1952 - XML_C14N_INVALID_NODE = 1953 : 1953 - XML_C14N_UNKNOW_NODE = 1954 : 1954 - XML_C14N_RELATIVE_NAMESPACE = 1955 : 1955 - XML_FTP_PASV_ANSWER = 2000 - XML_FTP_EPSV_ANSWER = 2001 : 2001 - XML_FTP_ACCNT = 2002 : 2002 - XML_FTP_URL_SYNTAX = 2003 : 2003 - XML_HTTP_URL_SYNTAX = 2020 - XML_HTTP_USE_IP = 2021 : 2021 - XML_HTTP_UNKNOWN_HOST = 2022 : 2022 - XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 - XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 : 3001 - XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 : 3002 - XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 : 3003 - XML_SCHEMAP_SRC_RESOLVE = 3004 : 3004 - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 : 3005 - XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 : 3006 - XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 : 3007 - XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 : 3008 - XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 : 3009 - XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 : 3010 - XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 : 3011 - XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 : 3012 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 : 3013 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 : 3014 - XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 : 3015 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 : 3016 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 : 3017 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 : 3018 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 : 3019 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 : 3020 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 : 3021 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 : 3022 - XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 : 3023 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 : 3024 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 : 3025 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 : 3026 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 : 3027 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 : 3028 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 : 3029 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 : 3030 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 : 3031 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 : 3032 - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 : 3033 - XML_SCHEMAP_S4S_ELEM_MISSING = 3034 : 3034 - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 : 3035 - XML_SCHEMAP_S4S_ATTR_MISSING = 3036 : 3036 - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 : 3037 - XML_SCHEMAP_SRC_ELEMENT_1 = 3038 : 3038 - XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 : 3039 - XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 : 3040 - XML_SCHEMAP_SRC_ELEMENT_3 = 3041 : 3041 - XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 : 3042 - XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 : 3043 - XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 : 3044 - XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 : 3045 - XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 : 3046 - XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 : 3047 - XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 : 3048 - XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 : 3049 - XML_SCHEMAP_SRC_INCLUDE = 3050 : 3050 - XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 : 3051 - XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 : 3052 - XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 : 3053 - XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 : 3054 - XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 : 3055 - XML_SCHEMAP_NO_XMLNS = 3056 : 3056 - XML_SCHEMAP_NO_XSI = 3057 : 3057 - XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 : 3058 - XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 : 3059 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 : 3060 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 : 3061 - XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 : 3062 - XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 : 3063 - XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 : 3064 - XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 : 3065 - XML_SCHEMAP_SRC_IMPORT_2 = 3066 : 3066 - XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 : 3067 - XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 : 3068 - XML_SCHEMAP_INTERNAL = 3069 : 3069 non-W3C - XML_SCHEMAP_NOT_DETERMINISTIC = 3070 : 3070 non-W3C - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 : 3071 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 : 3072 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 : 3073 - XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 : 3074 - XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 : 3075 - XML_SCHEMAP_SRC_CT_1 = 3076 : 3076 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 : 3077 - XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 : 3078 - XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 : 3079 - XML_SCHEMAP_C_PROPS_CORRECT = 3080 : 3080 - XML_SCHEMAP_SRC_REDEFINE = 3081 : 3081 - XML_SCHEMAP_SRC_IMPORT = 3082 : 3082 - XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 : 3083 - XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 : 3084 - XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 : 3085 - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 : 3085 - XML_SCHEMAP_AG_PROPS_CORRECT = 3087 : 3086 - XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 : 3087 - XML_SCHEMAP_AU_PROPS_CORRECT = 3089 : 3088 - XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 : 3089 - XML_SCHEMAP_COS_ALL_LIMITED = 3091 : 3090 - XML_MODULE_OPEN = 4900 : 4900 - XML_MODULE_CLOSE = 4901 : 4901 - XML_CHECK_FOUND_ELEMENT = 5000 - XML_CHECK_FOUND_ATTRIBUTE = 5001 : 5001 - XML_CHECK_FOUND_TEXT = 5002 : 5002 - XML_CHECK_FOUND_CDATA = 5003 : 5003 - XML_CHECK_FOUND_ENTITYREF = 5004 : 5004 - XML_CHECK_FOUND_ENTITY = 5005 : 5005 - XML_CHECK_FOUND_PI = 5006 : 5006 - XML_CHECK_FOUND_COMMENT = 5007 : 5007 - XML_CHECK_FOUND_DOCTYPE = 5008 : 5008 - XML_CHECK_FOUND_FRAGMENT = 5009 : 5009 - XML_CHECK_FOUND_NOTATION = 5010 : 5010 - XML_CHECK_UNKNOWN_NODE = 5011 : 5011 - XML_CHECK_ENTITY_TYPE = 5012 : 5012 - XML_CHECK_NO_PARENT = 5013 : 5013 - XML_CHECK_NO_DOC = 5014 : 5014 - XML_CHECK_NO_NAME = 5015 : 5015 - XML_CHECK_NO_ELEM = 5016 : 5016 - XML_CHECK_WRONG_DOC = 5017 : 5017 - XML_CHECK_NO_PREV = 5018 : 5018 - XML_CHECK_WRONG_PREV = 5019 : 5019 - XML_CHECK_NO_NEXT = 5020 : 5020 - XML_CHECK_WRONG_NEXT = 5021 : 5021 - XML_CHECK_NOT_DTD = 5022 : 5022 - XML_CHECK_NOT_ATTR = 5023 : 5023 - XML_CHECK_NOT_ATTR_DECL = 5024 : 5024 - XML_CHECK_NOT_ELEM_DECL = 5025 : 5025 - XML_CHECK_NOT_ENTITY_DECL = 5026 : 5026 - XML_CHECK_NOT_NS_DECL = 5027 : 5027 - XML_CHECK_NO_HREF = 5028 : 5028 - XML_CHECK_WRONG_PARENT = 5029 : 5029 - XML_CHECK_NS_SCOPE = 5030 : 5030 - XML_CHECK_NS_ANCESTOR = 5031 : 5031 - XML_CHECK_NOT_UTF8 = 5032 : 5032 - XML_CHECK_NO_DICT = 5033 : 5033 - XML_CHECK_NOT_NCNAME = 5034 : 5034 - XML_CHECK_OUTSIDE_DICT = 5035 : 5035 - XML_CHECK_WRONG_NAME = 5036 : 5036 - XML_CHECK_NAME_NOT_NULL = 5037 : 5037 - XML_I18N_NO_NAME = 6000 - XML_I18N_NO_HANDLER = 6001 : 6001 - XML_I18N_EXCESS_HANDLER = 6002 : 6002 - XML_I18N_CONV_FAILED = 6003 : 6003 - XML_I18N_NO_OUTPUT = 6004 : 6004 - XML_CHECK_ = 6005 : 5033 - XML_CHECK_X = 6006 : 503 +__ERROR_TYPES = """\ +XML_ERR_OK = 0 +XML_ERR_INTERNAL_ERROR = 1 # 1 +XML_ERR_NO_MEMORY = 2 # 2 +XML_ERR_DOCUMENT_START = 3 # 3 +XML_ERR_DOCUMENT_EMPTY = 4 # 4 +XML_ERR_DOCUMENT_END = 5 # 5 +XML_ERR_INVALID_HEX_CHARREF = 6 # 6 +XML_ERR_INVALID_DEC_CHARREF = 7 # 7 +XML_ERR_INVALID_CHARREF = 8 # 8 +XML_ERR_INVALID_CHAR = 9 # 9 +XML_ERR_CHARREF_AT_EOF = 10 # 10 +XML_ERR_CHARREF_IN_PROLOG = 11 # 11 +XML_ERR_CHARREF_IN_EPILOG = 12 # 12 +XML_ERR_CHARREF_IN_DTD = 13 # 13 +XML_ERR_ENTITYREF_AT_EOF = 14 # 14 +XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 +XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 +XML_ERR_ENTITYREF_IN_DTD = 17 # 17 +XML_ERR_PEREF_AT_EOF = 18 # 18 +XML_ERR_PEREF_IN_PROLOG = 19 # 19 +XML_ERR_PEREF_IN_EPILOG = 20 # 20 +XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 +XML_ERR_ENTITYREF_NO_NAME = 22 # 22 +XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 +XML_ERR_PEREF_NO_NAME = 24 # 24 +XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 +XML_ERR_UNDECLARED_ENTITY = 26 # 26 +XML_WAR_UNDECLARED_ENTITY = 27 # 27 +XML_ERR_UNPARSED_ENTITY = 28 # 28 +XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 +""" + \ +"""\ +XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 +XML_ERR_UNKNOWN_ENCODING = 31 # 31 +XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 +XML_ERR_STRING_NOT_STARTED = 33 # 33 +XML_ERR_STRING_NOT_CLOSED = 34 # 34 +XML_ERR_NS_DECL_ERROR = 35 # 35 +XML_ERR_ENTITY_NOT_STARTED = 36 # 36 +XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 +XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 +XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 +XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 +XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 +XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 +XML_ERR_LITERAL_NOT_STARTED = 43 # 43 +XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 +XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 +XML_ERR_PI_NOT_STARTED = 46 # 46 +XML_ERR_PI_NOT_FINISHED = 47 # 47 +XML_ERR_NOTATION_NOT_STARTED = 48 # 48 +XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 +XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 +XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 +XML_ERR_MIXED_NOT_STARTED = 52 # 52 +XML_ERR_MIXED_NOT_FINISHED = 53 # 53 +XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 +XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 +XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 +XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 +XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 +XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 +""" + \ +"""\ +XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 +XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 +XML_ERR_MISPLACED_CDATA_END = 62 # 62 +XML_ERR_CDATA_NOT_FINISHED = 63 # 63 +XML_ERR_RESERVED_XML_NAME = 64 # 64 +XML_ERR_SPACE_REQUIRED = 65 # 65 +XML_ERR_SEPARATOR_REQUIRED = 66 # 66 +XML_ERR_NMTOKEN_REQUIRED = 67 # 67 +XML_ERR_NAME_REQUIRED = 68 # 68 +XML_ERR_PCDATA_REQUIRED = 69 # 69 +XML_ERR_URI_REQUIRED = 70 # 70 +XML_ERR_PUBID_REQUIRED = 71 # 71 +XML_ERR_LT_REQUIRED = 72 # 72 +XML_ERR_GT_REQUIRED = 73 # 73 +XML_ERR_LTSLASH_REQUIRED = 74 # 74 +XML_ERR_EQUAL_REQUIRED = 75 # 75 +XML_ERR_TAG_NAME_MISMATCH = 76 # 76 +XML_ERR_TAG_NOT_FINISHED = 77 # 77 +XML_ERR_STANDALONE_VALUE = 78 # 78 +XML_ERR_ENCODING_NAME = 79 # 79 +XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 +XML_ERR_INVALID_ENCODING = 81 # 81 +XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 +XML_ERR_CONDSEC_INVALID = 83 # 83 +XML_ERR_VALUE_REQUIRED = 84 # 84 +XML_ERR_NOT_WELL_BALANCED = 85 # 85 +XML_ERR_EXTRA_CONTENT = 86 # 86 +XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 +XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 +XML_ERR_ENTITY_LOOP = 89 # 89 +""" + \ +"""\ +XML_ERR_ENTITY_BOUNDARY = 90 # 90 +XML_ERR_INVALID_URI = 91 # 91 +XML_ERR_URI_FRAGMENT = 92 # 92 +XML_WAR_CATALOG_PI = 93 # 93 +XML_ERR_NO_DTD = 94 # 94 +XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 +XML_ERR_VERSION_MISSING = 96 # 96 +XML_WAR_UNKNOWN_VERSION = 97 # 97 +XML_WAR_LANG_VALUE = 98 # 98 +XML_WAR_NS_URI = 99 # 99 +XML_WAR_NS_URI_RELATIVE = 100 # 100 +XML_ERR_MISSING_ENCODING = 101 # 101 +XML_WAR_SPACE_VALUE = 102 # 102 +XML_ERR_NOT_STANDALONE = 103 # 103 +XML_ERR_ENTITY_PROCESSING = 104 # 104 +XML_ERR_NOTATION_PROCESSING = 105 # 105 +XML_WAR_NS_COLUMN = 106 # 106 +XML_WAR_ENTITY_REDEFINED = 107 # 107 +XML_NS_ERR_XML_NAMESPACE = 200 +XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 +XML_NS_ERR_QNAME = 202 # 202 +XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 +XML_NS_ERR_EMPTY = 204 # 204 +XML_DTD_ATTRIBUTE_DEFAULT = 500 +XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 +XML_DTD_ATTRIBUTE_VALUE = 502 # 502 +XML_DTD_CONTENT_ERROR = 503 # 503 +XML_DTD_CONTENT_MODEL = 504 # 504 +XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 +XML_DTD_DIFFERENT_PREFIX = 506 # 506 +""" + \ +"""\ +XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 +XML_DTD_ELEM_NAMESPACE = 508 # 508 +XML_DTD_ELEM_REDEFINED = 509 # 509 +XML_DTD_EMPTY_NOTATION = 510 # 510 +XML_DTD_ENTITY_TYPE = 511 # 511 +XML_DTD_ID_FIXED = 512 # 512 +XML_DTD_ID_REDEFINED = 513 # 513 +XML_DTD_ID_SUBSET = 514 # 514 +XML_DTD_INVALID_CHILD = 515 # 515 +XML_DTD_INVALID_DEFAULT = 516 # 516 +XML_DTD_LOAD_ERROR = 517 # 517 +XML_DTD_MISSING_ATTRIBUTE = 518 # 518 +XML_DTD_MIXED_CORRUPT = 519 # 519 +XML_DTD_MULTIPLE_ID = 520 # 520 +XML_DTD_NO_DOC = 521 # 521 +XML_DTD_NO_DTD = 522 # 522 +XML_DTD_NO_ELEM_NAME = 523 # 523 +XML_DTD_NO_PREFIX = 524 # 524 +XML_DTD_NO_ROOT = 525 # 525 +XML_DTD_NOTATION_REDEFINED = 526 # 526 +XML_DTD_NOTATION_VALUE = 527 # 527 +XML_DTD_NOT_EMPTY = 528 # 528 +XML_DTD_NOT_PCDATA = 529 # 529 +XML_DTD_NOT_STANDALONE = 530 # 530 +XML_DTD_ROOT_NAME = 531 # 531 +XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 +XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 +XML_DTD_UNKNOWN_ELEM = 534 # 534 +XML_DTD_UNKNOWN_ENTITY = 535 # 535 +""" + \ +"""\ +XML_DTD_UNKNOWN_ID = 536 # 536 +XML_DTD_UNKNOWN_NOTATION = 537 # 537 +XML_DTD_STANDALONE_DEFAULTED = 538 # 538 +XML_DTD_XMLID_VALUE = 539 # 539 +XML_DTD_XMLID_TYPE = 540 # 540 +XML_HTML_STRUCURE_ERROR = 800 +XML_HTML_UNKNOWN_TAG = 801 # 801 +XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 +XML_RNGP_ATTR_CONFLICT = 1001 # 1001 +XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 +XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 +XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 +XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 +XML_RNGP_CHOICE_CONTENT = 1006 # 1006 +XML_RNGP_CHOICE_EMPTY = 1007 # 1007 +XML_RNGP_CREATE_FAILURE = 1008 # 1008 +XML_RNGP_DATA_CONTENT = 1009 # 1009 +XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 +XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 +XML_RNGP_DEFINE_EMPTY = 1012 # 1012 +XML_RNGP_DEFINE_MISSING = 1013 # 1013 +XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 +XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 +XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 +XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 +XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 +XML_RNGP_ELEMENT_NAME = 1019 # 1019 +XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 +XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 +""" + \ +"""\ +XML_RNGP_EMPTY = 1022 # 1022 +XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 +XML_RNGP_EMPTY_CONTENT = 1024 # 1024 +XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 +XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 +XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 +XML_RNGP_EXCEPT_MISSING = 1028 # 1028 +XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 +XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 +XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 +XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 +XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 +XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 +XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 +XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 +XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 +XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 +XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 +XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 +XML_RNGP_HREF_ERROR = 1041 # 1041 +XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 +XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 +XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 +XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 +XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 +XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 +XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 +XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 +XML_RNGP_INVALID_URI = 1050 # 1050 +""" + \ +"""\ +XML_RNGP_INVALID_VALUE = 1051 # 1051 +XML_RNGP_MISSING_HREF = 1052 # 1052 +XML_RNGP_NAME_MISSING = 1053 # 1053 +XML_RNGP_NEED_COMBINE = 1054 # 1054 +XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 +XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 +XML_RNGP_NSNAME_NO_NS = 1057 # 1057 +XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 +XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 +XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 +XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 +XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 +XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 +XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 +XML_RNGP_PARSE_ERROR = 1065 # 1065 +XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 +XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 +XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 +XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 +XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 +XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 +XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 +XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 +XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 +XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 +XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 +XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 +XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 +XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 +""" + \ +"""\ +XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 +XML_RNGP_PAT_LIST_LIST = 1081 # 1081 +XML_RNGP_PAT_LIST_REF = 1082 # 1082 +XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 +XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 +XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 +XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 +XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 +XML_RNGP_PAT_START_ATTR = 1088 # 1088 +XML_RNGP_PAT_START_DATA = 1089 # 1089 +XML_RNGP_PAT_START_EMPTY = 1090 # 1090 +XML_RNGP_PAT_START_GROUP = 1091 # 1091 +XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 +XML_RNGP_PAT_START_LIST = 1093 # 1093 +XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 +XML_RNGP_PAT_START_TEXT = 1095 # 1095 +XML_RNGP_PAT_START_VALUE = 1096 # 1096 +XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 +XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 +XML_RNGP_REF_CYCLE = 1099 # 1099 +XML_RNGP_REF_NAME_INVALID = 1100 # 1100 +XML_RNGP_REF_NO_DEF = 1101 # 1101 +XML_RNGP_REF_NO_NAME = 1102 # 1102 +XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 +XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 +XML_RNGP_START_CONTENT = 1105 # 1105 +XML_RNGP_START_EMPTY = 1106 # 1106 +XML_RNGP_START_MISSING = 1107 # 1107 +XML_RNGP_TEXT_EXPECTED = 1108 # 1108 +""" + \ +"""\ +XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 +XML_RNGP_TYPE_MISSING = 1110 # 1110 +XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 +XML_RNGP_TYPE_VALUE = 1112 # 1112 +XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 +XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 +XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 +XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 +XML_RNGP_URI_FRAGMENT = 1117 # 1117 +XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 +XML_RNGP_VALUE_EMPTY = 1119 # 1119 +XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 +XML_RNGP_XMLNS_NAME = 1121 # 1121 +XML_RNGP_XML_NS = 1122 # 1122 +XML_XPATH_EXPRESSION_OK = 1200 +XML_XPATH_NUMBER_ERROR = 1201 # 1201 +XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 +XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 +XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 +XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 +XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 +XML_XPATH_EXPR_ERROR = 1207 # 1207 +XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 +XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 +XML_XPATH_INVALID_OPERAND = 1210 # 1210 +XML_XPATH_INVALID_TYPE = 1211 # 1211 +XML_XPATH_INVALID_ARITY = 1212 # 1212 +XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 +XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 +""" + \ +"""\ +XML_XPATH_MEMORY_ERROR = 1215 # 1215 +XML_XPTR_SYNTAX_ERROR = 1216 # 1216 +XML_XPTR_RESOURCE_ERROR = 1217 # 1217 +XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 +XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 +XML_XPATH_ENCODING_ERROR = 1220 # 1220 +XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 +XML_TREE_INVALID_HEX = 1300 +XML_TREE_INVALID_DEC = 1301 # 1301 +XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 +XML_SAVE_NOT_UTF8 = 1400 +XML_SAVE_CHAR_INVALID = 1401 # 1401 +XML_SAVE_NO_DOCTYPE = 1402 # 1402 +XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 +XML_REGEXP_COMPILE_ERROR = 1450 +XML_IO_UNKNOWN = 1500 +XML_IO_EACCES = 1501 # 1501 +XML_IO_EAGAIN = 1502 # 1502 +XML_IO_EBADF = 1503 # 1503 +XML_IO_EBADMSG = 1504 # 1504 +XML_IO_EBUSY = 1505 # 1505 +XML_IO_ECANCELED = 1506 # 1506 +XML_IO_ECHILD = 1507 # 1507 +XML_IO_EDEADLK = 1508 # 1508 +XML_IO_EDOM = 1509 # 1509 +XML_IO_EEXIST = 1510 # 1510 +XML_IO_EFAULT = 1511 # 1511 +XML_IO_EFBIG = 1512 # 1512 +XML_IO_EINPROGRESS = 1513 # 1513 +""" + \ +"""\ +XML_IO_EINTR = 1514 # 1514 +XML_IO_EINVAL = 1515 # 1515 +XML_IO_EIO = 1516 # 1516 +XML_IO_EISDIR = 1517 # 1517 +XML_IO_EMFILE = 1518 # 1518 +XML_IO_EMLINK = 1519 # 1519 +XML_IO_EMSGSIZE = 1520 # 1520 +XML_IO_ENAMETOOLONG = 1521 # 1521 +XML_IO_ENFILE = 1522 # 1522 +XML_IO_ENODEV = 1523 # 1523 +XML_IO_ENOENT = 1524 # 1524 +XML_IO_ENOEXEC = 1525 # 1525 +XML_IO_ENOLCK = 1526 # 1526 +XML_IO_ENOMEM = 1527 # 1527 +XML_IO_ENOSPC = 1528 # 1528 +XML_IO_ENOSYS = 1529 # 1529 +XML_IO_ENOTDIR = 1530 # 1530 +XML_IO_ENOTEMPTY = 1531 # 1531 +XML_IO_ENOTSUP = 1532 # 1532 +XML_IO_ENOTTY = 1533 # 1533 +XML_IO_ENXIO = 1534 # 1534 +XML_IO_EPERM = 1535 # 1535 +XML_IO_EPIPE = 1536 # 1536 +XML_IO_ERANGE = 1537 # 1537 +XML_IO_EROFS = 1538 # 1538 +XML_IO_ESPIPE = 1539 # 1539 +XML_IO_ESRCH = 1540 # 1540 +XML_IO_ETIMEDOUT = 1541 # 1541 +XML_IO_EXDEV = 1542 # 1542 +""" + \ +"""\ +XML_IO_NETWORK_ATTEMPT = 1543 # 1543 +XML_IO_ENCODER = 1544 # 1544 +XML_IO_FLUSH = 1545 # 1545 +XML_IO_WRITE = 1546 # 1546 +XML_IO_NO_INPUT = 1547 # 1547 +XML_IO_BUFFER_FULL = 1548 # 1548 +XML_IO_LOAD_ERROR = 1549 # 1549 +XML_IO_ENOTSOCK = 1550 # 1550 +XML_IO_EISCONN = 1551 # 1551 +XML_IO_ECONNREFUSED = 1552 # 1552 +XML_IO_ENETUNREACH = 1553 # 1553 +XML_IO_EADDRINUSE = 1554 # 1554 +XML_IO_EALREADY = 1555 # 1555 +XML_IO_EAFNOSUPPORT = 1556 # 1556 +XML_XINCLUDE_RECURSION = 1600 +XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 +XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 +XML_XINCLUDE_NO_HREF = 1603 # 1603 +XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 +XML_XINCLUDE_HREF_URI = 1605 # 1605 +XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 +XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 +XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 +XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 +XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 +XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 +XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 +XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 +XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 +""" + \ +"""\ +XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 +XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 +XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 +XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 +XML_CATALOG_MISSING_ATTR = 1650 +XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 +XML_CATALOG_PREFER_VALUE = 1652 # 1652 +XML_CATALOG_NOT_CATALOG = 1653 # 1653 +XML_CATALOG_RECURSION = 1654 # 1654 +XML_SCHEMAP_PREFIX_UNDEFINED = 1700 +XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 +XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 +XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 +XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 +XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 +XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 +XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 +XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 +XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 +XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 +XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 +XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 +XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 +XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 +XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 +XML_SCHEMAP_INVALID_FACET = 1716 # 1716 +XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 +XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 +XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 +""" + \ +"""\ +XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 +XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 +XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 +XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 +XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 +XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 +XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 +XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 +XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 +XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 +XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 +XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 +XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 +XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 +XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 +XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 +XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 +XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 +XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 +XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 +XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 +XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 +XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 +XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 +XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 +XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 +XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 +XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 +XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 +""" + \ +"""\ +XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 +XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 +XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 +XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 +XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 +XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 +XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 +XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 +XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 +XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 +XML_SCHEMAP_NOROOT = 1759 # 1759 +XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 +XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 +XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 +XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 +XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 +XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 +XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 +XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 +XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 +XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 +XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 +XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 +XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 +XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 +XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 +XML_SCHEMAP_RECURSIVE = 1775 # 1775 +XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 +XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 +""" + \ +"""\ +XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 +XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 +XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 +XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 +XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 +XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 +XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 +XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 +XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 +XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 +XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 +XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 +XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 +XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 +XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 +XML_SCHEMAV_NOROOT = 1801 +XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 +XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 +XML_SCHEMAV_MISSING = 1804 # 1804 +XML_SCHEMAV_WRONGELEM = 1805 # 1805 +XML_SCHEMAV_NOTYPE = 1806 # 1806 +""" + \ +"""\ +XML_SCHEMAV_NOROLLBACK = 1807 # 1807 +XML_SCHEMAV_ISABSTRACT = 1808 # 1808 +XML_SCHEMAV_NOTEMPTY = 1809 # 1809 +XML_SCHEMAV_ELEMCONT = 1810 # 1810 +XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 +XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 +XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 +XML_SCHEMAV_INVALIDATTR = 1814 # 1814 +XML_SCHEMAV_INVALIDELEM = 1815 # 1815 +XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 +XML_SCHEMAV_CONSTRUCT = 1817 # 1817 +XML_SCHEMAV_INTERNAL = 1818 # 1818 +XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 +XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 +XML_SCHEMAV_ATTRINVALID = 1821 # 1821 +XML_SCHEMAV_VALUE = 1822 # 1822 +XML_SCHEMAV_FACET = 1823 # 1823 +XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 +XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 +XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 +XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 +XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 +XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 +XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 +XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 +XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 +XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 +XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 +XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 +""" + \ +"""\ +XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 +XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 +XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 +XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 +XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 +XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 +XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 +XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 +XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 +XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 +XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 +XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 +XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 +XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 +XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 +XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 +XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 +XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 +XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 +XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 +XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 +XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 +XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 +XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 +XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 +""" + \ +"""\ +XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 +XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 +XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 +XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 +XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 +XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 +XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 +XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 +XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 +XML_SCHEMAV_CVC_AU = 1874 # 1874 +XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 +XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 +XML_SCHEMAV_CVC_IDC = 1877 # 1877 +XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 +XML_XPTR_UNKNOWN_SCHEME = 1900 +XML_XPTR_CHILDSEQ_START = 1901 # 1901 +XML_XPTR_EVAL_FAILED = 1902 # 1902 +XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 +XML_C14N_CREATE_CTXT = 1950 +XML_C14N_REQUIRES_UTF8 = 1951 # 1951 +XML_C14N_CREATE_STACK = 1952 # 1952 +XML_C14N_INVALID_NODE = 1953 # 1953 +XML_C14N_UNKNOW_NODE = 1954 # 1954 +XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 +XML_FTP_PASV_ANSWER = 2000 +XML_FTP_EPSV_ANSWER = 2001 # 2001 +XML_FTP_ACCNT = 2002 # 2002 +XML_FTP_URL_SYNTAX = 2003 # 2003 +XML_HTTP_URL_SYNTAX = 2020 +""" + \ +"""\ +XML_HTTP_USE_IP = 2021 # 2021 +XML_HTTP_UNKNOWN_HOST = 2022 # 2022 +XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 +XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 +XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 +XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 +XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 +XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 +XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 +XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 +XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 +XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 +XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 +XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 +XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 +XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 +XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 +XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 +XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 +""" + \ +"""\ +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 +XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 +XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 +XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 +XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 +XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 +XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 +XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 +XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 +XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 +XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 +XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 +XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 +XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 +XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 +XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 +XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 +XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 +XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 +XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 +XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 +XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 +XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 +XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 +XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 +XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 +""" + \ +"""\ +XML_SCHEMAP_NO_XMLNS = 3056 # 3056 +XML_SCHEMAP_NO_XSI = 3057 # 3057 +XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 +XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 +XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 +XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 +XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 +XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 +XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 +XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 +XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 +XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 +XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 +XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C +XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C +XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 +XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 +XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 +XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 +XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 +XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 +XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 +XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 +XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 +XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 +XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 +XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 +XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 +""" + \ +"""\ +XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 +XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 +XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 +XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 +XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 +XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 +XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 +XML_MODULE_OPEN = 4900 # 4900 +XML_MODULE_CLOSE = 4901 # 4901 +XML_CHECK_FOUND_ELEMENT = 5000 +XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 +XML_CHECK_FOUND_TEXT = 5002 # 5002 +XML_CHECK_FOUND_CDATA = 5003 # 5003 +XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 +XML_CHECK_FOUND_ENTITY = 5005 # 5005 +XML_CHECK_FOUND_PI = 5006 # 5006 +XML_CHECK_FOUND_COMMENT = 5007 # 5007 +XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 +XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 +XML_CHECK_FOUND_NOTATION = 5010 # 5010 +XML_CHECK_UNKNOWN_NODE = 5011 # 5011 +XML_CHECK_ENTITY_TYPE = 5012 # 5012 +XML_CHECK_NO_PARENT = 5013 # 5013 +XML_CHECK_NO_DOC = 5014 # 5014 +XML_CHECK_NO_NAME = 5015 # 5015 +XML_CHECK_NO_ELEM = 5016 # 5016 +XML_CHECK_WRONG_DOC = 5017 # 5017 +XML_CHECK_NO_PREV = 5018 # 5018 +XML_CHECK_WRONG_PREV = 5019 # 5019 +""" + \ +"""\ +XML_CHECK_NO_NEXT = 5020 # 5020 +XML_CHECK_WRONG_NEXT = 5021 # 5021 +XML_CHECK_NOT_DTD = 5022 # 5022 +XML_CHECK_NOT_ATTR = 5023 # 5023 +XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 +XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 +XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 +XML_CHECK_NOT_NS_DECL = 5027 # 5027 +XML_CHECK_NO_HREF = 5028 # 5028 +XML_CHECK_WRONG_PARENT = 5029 # 5029 +XML_CHECK_NS_SCOPE = 5030 # 5030 +XML_CHECK_NS_ANCESTOR = 5031 # 5031 +XML_CHECK_NOT_UTF8 = 5032 # 5032 +XML_CHECK_NO_DICT = 5033 # 5033 +XML_CHECK_NOT_NCNAME = 5034 # 5034 +XML_CHECK_OUTSIDE_DICT = 5035 # 5035 +XML_CHECK_WRONG_NAME = 5036 # 5036 +XML_CHECK_NAME_NOT_NULL = 5037 # 5037 +XML_I18N_NO_NAME = 6000 +XML_I18N_NO_HANDLER = 6001 # 6001 +XML_I18N_EXCESS_HANDLER = 6002 # 6002 +XML_I18N_CONV_FAILED = 6003 # 6003 +XML_I18N_NO_OUTPUT = 6004 # 6004 +XML_CHECK_ = 6005 # 5033 +XML_CHECK_X = 6006 # 503 """ +# --- END: GENERATED CONSTANTS --- __initErrorConstants() Added: lxml/trunk/update-error-constants.py ============================================================================== --- (empty file) +++ lxml/trunk/update-error-constants.py Fri Jun 2 12:01:01 2006 @@ -0,0 +1,116 @@ +#!/usr/bin/env python + +import sys, os, os.path, re + +BUILD_SOURCE_FILE = os.path.join("src", "lxml", "xmlerror.pxi") +BUILD_DEF_FILE = os.path.join("src", "lxml", "xmlerror.pxd") + +if len(sys.argv) < 2 or sys.argv[1].lower() in ('-h', '--help'): + print "This script generates the constants in file", BUILD_SOURCE_FILE + print "Call as" + print sys.argv[0], "/path/to/libxml2-source-dir" + sys.exit(len(sys.argv) > 1) + +HTML_FILE = os.path.join(sys.argv[1], 'doc', 'html', 'libxml-xmlerror.html') + +sys.path.insert(0, 'src') +from lxml import etree + +ENUM_MAP = { + 'xmlErrorLevel' : '__ERROR_LEVELS', + 'xmlErrorDomain' : '__ERROR_DOMAINS', + 'xmlParserErrors' : '__ERROR_TYPES' + } + +ENUM_ORDER = ('xmlErrorLevel', 'xmlErrorDomain', 'xmlParserErrors') + +def split(lines): + lines = iter(lines) + pre = [] + for line in lines: + pre.append(line) + if line.startswith('#') and "BEGIN: GENERATED CONSTANTS" in line: + break + pre.append('') + for line in lines: + if line.startswith('#') and "END: GENERATED CONSTANTS" in line: + break + post = ['', line] + post.extend(lines) + post.append('') + return pre, post + +def regenerate_file(filename, result): + # read .pxi source file + f = open(filename, 'r') + pre, post = split(f) + f.close() + + # write .pxi source file + f = open(filename, 'w') + f.write(''.join(pre)) + f.write('\n'.join(result)) + f.write(''.join(post)) + f.close() + +def parse_enums(html_file): + PARSE_ENUM_NAME = re.compile('\s*enum\s+(\w+)\s*{', re.I).match + PARSE_ENUM_VALUE = re.compile('\s*=\s+([0-9]+)\s*(?::\s*(.*))?').match + tree = etree.parse(html_file) + xpath = etree.XPathEvaluator(tree, {'html' : 'http://www.w3.org/1999/xhtml'}) + + enum_dict = {} + enums = xpath.evaluate("//html:pre[@class = 'programlisting' and contains(text(), 'Enum') and html:a[@name]]") + for enum in enums: + enum_name = PARSE_ENUM_NAME(enum.text).group(1) + print "Found enum", enum_name + entries = [] + enum_dict[enum_name] = entries + for child in enum: + name = child.text + value, descr = PARSE_ENUM_VALUE(child.tail).groups() + entries.append((name, int(value), descr)) + return enum_dict + +enum_dict = parse_enums(HTML_FILE) + +# regenerate source files +pxi_result = [] +append_pxi = pxi_result.append +pxd_result = [] +append_pxd = pxd_result.append + +ctypedef_indent = ' '*4 +constant_indent = ' '*8 + +append_pxd('cdef extern from "libxml/xmlerror.h":') +for enum_name in ENUM_ORDER: + constants = enum_dict[enum_name] + pxi_name = ENUM_MAP[enum_name] + + append_pxd(ctypedef_indent + 'ctypedef enum %s:' % enum_name) + append_pxi('cdef object %s' % pxi_name) + append_pxi('%s = """\\' % pxi_name) + length = 0 + for name, val, descr in constants: + if descr: + line = "%-50s = %7d # %s" % (name, val, descr) + else: + line = "%-50s = %7d" % (name, val) + + append_pxd(constant_indent + line) + + if length + len(line) > 2000: # max string length in MSVC + append_pxi('""" + \\') + append_pxi('"""\\') + length = 0 + append_pxi(line) + length += len(line) + 1 + + append_pxd('') + append_pxi('"""') + append_pxi('') + +# write source files +regenerate_file(BUILD_SOURCE_FILE, pxi_result) +regenerate_file(BUILD_DEF_FILE, pxd_result) From scoder at codespeak.net Fri Jun 2 12:28:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 12:28:38 +0200 (CEST) Subject: [Lxml-checkins] r28083 - lxml/tag/lxml-1.0 Message-ID: <20060602102838.A555A10072@code0.codespeak.net> Author: scoder Date: Fri Jun 2 12:28:36 2006 New Revision: 28083 Added: lxml/tag/lxml-1.0/ - copied from r28058, lxml/trunk/ Log: release tag for 1.0 From scoder at codespeak.net Fri Jun 2 12:36:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 12:36:08 +0200 (CEST) Subject: [Lxml-checkins] r28084 - lxml/trunk Message-ID: <20060602103608.2DCEA10060@code0.codespeak.net> Author: scoder Date: Fri Jun 2 12:36:06 2006 New Revision: 28084 Modified: lxml/trunk/MANIFEST.in Log: explicitly include scripts in source distribution Modified: lxml/trunk/MANIFEST.in ============================================================================== --- lxml/trunk/MANIFEST.in (original) +++ lxml/trunk/MANIFEST.in Fri Jun 2 12:36:06 2006 @@ -1,4 +1,7 @@ -include setup.py MANIFEST.in version.txt +exclude *.py +include setup.py test.py selftest.py selftest2.py bench.py +include update-error-constants.py +include MANIFEST.in version.txt include CHANGES.txt CREDITS.txt INSTALL.txt LICENSES.txt README.txt TODO.txt recursive-include src *.pyx *.pxd *.pxi *.py etree.c etree.h recursive-include src/lxml/tests *.rng *.xslt *.xml From scoder at codespeak.net Fri Jun 2 12:46:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 12:46:10 +0200 (CEST) Subject: [Lxml-checkins] r28085 - lxml/trunk Message-ID: <20060602104610.362CD1006B@code0.codespeak.net> Author: scoder Date: Fri Jun 2 12:46:09 2006 New Revision: 28085 Modified: lxml/trunk/update-error-constants.py Log: changed cmd line of update-error-constants.py, check for HTML file before starting work Modified: lxml/trunk/update-error-constants.py ============================================================================== --- lxml/trunk/update-error-constants.py (original) +++ lxml/trunk/update-error-constants.py Fri Jun 2 12:46:09 2006 @@ -8,10 +8,11 @@ if len(sys.argv) < 2 or sys.argv[1].lower() in ('-h', '--help'): print "This script generates the constants in file", BUILD_SOURCE_FILE print "Call as" - print sys.argv[0], "/path/to/libxml2-source-dir" + print sys.argv[0], "/path/to/libxml2-doc-dir" sys.exit(len(sys.argv) > 1) -HTML_FILE = os.path.join(sys.argv[1], 'doc', 'html', 'libxml-xmlerror.html') +HTML_FILE = os.path.join(sys.argv[1], 'html', 'libxml-xmlerror.html') +os.stat(HTML_FILE) # raise an error if we can't find it sys.path.insert(0, 'src') from lxml import etree From scoder at codespeak.net Fri Jun 2 15:20:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 15:20:50 +0200 (CEST) Subject: [Lxml-checkins] r28098 - in lxml/trunk: . doc src/lxml src/lxml/tests Message-ID: <20060602132050.E8CE210036@code0.codespeak.net> Author: scoder Date: Fri Jun 2 15:20:45 2006 New Revision: 28098 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/compatibility.txt lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/tests/test_etree.py Log: Element.getnext(), Element.getprevious(), Element.itersiblings() Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 2 15:20:45 2006 @@ -1,6 +1,22 @@ lxml changelog ============== +current +======= + +Features added +-------------- + +* Element.itersiblings() iterates over the siblings of an element in either + direction + +* Element.getnext() and Element.getprevious() return the direct siblings of an + element + +Bugs fixed +---------- + + 1.0 (2006-06-01) ================ Modified: lxml/trunk/doc/compatibility.txt ============================================================================== --- lxml/trunk/doc/compatibility.txt (original) +++ lxml/trunk/doc/compatibility.txt Fri Jun 2 15:20:45 2006 @@ -121,5 +121,6 @@ faster than ElementTree. * etree allows navigation to the parent of a node by the ``getparent()`` - method. This is not possible in ElementTree as the underlying tree model - does not have this information. + method and to the siblings by calling ``getnext()`` and ``getprevious()``. + This is not possible in ElementTree as the underlying tree model does not + have this information. Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Fri Jun 2 15:20:45 2006 @@ -901,6 +901,7 @@ return self.attrib.items() def getchildren(self): + "Return a list with all children of this element." cdef xmlNode* c_node cdef _Document doc cdef int ret @@ -916,18 +917,47 @@ return result def getparent(self): + "Returns the parent of this element or None for the root element" cdef xmlNode* c_node c_node = self._c_node.parent if c_node is not NULL and _isElement(c_node): return _elementFactory(self._doc, c_node) return None + def getnext(self): + "Returns the following sibling of this element or None" + cdef xmlNode* c_node + c_node = _nextElement(self._c_node) + if c_node is not NULL: + return _elementFactory(self._doc, c_node) + return None + + def getprevious(self): + "Returns the preceding sibling of this element or None" + cdef xmlNode* c_node + c_node = _previousElement(self._c_node) + if c_node is not NULL: + return _elementFactory(self._doc, c_node) + return None + + def itersiblings(self, preceding=False): + """Iterate over the following or preceding siblings of this element, + determined by the 'preceding' keyword (defaults to False).""" + return SiblingsIterator(self, preceding) + def getroottree(self): """Return an ElementTree for the root node of the document that - contains this element.""" + contains this element. + + This is the same as following element.getparent() up the tree until it + returns None (for the root element) and then build an ElementTree for + the last parent that was returned.""" return _elementTreeFactory(self._doc, None) def getiterator(self, tag=None): + """Iterate over all elements in the subtree in document order (depth + first pre-order). Can be restricted to find only elements with a + specific tag or from a namespace.""" return ElementDepthFirstIterator(self, tag) def makeelement(self, _tag, attrib=None, nsmap=None, **_extra): @@ -1187,20 +1217,16 @@ ctypedef xmlNode* (*_node_to_node_function)(xmlNode*) -cdef class ElementChildIterator: +cdef class _ElementSiblingIterator: # we keep Python references here to control GC cdef _NodeBase _node cdef _node_to_node_function _next_element - def __init__(self, _NodeBase node, reversed=False): # Python ref! - cdef xmlNode* c_node - if reversed: - c_node = _findChildBackwards(node._c_node, 0) + def __init__(self, _NodeBase node, preceding=False): + self._node = node + if preceding: self._next_element = _previousElement else: - c_node = _findChildForwards(node._c_node, 0) self._next_element = _nextElement - if c_node is not NULL: - self._node = _elementFactory(node._doc, c_node) def __iter__(self): return self def __next__(self): @@ -1218,6 +1244,22 @@ self._node = _elementFactory(current_node._doc, c_node) return current_node +cdef class ElementChildIterator(_ElementSiblingIterator): + def __init__(self, _NodeBase node not None, reversed=False): + cdef xmlNode* c_node + if reversed: + c_node = _findChildBackwards(node._c_node, 0) + else: + c_node = _findChildForwards(node._c_node, 0) + if c_node is not NULL: + child = _elementFactory(node._doc, c_node) # Python ref! + _ElementSiblingIterator.__init__(self, child, reversed) + +cdef class SiblingsIterator(_ElementSiblingIterator): + def __init__(self, _NodeBase node not None, preceding=False): + _ElementSiblingIterator.__init__(self, node, preceding) + self.next() + cdef class ElementDepthFirstIterator: """Iterates over an element and its sub-elements in document order (depth first pre-order). Modified: lxml/trunk/src/lxml/tests/test_etree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_etree.py (original) +++ lxml/trunk/src/lxml/tests/test_etree.py Fri Jun 2 15:20:45 2006 @@ -292,6 +292,65 @@ a, d.getroottree().getroot()) + def test_getnext(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + self.assertEquals( + None, + a.getnext()) + self.assertEquals( + c, + b.getnext()) + self.assertEquals( + None, + c.getnext()) + + def test_getprevious(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + self.assertEquals( + None, + a.getprevious()) + self.assertEquals( + b, + c.getprevious()) + self.assertEquals( + None, + b.getprevious()) + + def test_itersiblings(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + self.assertEquals( + [], + list(a.itersiblings())) + self.assertEquals( + [c], + list(b.itersiblings())) + self.assertEquals( + [], + list(c.itersiblings())) + self.assertEquals( + [b], + list(c.itersiblings(preceding=True))) + self.assertEquals( + [], + list(b.itersiblings(preceding=True))) + def test_parseid(self): parseid = self.etree.parseid XML = self.etree.XML From scoder at codespeak.net Fri Jun 2 16:38:59 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 16:38:59 +0200 (CEST) Subject: [Lxml-checkins] r28107 - lxml/trunk/doc Message-ID: <20060602143859.11AE01006B@code0.codespeak.net> Author: scoder Date: Fri Jun 2 16:38:58 2006 New Revision: 28107 Modified: lxml/trunk/doc/api.txt Log: api.txt section and doctests on 'trees and documents' Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Fri Jun 2 16:38:58 2006 @@ -27,6 +27,62 @@ >>> from StringIO import StringIO +Trees and Documents +------------------- + +Compared to the original ElementTree API, lxml.etree has an extended tree +model. It knows about parents and siblings of elements:: + + >>> root = etree.Element("root") + >>> a = etree.SubElement(root, "a") + >>> b = etree.SubElement(root, "b") + >>> c = etree.SubElement(root, "c") + >>> d = etree.SubElement(root, "d") + >>> b.getparent() == root + True + >>> print b.getnext().tag + c + >>> print c.getprevious().tag + b + +You can also iterate over the siblings of an element:: + + >>> list(a.itersiblings()) == [b, c, d] + True + >>> list(c.itersiblings(preceding=True)) == [b, a] + True + +Elements always live within a document context in lxml. This implies that +there is also a notion of an absolute document root. You can retrieve an +ElementTree for the root node of a document from any of its elements:: + + >>> tree = d.getroottree() + >>> print tree.getroot().tag + root + +Note that this is different from wrapping an Element in an ElementTree. You +can use ElementTrees to create XML trees with an explicit root node:: + + >>> tree = etree.ElementTree(d) + >>> print tree.getroot().tag + d + >>> print etree.tostring(tree) + + +All operations that you run on such an ElementTree (like XPath, XSLT, etc.) +will understand the explicitly chosen root as root node of a document. They +will not see any elements outside the ElementTree. However, ElementTrees do +not modify their Elements:: + + >>> element = tree.getroot() + >>> print element.getparent().tag + root + +The rule is that all operations that are applied to Elements use either the +Element itself as reference point, or the absolute root of the document that +contains this Element. + + Parsers ------- From scoder at codespeak.net Fri Jun 2 16:48:15 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 16:48:15 +0200 (CEST) Subject: [Lxml-checkins] r28109 - lxml/trunk/doc Message-ID: <20060602144815.BC8701006B@code0.codespeak.net> Author: scoder Date: Fri Jun 2 16:48:14 2006 New Revision: 28109 Modified: lxml/trunk/doc/api.txt Log: updated doctest Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Fri Jun 2 16:48:14 2006 @@ -47,10 +47,10 @@ You can also iterate over the siblings of an element:: - >>> list(a.itersiblings()) == [b, c, d] - True - >>> list(c.itersiblings(preceding=True)) == [b, a] - True + >>> [ el.tag for el in a.itersiblings() ] + ['b', 'c', 'd'] + >>> [ el.tag for el in c.itersiblings(preceding=True) ] + ['b', 'a'] Elements always live within a document context in lxml. This implies that there is also a notion of an absolute document root. You can retrieve an From scoder at codespeak.net Fri Jun 2 18:50:23 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 2 Jun 2006 18:50:23 +0200 (CEST) Subject: [Lxml-checkins] r28118 - lxml/trunk Message-ID: <20060602165023.9F68210071@code0.codespeak.net> Author: scoder Date: Fri Jun 2 18:50:22 2006 New Revision: 28118 Modified: lxml/trunk/CHANGES.txt Log: small fix in docs Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 2 18:50:22 2006 @@ -23,8 +23,8 @@ Features added -------------- -See also the features added for lxml 1.0beta (below) to find out more about -what's new. +See also the features added for lxml 1.0beta to find out more about what's +new. * Element.getiterator() and the findall() methods support finding arbitrary elements from a namespace (pattern ``{namespace}*``) From scoder at codespeak.net Sat Jun 3 09:28:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 09:28:08 +0200 (CEST) Subject: [Lxml-checkins] r28126 - lxml/trunk/src/lxml Message-ID: <20060603072808.A13D11006B@code0.codespeak.net> Author: scoder Date: Sat Jun 3 09:28:05 2006 New Revision: 28126 Modified: lxml/trunk/src/lxml/etree.h lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/serializer.pxi lxml/trunk/src/lxml/xslt.pxi Log: helper macro _isString() to check object for (str or unicode) type Modified: lxml/trunk/src/lxml/etree.h ============================================================================== --- lxml/trunk/src/lxml/etree.h (original) +++ lxml/trunk/src/lxml/etree.h Sat Jun 3 09:28:05 2006 @@ -24,6 +24,8 @@ #define iter(o) PyObject_GetIter(o) #define _cstr(s) PyString_AS_STRING(s) +#define _isString(obj) PyObject_TypeCheck(obj, &PyBaseString_Type) + #define _isElement(c_node) \ ((c_node)->type == XML_ELEMENT_NODE || \ (c_node)->type == XML_COMMENT_NODE) Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sat Jun 3 09:28:05 2006 @@ -1,7 +1,7 @@ cimport tree, python from tree cimport xmlDoc, xmlNode, xmlAttr, xmlNs, _isElement from python cimport isinstance, issubclass, hasattr, callable -from python cimport iter, str, _cstr, Py_ssize_t +from python cimport iter, str, _cstr, _isString, Py_ssize_t cimport xpath cimport xinclude cimport c14n @@ -1439,8 +1439,7 @@ def __init__(self, text_or_uri, tag=None): if tag is not None: text_or_uri = "{%s}%s" % (text_or_uri, tag) - elif not python.PyString_Check(text_or_uri) and \ - not python.PyUnicode_Check(text_or_uri): + elif not _isString(text_or_uri): text_or_uri = str(text_or_uri) self.text = text_or_uri def __str__(self): Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sat Jun 3 09:28:05 2006 @@ -56,6 +56,7 @@ cdef void PyMem_Free(void* p) cdef extern from "etree.h": # redefines some functions as macros + cdef int _isString(object obj) cdef int isinstance(object instance, object classes) cdef int issubclass(object derived, object superclasses) cdef int hasattr(object obj, object attr) Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Sat Jun 3 09:28:05 2006 @@ -155,7 +155,7 @@ raise LookupError, python.PyString_FromFormat( "unknown encoding: '%s'", c_enc) - if python.PyString_Check(f) or python.PyUnicode_Check(f): + if _isString(f): filename = _utf8(f) c_buffer = tree.xmlOutputBufferCreateFilename( _cstr(filename), enchandler, 0) @@ -184,7 +184,7 @@ c_base_doc = element._c_node.doc c_doc = _fakeRootDoc(c_base_doc, element._c_node) try: - if python.PyString_Check(f) or python.PyUnicode_Check(f): + if _isString(f): filename = _utf8(f) bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, _cstr(filename), 0) Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sat Jun 3 09:28:05 2006 @@ -453,7 +453,7 @@ self._compile_map = {} cdef _make_string(self, value): - if python.PyString_Check(value) or python.PyUnicode_Check(value): + if _isString(value): return value else: raise TypeError, "Invalid argument type %s" % type(value) From scoder at codespeak.net Sat Jun 3 09:41:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 09:41:50 +0200 (CEST) Subject: [Lxml-checkins] r28127 - lxml/trunk Message-ID: <20060603074150.2FF2B1006B@code0.codespeak.net> Author: scoder Date: Sat Jun 3 09:41:48 2006 New Revision: 28127 Modified: lxml/trunk/CHANGES.txt Log: mark MSVC compile bug as fixed Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sat Jun 3 09:41:48 2006 @@ -16,6 +16,8 @@ Bugs fixed ---------- +* MSVC compiler complained about long strings (supports only 2048 bytes) + 1.0 (2006-06-01) ================ From scoder at codespeak.net Sat Jun 3 10:17:48 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 10:17:48 +0200 (CEST) Subject: [Lxml-checkins] r28129 - in lxml/trunk: . src/lxml Message-ID: <20060603081748.C92181006B@code0.codespeak.net> Author: scoder Date: Sat Jun 3 10:17:40 2006 New Revision: 28129 Modified: lxml/trunk/src/lxml/xmlerror.pxd lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/update-error-constants.py Log: store error constant strings in tuples instead of using string concatenation (simplifies setup code), add comment from generator script Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Sat Jun 3 10:17:40 2006 @@ -1,5 +1,12 @@ # --- BEGIN: GENERATED CONSTANTS --- + +# This section is generated by the script 'update-error-constants.py'. +# +# Constants are stored in tuples of strings, for which Pyrex generates very +# efficient setup code. To parse them, iterate over the tuples and parse each +# line in each string independently. + cdef extern from "libxml/xmlerror.h": ctypedef enum xmlErrorLevel: XML_ERR_NONE = 0 Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Sat Jun 3 10:17:40 2006 @@ -382,20 +382,23 @@ ################################################################################ cdef void __initErrorConstants(): + "Called at setup time to parse the constants and build the classes below." find_constants = re.compile(r"\s*([a-zA-Z0-9_]+)\s*=\s*([0-9]+)").findall - for cls, constants, prefix in [(ErrorLevels, __ERROR_LEVELS, 'XML_ERR_'), - (ErrorDomains, __ERROR_DOMAINS, 'XML_FROM_'), - (ErrorTypes, __ERROR_TYPES, 'XML_')]: + const_defs = ((ErrorLevels, __ERROR_LEVELS, 'XML_ERR_'), + (ErrorDomains, __ERROR_DOMAINS, 'XML_FROM_'), + (ErrorTypes, __ERROR_TYPES, 'XML_')) + for cls, constant_tuple, prefix in const_defs: prefix_len = len(prefix) reverse_dict = {} cls._names = reverse_dict cls._getName = reverse_dict.get - for name, value in find_constants(constants): - if name[:prefix_len] == prefix and len(name) > prefix_len: - name = name[prefix_len:] - value = int(value) - python.PyObject_SetAttr(cls, name, value) - python.PyDict_SetItem(reverse_dict, value, name) + for constants in constant_tuple: + for name, value in find_constants(constants): + if name[:prefix_len] == prefix and len(name) > prefix_len: + name = name[prefix_len:] + value = int(value) + python.PyObject_SetAttr(cls, name, value) + python.PyDict_SetItem(reverse_dict, value, name) class ErrorLevels: "Libxml2 error levels" @@ -407,16 +410,23 @@ "Libxml2 error types" # --- BEGIN: GENERATED CONSTANTS --- + +# This section is generated by the script 'update-error-constants.py'. +# +# Constants are stored in tuples of strings, for which Pyrex generates very +# efficient setup code. To parse them, iterate over the tuples and parse each +# line in each string independently. + cdef object __ERROR_LEVELS -__ERROR_LEVELS = """\ +__ERROR_LEVELS = ("""\ XML_ERR_NONE = 0 XML_ERR_WARNING = 1 # A simple warning XML_ERR_ERROR = 2 # A recoverable error XML_ERR_FATAL = 3 # A fatal error -""" +""",) cdef object __ERROR_DOMAINS -__ERROR_DOMAINS = """\ +__ERROR_DOMAINS = ("""\ XML_FROM_NONE = 0 XML_FROM_PARSER = 1 # The XML parser XML_FROM_TREE = 2 # The tree module @@ -440,17 +450,17 @@ XML_FROM_CATALOG = 20 # The Catalog module XML_FROM_C14N = 21 # The Canonicalization module XML_FROM_XSLT = 22 # The XSLT engine from libxslt -""" + \ +""", """\ XML_FROM_VALID = 23 # The XML DTD validation with valid context XML_FROM_CHECK = 24 # The error checking module XML_FROM_WRITER = 25 # The xmlwriter module XML_FROM_MODULE = 26 # The dynamically loaded module modul XML_FROM_I18N = 27 # The module handling character conversion -""" +""",) cdef object __ERROR_TYPES -__ERROR_TYPES = """\ +__ERROR_TYPES = ("""\ XML_ERR_OK = 0 XML_ERR_INTERNAL_ERROR = 1 # 1 XML_ERR_NO_MEMORY = 2 # 2 @@ -481,7 +491,7 @@ XML_WAR_UNDECLARED_ENTITY = 27 # 27 XML_ERR_UNPARSED_ENTITY = 28 # 28 XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 -""" + \ +""", """\ XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 XML_ERR_UNKNOWN_ENCODING = 31 # 31 @@ -513,7 +523,7 @@ XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 -""" + \ +""", """\ XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 @@ -545,7 +555,7 @@ XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 XML_ERR_ENTITY_LOOP = 89 # 89 -""" + \ +""", """\ XML_ERR_ENTITY_BOUNDARY = 90 # 90 XML_ERR_INVALID_URI = 91 # 91 @@ -577,7 +587,7 @@ XML_DTD_CONTENT_MODEL = 504 # 504 XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 XML_DTD_DIFFERENT_PREFIX = 506 # 506 -""" + \ +""", """\ XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 XML_DTD_ELEM_NAMESPACE = 508 # 508 @@ -608,7 +618,7 @@ XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 XML_DTD_UNKNOWN_ELEM = 534 # 534 XML_DTD_UNKNOWN_ENTITY = 535 # 535 -""" + \ +""", """\ XML_DTD_UNKNOWN_ID = 536 # 536 XML_DTD_UNKNOWN_NOTATION = 537 # 537 @@ -639,7 +649,7 @@ XML_RNGP_ELEMENT_NAME = 1019 # 1019 XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 -""" + \ +""", """\ XML_RNGP_EMPTY = 1022 # 1022 XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 @@ -670,7 +680,7 @@ XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 XML_RNGP_INVALID_URI = 1050 # 1050 -""" + \ +""", """\ XML_RNGP_INVALID_VALUE = 1051 # 1051 XML_RNGP_MISSING_HREF = 1052 # 1052 @@ -701,7 +711,7 @@ XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 -""" + \ +""", """\ XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 XML_RNGP_PAT_LIST_LIST = 1081 # 1081 @@ -732,7 +742,7 @@ XML_RNGP_START_EMPTY = 1106 # 1106 XML_RNGP_START_MISSING = 1107 # 1107 XML_RNGP_TEXT_EXPECTED = 1108 # 1108 -""" + \ +""", """\ XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 XML_RNGP_TYPE_MISSING = 1110 # 1110 @@ -763,7 +773,7 @@ XML_XPATH_INVALID_ARITY = 1212 # 1212 XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 -""" + \ +""", """\ XML_XPATH_MEMORY_ERROR = 1215 # 1215 XML_XPTR_SYNTAX_ERROR = 1216 # 1216 @@ -794,7 +804,7 @@ XML_IO_EFAULT = 1511 # 1511 XML_IO_EFBIG = 1512 # 1512 XML_IO_EINPROGRESS = 1513 # 1513 -""" + \ +""", """\ XML_IO_EINTR = 1514 # 1514 XML_IO_EINVAL = 1515 # 1515 @@ -825,7 +835,7 @@ XML_IO_ESRCH = 1540 # 1540 XML_IO_ETIMEDOUT = 1541 # 1541 XML_IO_EXDEV = 1542 # 1542 -""" + \ +""", """\ XML_IO_NETWORK_ATTEMPT = 1543 # 1543 XML_IO_ENCODER = 1544 # 1544 @@ -856,7 +866,7 @@ XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 -""" + \ +""", """\ XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 @@ -887,7 +897,7 @@ XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 -""" + \ +""", """\ XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 @@ -918,7 +928,7 @@ XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 -""" + \ +""", """\ XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 @@ -949,7 +959,7 @@ XML_SCHEMAP_RECURSIVE = 1775 # 1775 XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 -""" + \ +""", """\ XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 @@ -980,7 +990,7 @@ XML_SCHEMAV_MISSING = 1804 # 1804 XML_SCHEMAV_WRONGELEM = 1805 # 1805 XML_SCHEMAV_NOTYPE = 1806 # 1806 -""" + \ +""", """\ XML_SCHEMAV_NOROLLBACK = 1807 # 1807 XML_SCHEMAV_ISABSTRACT = 1808 # 1808 @@ -1011,7 +1021,7 @@ XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 -""" + \ +""", """\ XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 @@ -1042,7 +1052,7 @@ XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 -""" + \ +""", """\ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 @@ -1073,7 +1083,7 @@ XML_FTP_ACCNT = 2002 # 2002 XML_FTP_URL_SYNTAX = 2003 # 2003 XML_HTTP_URL_SYNTAX = 2020 -""" + \ +""", """\ XML_HTTP_USE_IP = 2021 # 2021 XML_HTTP_UNKNOWN_HOST = 2022 # 2022 @@ -1104,7 +1114,7 @@ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 -""" + \ +""", """\ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 @@ -1135,7 +1145,7 @@ XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 -""" + \ +""", """\ XML_SCHEMAP_NO_XMLNS = 3056 # 3056 XML_SCHEMAP_NO_XSI = 3057 # 3057 @@ -1166,7 +1176,7 @@ XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 -""" + \ +""", """\ XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 @@ -1197,7 +1207,7 @@ XML_CHECK_WRONG_DOC = 5017 # 5017 XML_CHECK_NO_PREV = 5018 # 5018 XML_CHECK_WRONG_PREV = 5019 # 5019 -""" + \ +""", """\ XML_CHECK_NO_NEXT = 5020 # 5020 XML_CHECK_WRONG_NEXT = 5021 # 5021 @@ -1224,7 +1234,7 @@ XML_I18N_NO_OUTPUT = 6004 # 6004 XML_CHECK_ = 6005 # 5033 XML_CHECK_X = 6006 # 503 -""" +""",) # --- END: GENERATED CONSTANTS --- __initErrorConstants() Modified: lxml/trunk/update-error-constants.py ============================================================================== --- lxml/trunk/update-error-constants.py (original) +++ lxml/trunk/update-error-constants.py Sat Jun 3 10:17:40 2006 @@ -25,6 +25,15 @@ ENUM_ORDER = ('xmlErrorLevel', 'xmlErrorDomain', 'xmlParserErrors') +COMMENT = """ +# This section is generated by the script '%s'. +# +# Constants are stored in tuples of strings, for which Pyrex generates very +# efficient setup code. To parse them, iterate over the tuples and parse each +# line in each string independently. + +""" % os.path.basename(sys.argv[0]) + def split(lines): lines = iter(lines) pre = [] @@ -50,6 +59,7 @@ # write .pxi source file f = open(filename, 'w') f.write(''.join(pre)) + f.write(COMMENT) f.write('\n'.join(result)) f.write(''.join(post)) f.close() @@ -82,7 +92,7 @@ append_pxd = pxd_result.append ctypedef_indent = ' '*4 -constant_indent = ' '*8 +constant_indent = ctypedef_indent*2 append_pxd('cdef extern from "libxml/xmlerror.h":') for enum_name in ENUM_ORDER: @@ -91,7 +101,7 @@ append_pxd(ctypedef_indent + 'ctypedef enum %s:' % enum_name) append_pxi('cdef object %s' % pxi_name) - append_pxi('%s = """\\' % pxi_name) + append_pxi('%s = ("""\\' % pxi_name) length = 0 for name, val, descr in constants: if descr: @@ -102,16 +112,21 @@ append_pxd(constant_indent + line) if length + len(line) > 2000: # max string length in MSVC - append_pxi('""" + \\') + append_pxi('""",') append_pxi('"""\\') length = 0 append_pxi(line) length += len(line) + 1 append_pxd('') - append_pxi('"""') + append_pxi('""",)') append_pxi('') # write source files +print "Updating file", BUILD_SOURCE_FILE regenerate_file(BUILD_SOURCE_FILE, pxi_result) + +print "Updating file", BUILD_DEF_FILE regenerate_file(BUILD_DEF_FILE, pxd_result) + +print "Done" From scoder at codespeak.net Sat Jun 3 11:17:15 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 11:17:15 +0200 (CEST) Subject: [Lxml-checkins] r28135 - in lxml/trunk: . src/lxml Message-ID: <20060603091715.4400B1006B@code0.codespeak.net> Author: scoder Date: Sat Jun 3 11:17:09 2006 New Revision: 28135 Modified: lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/xmlerror.pxd lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/update-error-constants.py Log: update-error-constants.py: strip prefixes and indentation before storing constant strings to safe setup overhead and space in the binary Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sat Jun 3 11:17:09 2006 @@ -26,6 +26,7 @@ cdef object PyString_FromFormat(char* format, ...) cdef Py_ssize_t PyString_GET_SIZE(object s) cdef object PyBool_FromLong(long value) + cdef object PyNumber_Int(object value) cdef Py_ssize_t PyList_GET_SIZE(object l) cdef int PyList_Append(object l, object obj) Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Sat Jun 3 11:17:09 2006 @@ -2,10 +2,6 @@ # --- BEGIN: GENERATED CONSTANTS --- # This section is generated by the script 'update-error-constants.py'. -# -# Constants are stored in tuples of strings, for which Pyrex generates very -# efficient setup code. To parse them, iterate over the tuples and parse each -# line in each string independently. cdef extern from "libxml/xmlerror.h": ctypedef enum xmlErrorLevel: Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Sat Jun 3 11:17:09 2006 @@ -384,19 +384,17 @@ cdef void __initErrorConstants(): "Called at setup time to parse the constants and build the classes below." find_constants = re.compile(r"\s*([a-zA-Z0-9_]+)\s*=\s*([0-9]+)").findall - const_defs = ((ErrorLevels, __ERROR_LEVELS, 'XML_ERR_'), - (ErrorDomains, __ERROR_DOMAINS, 'XML_FROM_'), - (ErrorTypes, __ERROR_TYPES, 'XML_')) - for cls, constant_tuple, prefix in const_defs: - prefix_len = len(prefix) + const_defs = ((ErrorLevels, __ERROR_LEVELS), + (ErrorDomains, __ERROR_DOMAINS), + (ErrorTypes, __ERROR_TYPES)) + for cls, constant_tuple in const_defs: reverse_dict = {} cls._names = reverse_dict cls._getName = reverse_dict.get for constants in constant_tuple: + #print len(constants) + 1 for name, value in find_constants(constants): - if name[:prefix_len] == prefix and len(name) > prefix_len: - name = name[prefix_len:] - value = int(value) + value = python.PyNumber_Int(value) python.PyObject_SetAttr(cls, name, value) python.PyDict_SetItem(reverse_dict, value, name) @@ -412,828 +410,796 @@ # --- BEGIN: GENERATED CONSTANTS --- # This section is generated by the script 'update-error-constants.py'. -# + # Constants are stored in tuples of strings, for which Pyrex generates very # efficient setup code. To parse them, iterate over the tuples and parse each # line in each string independently. cdef object __ERROR_LEVELS __ERROR_LEVELS = ("""\ -XML_ERR_NONE = 0 -XML_ERR_WARNING = 1 # A simple warning -XML_ERR_ERROR = 2 # A recoverable error -XML_ERR_FATAL = 3 # A fatal error +NONE=0 +WARNING=1 +ERROR=2 +FATAL=3 """,) cdef object __ERROR_DOMAINS __ERROR_DOMAINS = ("""\ -XML_FROM_NONE = 0 -XML_FROM_PARSER = 1 # The XML parser -XML_FROM_TREE = 2 # The tree module -XML_FROM_NAMESPACE = 3 # The XML Namespace module -XML_FROM_DTD = 4 # The XML DTD validation with parser contex -XML_FROM_HTML = 5 # The HTML parser -XML_FROM_MEMORY = 6 # The memory allocator -XML_FROM_OUTPUT = 7 # The serialization code -XML_FROM_IO = 8 # The Input/Output stack -XML_FROM_FTP = 9 # The FTP module -XML_FROM_HTTP = 10 # The HTTP module -XML_FROM_XINCLUDE = 11 # The XInclude processing -XML_FROM_XPATH = 12 # The XPath module -XML_FROM_XPOINTER = 13 # The XPointer module -XML_FROM_REGEXP = 14 # The regular expressions module -XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module -XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module -XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module -XML_FROM_RELAXNGP = 18 # The Relax-NG parser module -XML_FROM_RELAXNGV = 19 # The Relax-NG validator module -XML_FROM_CATALOG = 20 # The Catalog module -XML_FROM_C14N = 21 # The Canonicalization module -XML_FROM_XSLT = 22 # The XSLT engine from libxslt -""", -"""\ -XML_FROM_VALID = 23 # The XML DTD validation with valid context -XML_FROM_CHECK = 24 # The error checking module -XML_FROM_WRITER = 25 # The xmlwriter module -XML_FROM_MODULE = 26 # The dynamically loaded module modul -XML_FROM_I18N = 27 # The module handling character conversion +NONE=0 +PARSER=1 +TREE=2 +NAMESPACE=3 +DTD=4 +HTML=5 +MEMORY=6 +OUTPUT=7 +IO=8 +FTP=9 +HTTP=10 +XINCLUDE=11 +XPATH=12 +XPOINTER=13 +REGEXP=14 +DATATYPE=15 +SCHEMASP=16 +SCHEMASV=17 +RELAXNGP=18 +RELAXNGV=19 +CATALOG=20 +C14N=21 +XSLT=22 +VALID=23 +CHECK=24 +WRITER=25 +MODULE=26 +I18N=27 """,) cdef object __ERROR_TYPES __ERROR_TYPES = ("""\ -XML_ERR_OK = 0 -XML_ERR_INTERNAL_ERROR = 1 # 1 -XML_ERR_NO_MEMORY = 2 # 2 -XML_ERR_DOCUMENT_START = 3 # 3 -XML_ERR_DOCUMENT_EMPTY = 4 # 4 -XML_ERR_DOCUMENT_END = 5 # 5 -XML_ERR_INVALID_HEX_CHARREF = 6 # 6 -XML_ERR_INVALID_DEC_CHARREF = 7 # 7 -XML_ERR_INVALID_CHARREF = 8 # 8 -XML_ERR_INVALID_CHAR = 9 # 9 -XML_ERR_CHARREF_AT_EOF = 10 # 10 -XML_ERR_CHARREF_IN_PROLOG = 11 # 11 -XML_ERR_CHARREF_IN_EPILOG = 12 # 12 -XML_ERR_CHARREF_IN_DTD = 13 # 13 -XML_ERR_ENTITYREF_AT_EOF = 14 # 14 -XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 -XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 -XML_ERR_ENTITYREF_IN_DTD = 17 # 17 -XML_ERR_PEREF_AT_EOF = 18 # 18 -XML_ERR_PEREF_IN_PROLOG = 19 # 19 -XML_ERR_PEREF_IN_EPILOG = 20 # 20 -XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 -XML_ERR_ENTITYREF_NO_NAME = 22 # 22 -XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 -XML_ERR_PEREF_NO_NAME = 24 # 24 -XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 -XML_ERR_UNDECLARED_ENTITY = 26 # 26 -XML_WAR_UNDECLARED_ENTITY = 27 # 27 -XML_ERR_UNPARSED_ENTITY = 28 # 28 -XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 -""", -"""\ -XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 -XML_ERR_UNKNOWN_ENCODING = 31 # 31 -XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 -XML_ERR_STRING_NOT_STARTED = 33 # 33 -XML_ERR_STRING_NOT_CLOSED = 34 # 34 -XML_ERR_NS_DECL_ERROR = 35 # 35 -XML_ERR_ENTITY_NOT_STARTED = 36 # 36 -XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 -XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 -XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 -XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 -XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 -XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 -XML_ERR_LITERAL_NOT_STARTED = 43 # 43 -XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 -XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 -XML_ERR_PI_NOT_STARTED = 46 # 46 -XML_ERR_PI_NOT_FINISHED = 47 # 47 -XML_ERR_NOTATION_NOT_STARTED = 48 # 48 -XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 -XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 -XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 -XML_ERR_MIXED_NOT_STARTED = 52 # 52 -XML_ERR_MIXED_NOT_FINISHED = 53 # 53 -XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 -XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 -XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 -XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 -XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 -XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 -""", -"""\ -XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 -XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 -XML_ERR_MISPLACED_CDATA_END = 62 # 62 -XML_ERR_CDATA_NOT_FINISHED = 63 # 63 -XML_ERR_RESERVED_XML_NAME = 64 # 64 -XML_ERR_SPACE_REQUIRED = 65 # 65 -XML_ERR_SEPARATOR_REQUIRED = 66 # 66 -XML_ERR_NMTOKEN_REQUIRED = 67 # 67 -XML_ERR_NAME_REQUIRED = 68 # 68 -XML_ERR_PCDATA_REQUIRED = 69 # 69 -XML_ERR_URI_REQUIRED = 70 # 70 -XML_ERR_PUBID_REQUIRED = 71 # 71 -XML_ERR_LT_REQUIRED = 72 # 72 -XML_ERR_GT_REQUIRED = 73 # 73 -XML_ERR_LTSLASH_REQUIRED = 74 # 74 -XML_ERR_EQUAL_REQUIRED = 75 # 75 -XML_ERR_TAG_NAME_MISMATCH = 76 # 76 -XML_ERR_TAG_NOT_FINISHED = 77 # 77 -XML_ERR_STANDALONE_VALUE = 78 # 78 -XML_ERR_ENCODING_NAME = 79 # 79 -XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 -XML_ERR_INVALID_ENCODING = 81 # 81 -XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 -XML_ERR_CONDSEC_INVALID = 83 # 83 -XML_ERR_VALUE_REQUIRED = 84 # 84 -XML_ERR_NOT_WELL_BALANCED = 85 # 85 -XML_ERR_EXTRA_CONTENT = 86 # 86 -XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 -XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 -XML_ERR_ENTITY_LOOP = 89 # 89 -""", -"""\ -XML_ERR_ENTITY_BOUNDARY = 90 # 90 -XML_ERR_INVALID_URI = 91 # 91 -XML_ERR_URI_FRAGMENT = 92 # 92 -XML_WAR_CATALOG_PI = 93 # 93 -XML_ERR_NO_DTD = 94 # 94 -XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 -XML_ERR_VERSION_MISSING = 96 # 96 -XML_WAR_UNKNOWN_VERSION = 97 # 97 -XML_WAR_LANG_VALUE = 98 # 98 -XML_WAR_NS_URI = 99 # 99 -XML_WAR_NS_URI_RELATIVE = 100 # 100 -XML_ERR_MISSING_ENCODING = 101 # 101 -XML_WAR_SPACE_VALUE = 102 # 102 -XML_ERR_NOT_STANDALONE = 103 # 103 -XML_ERR_ENTITY_PROCESSING = 104 # 104 -XML_ERR_NOTATION_PROCESSING = 105 # 105 -XML_WAR_NS_COLUMN = 106 # 106 -XML_WAR_ENTITY_REDEFINED = 107 # 107 -XML_NS_ERR_XML_NAMESPACE = 200 -XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 -XML_NS_ERR_QNAME = 202 # 202 -XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 -XML_NS_ERR_EMPTY = 204 # 204 -XML_DTD_ATTRIBUTE_DEFAULT = 500 -XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 -XML_DTD_ATTRIBUTE_VALUE = 502 # 502 -XML_DTD_CONTENT_ERROR = 503 # 503 -XML_DTD_CONTENT_MODEL = 504 # 504 -XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 -XML_DTD_DIFFERENT_PREFIX = 506 # 506 -""", -"""\ -XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 -XML_DTD_ELEM_NAMESPACE = 508 # 508 -XML_DTD_ELEM_REDEFINED = 509 # 509 -XML_DTD_EMPTY_NOTATION = 510 # 510 -XML_DTD_ENTITY_TYPE = 511 # 511 -XML_DTD_ID_FIXED = 512 # 512 -XML_DTD_ID_REDEFINED = 513 # 513 -XML_DTD_ID_SUBSET = 514 # 514 -XML_DTD_INVALID_CHILD = 515 # 515 -XML_DTD_INVALID_DEFAULT = 516 # 516 -XML_DTD_LOAD_ERROR = 517 # 517 -XML_DTD_MISSING_ATTRIBUTE = 518 # 518 -XML_DTD_MIXED_CORRUPT = 519 # 519 -XML_DTD_MULTIPLE_ID = 520 # 520 -XML_DTD_NO_DOC = 521 # 521 -XML_DTD_NO_DTD = 522 # 522 -XML_DTD_NO_ELEM_NAME = 523 # 523 -XML_DTD_NO_PREFIX = 524 # 524 -XML_DTD_NO_ROOT = 525 # 525 -XML_DTD_NOTATION_REDEFINED = 526 # 526 -XML_DTD_NOTATION_VALUE = 527 # 527 -XML_DTD_NOT_EMPTY = 528 # 528 -XML_DTD_NOT_PCDATA = 529 # 529 -XML_DTD_NOT_STANDALONE = 530 # 530 -XML_DTD_ROOT_NAME = 531 # 531 -XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 -XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 -XML_DTD_UNKNOWN_ELEM = 534 # 534 -XML_DTD_UNKNOWN_ENTITY = 535 # 535 -""", -"""\ -XML_DTD_UNKNOWN_ID = 536 # 536 -XML_DTD_UNKNOWN_NOTATION = 537 # 537 -XML_DTD_STANDALONE_DEFAULTED = 538 # 538 -XML_DTD_XMLID_VALUE = 539 # 539 -XML_DTD_XMLID_TYPE = 540 # 540 -XML_HTML_STRUCURE_ERROR = 800 -XML_HTML_UNKNOWN_TAG = 801 # 801 -XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 -XML_RNGP_ATTR_CONFLICT = 1001 # 1001 -XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 -XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 -XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 -XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 -XML_RNGP_CHOICE_CONTENT = 1006 # 1006 -XML_RNGP_CHOICE_EMPTY = 1007 # 1007 -XML_RNGP_CREATE_FAILURE = 1008 # 1008 -XML_RNGP_DATA_CONTENT = 1009 # 1009 -XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 -XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 -XML_RNGP_DEFINE_EMPTY = 1012 # 1012 -XML_RNGP_DEFINE_MISSING = 1013 # 1013 -XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 -XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 -XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 -XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 -XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 -XML_RNGP_ELEMENT_NAME = 1019 # 1019 -XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 -XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 -""", -"""\ -XML_RNGP_EMPTY = 1022 # 1022 -XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 -XML_RNGP_EMPTY_CONTENT = 1024 # 1024 -XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 -XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 -XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 -XML_RNGP_EXCEPT_MISSING = 1028 # 1028 -XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 -XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 -XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 -XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 -XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 -XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 -XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 -XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 -XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 -XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 -XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 -XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 -XML_RNGP_HREF_ERROR = 1041 # 1041 -XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 -XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 -XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 -XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 -XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 -XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 -XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 -XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 -XML_RNGP_INVALID_URI = 1050 # 1050 -""", -"""\ -XML_RNGP_INVALID_VALUE = 1051 # 1051 -XML_RNGP_MISSING_HREF = 1052 # 1052 -XML_RNGP_NAME_MISSING = 1053 # 1053 -XML_RNGP_NEED_COMBINE = 1054 # 1054 -XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 -XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 -XML_RNGP_NSNAME_NO_NS = 1057 # 1057 -XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 -XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 -XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 -XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 -XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 -XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 -XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 -XML_RNGP_PARSE_ERROR = 1065 # 1065 -XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 -XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 -XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 -XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 -XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 -XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 -XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 -XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 -XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 -XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 -XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 -XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 -XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 -XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 -""", -"""\ -XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 -XML_RNGP_PAT_LIST_LIST = 1081 # 1081 -XML_RNGP_PAT_LIST_REF = 1082 # 1082 -XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 -XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 -XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 -XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 -XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 -XML_RNGP_PAT_START_ATTR = 1088 # 1088 -XML_RNGP_PAT_START_DATA = 1089 # 1089 -XML_RNGP_PAT_START_EMPTY = 1090 # 1090 -XML_RNGP_PAT_START_GROUP = 1091 # 1091 -XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 -XML_RNGP_PAT_START_LIST = 1093 # 1093 -XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 -XML_RNGP_PAT_START_TEXT = 1095 # 1095 -XML_RNGP_PAT_START_VALUE = 1096 # 1096 -XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 -XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 -XML_RNGP_REF_CYCLE = 1099 # 1099 -XML_RNGP_REF_NAME_INVALID = 1100 # 1100 -XML_RNGP_REF_NO_DEF = 1101 # 1101 -XML_RNGP_REF_NO_NAME = 1102 # 1102 -XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 -XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 -XML_RNGP_START_CONTENT = 1105 # 1105 -XML_RNGP_START_EMPTY = 1106 # 1106 -XML_RNGP_START_MISSING = 1107 # 1107 -XML_RNGP_TEXT_EXPECTED = 1108 # 1108 -""", -"""\ -XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 -XML_RNGP_TYPE_MISSING = 1110 # 1110 -XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 -XML_RNGP_TYPE_VALUE = 1112 # 1112 -XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 -XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 -XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 -XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 -XML_RNGP_URI_FRAGMENT = 1117 # 1117 -XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 -XML_RNGP_VALUE_EMPTY = 1119 # 1119 -XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 -XML_RNGP_XMLNS_NAME = 1121 # 1121 -XML_RNGP_XML_NS = 1122 # 1122 -XML_XPATH_EXPRESSION_OK = 1200 -XML_XPATH_NUMBER_ERROR = 1201 # 1201 -XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 -XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 -XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 -XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 -XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 -XML_XPATH_EXPR_ERROR = 1207 # 1207 -XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 -XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 -XML_XPATH_INVALID_OPERAND = 1210 # 1210 -XML_XPATH_INVALID_TYPE = 1211 # 1211 -XML_XPATH_INVALID_ARITY = 1212 # 1212 -XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 -XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 -""", -"""\ -XML_XPATH_MEMORY_ERROR = 1215 # 1215 -XML_XPTR_SYNTAX_ERROR = 1216 # 1216 -XML_XPTR_RESOURCE_ERROR = 1217 # 1217 -XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 -XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 -XML_XPATH_ENCODING_ERROR = 1220 # 1220 -XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 -XML_TREE_INVALID_HEX = 1300 -XML_TREE_INVALID_DEC = 1301 # 1301 -XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 -XML_SAVE_NOT_UTF8 = 1400 -XML_SAVE_CHAR_INVALID = 1401 # 1401 -XML_SAVE_NO_DOCTYPE = 1402 # 1402 -XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 -XML_REGEXP_COMPILE_ERROR = 1450 -XML_IO_UNKNOWN = 1500 -XML_IO_EACCES = 1501 # 1501 -XML_IO_EAGAIN = 1502 # 1502 -XML_IO_EBADF = 1503 # 1503 -XML_IO_EBADMSG = 1504 # 1504 -XML_IO_EBUSY = 1505 # 1505 -XML_IO_ECANCELED = 1506 # 1506 -XML_IO_ECHILD = 1507 # 1507 -XML_IO_EDEADLK = 1508 # 1508 -XML_IO_EDOM = 1509 # 1509 -XML_IO_EEXIST = 1510 # 1510 -XML_IO_EFAULT = 1511 # 1511 -XML_IO_EFBIG = 1512 # 1512 -XML_IO_EINPROGRESS = 1513 # 1513 -""", -"""\ -XML_IO_EINTR = 1514 # 1514 -XML_IO_EINVAL = 1515 # 1515 -XML_IO_EIO = 1516 # 1516 -XML_IO_EISDIR = 1517 # 1517 -XML_IO_EMFILE = 1518 # 1518 -XML_IO_EMLINK = 1519 # 1519 -XML_IO_EMSGSIZE = 1520 # 1520 -XML_IO_ENAMETOOLONG = 1521 # 1521 -XML_IO_ENFILE = 1522 # 1522 -XML_IO_ENODEV = 1523 # 1523 -XML_IO_ENOENT = 1524 # 1524 -XML_IO_ENOEXEC = 1525 # 1525 -XML_IO_ENOLCK = 1526 # 1526 -XML_IO_ENOMEM = 1527 # 1527 -XML_IO_ENOSPC = 1528 # 1528 -XML_IO_ENOSYS = 1529 # 1529 -XML_IO_ENOTDIR = 1530 # 1530 -XML_IO_ENOTEMPTY = 1531 # 1531 -XML_IO_ENOTSUP = 1532 # 1532 -XML_IO_ENOTTY = 1533 # 1533 -XML_IO_ENXIO = 1534 # 1534 -XML_IO_EPERM = 1535 # 1535 -XML_IO_EPIPE = 1536 # 1536 -XML_IO_ERANGE = 1537 # 1537 -XML_IO_EROFS = 1538 # 1538 -XML_IO_ESPIPE = 1539 # 1539 -XML_IO_ESRCH = 1540 # 1540 -XML_IO_ETIMEDOUT = 1541 # 1541 -XML_IO_EXDEV = 1542 # 1542 -""", -"""\ -XML_IO_NETWORK_ATTEMPT = 1543 # 1543 -XML_IO_ENCODER = 1544 # 1544 -XML_IO_FLUSH = 1545 # 1545 -XML_IO_WRITE = 1546 # 1546 -XML_IO_NO_INPUT = 1547 # 1547 -XML_IO_BUFFER_FULL = 1548 # 1548 -XML_IO_LOAD_ERROR = 1549 # 1549 -XML_IO_ENOTSOCK = 1550 # 1550 -XML_IO_EISCONN = 1551 # 1551 -XML_IO_ECONNREFUSED = 1552 # 1552 -XML_IO_ENETUNREACH = 1553 # 1553 -XML_IO_EADDRINUSE = 1554 # 1554 -XML_IO_EALREADY = 1555 # 1555 -XML_IO_EAFNOSUPPORT = 1556 # 1556 -XML_XINCLUDE_RECURSION = 1600 -XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 -XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 -XML_XINCLUDE_NO_HREF = 1603 # 1603 -XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 -XML_XINCLUDE_HREF_URI = 1605 # 1605 -XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 -XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 -XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 -XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 -XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 -XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 -XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 -XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 -XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 -""", -"""\ -XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 -XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 -XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 -XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 -XML_CATALOG_MISSING_ATTR = 1650 -XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 -XML_CATALOG_PREFER_VALUE = 1652 # 1652 -XML_CATALOG_NOT_CATALOG = 1653 # 1653 -XML_CATALOG_RECURSION = 1654 # 1654 -XML_SCHEMAP_PREFIX_UNDEFINED = 1700 -XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 -XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 -XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 -XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 -XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 -XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 -XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 -XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 -XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 -XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 -XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 -XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 -XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 -XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 -XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 -XML_SCHEMAP_INVALID_FACET = 1716 # 1716 -XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 -XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 -XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 -""", -"""\ -XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 -XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 -XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 -XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 -XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 -XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 -XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 -XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 -XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 -XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 -XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 -XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 -XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 -XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 -XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 -XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 -XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 -XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 -XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 -XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 -XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 -XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 -XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 -XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 -XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 -XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 -XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 -XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 -XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 -""", -"""\ -XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 -XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 -XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 -XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 -XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 -XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 -XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 -XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 -XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 -XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 -XML_SCHEMAP_NOROOT = 1759 # 1759 -XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 -XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 -XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 -XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 -XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 -XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 -XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 -XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 -XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 -XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 -XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 -XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 -XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 -XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 -XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 -XML_SCHEMAP_RECURSIVE = 1775 # 1775 -XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 -XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 -""", -"""\ -XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 -XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 -XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 -XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 -XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 -XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 -XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 -XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 -XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 -XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 -XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 -XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 -XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 -XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 -XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 -XML_SCHEMAV_NOROOT = 1801 -XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 -XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 -XML_SCHEMAV_MISSING = 1804 # 1804 -XML_SCHEMAV_WRONGELEM = 1805 # 1805 -XML_SCHEMAV_NOTYPE = 1806 # 1806 -""", -"""\ -XML_SCHEMAV_NOROLLBACK = 1807 # 1807 -XML_SCHEMAV_ISABSTRACT = 1808 # 1808 -XML_SCHEMAV_NOTEMPTY = 1809 # 1809 -XML_SCHEMAV_ELEMCONT = 1810 # 1810 -XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 -XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 -XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 -XML_SCHEMAV_INVALIDATTR = 1814 # 1814 -XML_SCHEMAV_INVALIDELEM = 1815 # 1815 -XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 -XML_SCHEMAV_CONSTRUCT = 1817 # 1817 -XML_SCHEMAV_INTERNAL = 1818 # 1818 -XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 -XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 -XML_SCHEMAV_ATTRINVALID = 1821 # 1821 -XML_SCHEMAV_VALUE = 1822 # 1822 -XML_SCHEMAV_FACET = 1823 # 1823 -XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 -XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 -XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 -XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 -XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 -XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 -XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 -XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 -XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 -XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 -XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 -XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 -""", -"""\ -XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 -XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 -XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 -XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 -XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 -XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 -XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 -XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 -XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 -XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 -XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 -XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 -XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 -XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 -XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 -XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 -XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 -XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 -XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 -XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 -XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 -XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 -XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 -XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 -XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 -""", -"""\ -XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 -XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 -XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 -XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 -XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 -XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 -XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 -XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 -XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 -XML_SCHEMAV_CVC_AU = 1874 # 1874 -XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 -XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 -XML_SCHEMAV_CVC_IDC = 1877 # 1877 -XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 -XML_XPTR_UNKNOWN_SCHEME = 1900 -XML_XPTR_CHILDSEQ_START = 1901 # 1901 -XML_XPTR_EVAL_FAILED = 1902 # 1902 -XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 -XML_C14N_CREATE_CTXT = 1950 -XML_C14N_REQUIRES_UTF8 = 1951 # 1951 -XML_C14N_CREATE_STACK = 1952 # 1952 -XML_C14N_INVALID_NODE = 1953 # 1953 -XML_C14N_UNKNOW_NODE = 1954 # 1954 -XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 -XML_FTP_PASV_ANSWER = 2000 -XML_FTP_EPSV_ANSWER = 2001 # 2001 -XML_FTP_ACCNT = 2002 # 2002 -XML_FTP_URL_SYNTAX = 2003 # 2003 -XML_HTTP_URL_SYNTAX = 2020 -""", -"""\ -XML_HTTP_USE_IP = 2021 # 2021 -XML_HTTP_UNKNOWN_HOST = 2022 # 2022 -XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 -XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 -XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 -XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 -XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 -XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 -XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 -XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 -XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 -XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 -XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 -XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 -XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 -XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 -XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 -XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 -XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 -""", -"""\ -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 -XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 -XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 -XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 -XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 -XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 -XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 -XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 -XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 -XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 -XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 -XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 -XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 -XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 -XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 -XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 -XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 -XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 -XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 -XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 -XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 -XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 -XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 -XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 -XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 -XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 -""", -"""\ -XML_SCHEMAP_NO_XMLNS = 3056 # 3056 -XML_SCHEMAP_NO_XSI = 3057 # 3057 -XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 -XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 -XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 -XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 -XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 -XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 -XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 -XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 -XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 -XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 -XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 -XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C -XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C -XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 -XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 -XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 -XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 -XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 -XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 -XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 -XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 -XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 -XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 -XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 -XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 -XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 -""", -"""\ -XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 -XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 -XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 -XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 -XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 -XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 -XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 -XML_MODULE_OPEN = 4900 # 4900 -XML_MODULE_CLOSE = 4901 # 4901 -XML_CHECK_FOUND_ELEMENT = 5000 -XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 -XML_CHECK_FOUND_TEXT = 5002 # 5002 -XML_CHECK_FOUND_CDATA = 5003 # 5003 -XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 -XML_CHECK_FOUND_ENTITY = 5005 # 5005 -XML_CHECK_FOUND_PI = 5006 # 5006 -XML_CHECK_FOUND_COMMENT = 5007 # 5007 -XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 -XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 -XML_CHECK_FOUND_NOTATION = 5010 # 5010 -XML_CHECK_UNKNOWN_NODE = 5011 # 5011 -XML_CHECK_ENTITY_TYPE = 5012 # 5012 -XML_CHECK_NO_PARENT = 5013 # 5013 -XML_CHECK_NO_DOC = 5014 # 5014 -XML_CHECK_NO_NAME = 5015 # 5015 -XML_CHECK_NO_ELEM = 5016 # 5016 -XML_CHECK_WRONG_DOC = 5017 # 5017 -XML_CHECK_NO_PREV = 5018 # 5018 -XML_CHECK_WRONG_PREV = 5019 # 5019 -""", -"""\ -XML_CHECK_NO_NEXT = 5020 # 5020 -XML_CHECK_WRONG_NEXT = 5021 # 5021 -XML_CHECK_NOT_DTD = 5022 # 5022 -XML_CHECK_NOT_ATTR = 5023 # 5023 -XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 -XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 -XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 -XML_CHECK_NOT_NS_DECL = 5027 # 5027 -XML_CHECK_NO_HREF = 5028 # 5028 -XML_CHECK_WRONG_PARENT = 5029 # 5029 -XML_CHECK_NS_SCOPE = 5030 # 5030 -XML_CHECK_NS_ANCESTOR = 5031 # 5031 -XML_CHECK_NOT_UTF8 = 5032 # 5032 -XML_CHECK_NO_DICT = 5033 # 5033 -XML_CHECK_NOT_NCNAME = 5034 # 5034 -XML_CHECK_OUTSIDE_DICT = 5035 # 5035 -XML_CHECK_WRONG_NAME = 5036 # 5036 -XML_CHECK_NAME_NOT_NULL = 5037 # 5037 -XML_I18N_NO_NAME = 6000 -XML_I18N_NO_HANDLER = 6001 # 6001 -XML_I18N_EXCESS_HANDLER = 6002 # 6002 -XML_I18N_CONV_FAILED = 6003 # 6003 -XML_I18N_NO_OUTPUT = 6004 # 6004 -XML_CHECK_ = 6005 # 5033 -XML_CHECK_X = 6006 # 503 +ERR_OK=0 +ERR_INTERNAL_ERROR=1 +ERR_NO_MEMORY=2 +ERR_DOCUMENT_START=3 +ERR_DOCUMENT_EMPTY=4 +ERR_DOCUMENT_END=5 +ERR_INVALID_HEX_CHARREF=6 +ERR_INVALID_DEC_CHARREF=7 +ERR_INVALID_CHARREF=8 +ERR_INVALID_CHAR=9 +ERR_CHARREF_AT_EOF=10 +ERR_CHARREF_IN_PROLOG=11 +ERR_CHARREF_IN_EPILOG=12 +ERR_CHARREF_IN_DTD=13 +ERR_ENTITYREF_AT_EOF=14 +ERR_ENTITYREF_IN_PROLOG=15 +ERR_ENTITYREF_IN_EPILOG=16 +ERR_ENTITYREF_IN_DTD=17 +ERR_PEREF_AT_EOF=18 +ERR_PEREF_IN_PROLOG=19 +ERR_PEREF_IN_EPILOG=20 +ERR_PEREF_IN_INT_SUBSET=21 +ERR_ENTITYREF_NO_NAME=22 +ERR_ENTITYREF_SEMICOL_MISSING=23 +ERR_PEREF_NO_NAME=24 +ERR_PEREF_SEMICOL_MISSING=25 +ERR_UNDECLARED_ENTITY=26 +WAR_UNDECLARED_ENTITY=27 +ERR_UNPARSED_ENTITY=28 +ERR_ENTITY_IS_EXTERNAL=29 +ERR_ENTITY_IS_PARAMETER=30 +ERR_UNKNOWN_ENCODING=31 +ERR_UNSUPPORTED_ENCODING=32 +ERR_STRING_NOT_STARTED=33 +ERR_STRING_NOT_CLOSED=34 +ERR_NS_DECL_ERROR=35 +ERR_ENTITY_NOT_STARTED=36 +ERR_ENTITY_NOT_FINISHED=37 +ERR_LT_IN_ATTRIBUTE=38 +ERR_ATTRIBUTE_NOT_STARTED=39 +ERR_ATTRIBUTE_NOT_FINISHED=40 +ERR_ATTRIBUTE_WITHOUT_VALUE=41 +ERR_ATTRIBUTE_REDEFINED=42 +ERR_LITERAL_NOT_STARTED=43 +ERR_LITERAL_NOT_FINISHED=44 +ERR_COMMENT_NOT_FINISHED=45 +ERR_PI_NOT_STARTED=46 +ERR_PI_NOT_FINISHED=47 +ERR_NOTATION_NOT_STARTED=48 +ERR_NOTATION_NOT_FINISHED=49 +ERR_ATTLIST_NOT_STARTED=50 +ERR_ATTLIST_NOT_FINISHED=51 +ERR_MIXED_NOT_STARTED=52 +ERR_MIXED_NOT_FINISHED=53 +ERR_ELEMCONTENT_NOT_STARTED=54 +ERR_ELEMCONTENT_NOT_FINISHED=55 +ERR_XMLDECL_NOT_STARTED=56 +ERR_XMLDECL_NOT_FINISHED=57 +ERR_CONDSEC_NOT_STARTED=58 +ERR_CONDSEC_NOT_FINISHED=59 +ERR_EXT_SUBSET_NOT_FINISHED=60 +ERR_DOCTYPE_NOT_FINISHED=61 +ERR_MISPLACED_CDATA_END=62 +ERR_CDATA_NOT_FINISHED=63 +ERR_RESERVED_XML_NAME=64 +ERR_SPACE_REQUIRED=65 +ERR_SEPARATOR_REQUIRED=66 +ERR_NMTOKEN_REQUIRED=67 +ERR_NAME_REQUIRED=68 +ERR_PCDATA_REQUIRED=69 +ERR_URI_REQUIRED=70 +ERR_PUBID_REQUIRED=71 +ERR_LT_REQUIRED=72 +ERR_GT_REQUIRED=73 +ERR_LTSLASH_REQUIRED=74 +ERR_EQUAL_REQUIRED=75 +ERR_TAG_NAME_MISMATCH=76 +ERR_TAG_NOT_FINISHED=77 +ERR_STANDALONE_VALUE=78 +""", +"""\ +ERR_ENCODING_NAME=79 +ERR_HYPHEN_IN_COMMENT=80 +ERR_INVALID_ENCODING=81 +ERR_EXT_ENTITY_STANDALONE=82 +ERR_CONDSEC_INVALID=83 +ERR_VALUE_REQUIRED=84 +ERR_NOT_WELL_BALANCED=85 +ERR_EXTRA_CONTENT=86 +ERR_ENTITY_CHAR_ERROR=87 +ERR_ENTITY_PE_INTERNAL=88 +ERR_ENTITY_LOOP=89 +ERR_ENTITY_BOUNDARY=90 +ERR_INVALID_URI=91 +ERR_URI_FRAGMENT=92 +WAR_CATALOG_PI=93 +ERR_NO_DTD=94 +ERR_CONDSEC_INVALID_KEYWORD=95 +ERR_VERSION_MISSING=96 +WAR_UNKNOWN_VERSION=97 +WAR_LANG_VALUE=98 +WAR_NS_URI=99 +WAR_NS_URI_RELATIVE=100 +ERR_MISSING_ENCODING=101 +WAR_SPACE_VALUE=102 +ERR_NOT_STANDALONE=103 +ERR_ENTITY_PROCESSING=104 +ERR_NOTATION_PROCESSING=105 +WAR_NS_COLUMN=106 +WAR_ENTITY_REDEFINED=107 +NS_ERR_XML_NAMESPACE=200 +NS_ERR_UNDEFINED_NAMESPACE=201 +NS_ERR_QNAME=202 +NS_ERR_ATTRIBUTE_REDEFINED=203 +NS_ERR_EMPTY=204 +DTD_ATTRIBUTE_DEFAULT=500 +DTD_ATTRIBUTE_REDEFINED=501 +DTD_ATTRIBUTE_VALUE=502 +DTD_CONTENT_ERROR=503 +DTD_CONTENT_MODEL=504 +DTD_CONTENT_NOT_DETERMINIST=505 +DTD_DIFFERENT_PREFIX=506 +DTD_ELEM_DEFAULT_NAMESPACE=507 +DTD_ELEM_NAMESPACE=508 +DTD_ELEM_REDEFINED=509 +DTD_EMPTY_NOTATION=510 +DTD_ENTITY_TYPE=511 +DTD_ID_FIXED=512 +DTD_ID_REDEFINED=513 +DTD_ID_SUBSET=514 +DTD_INVALID_CHILD=515 +DTD_INVALID_DEFAULT=516 +DTD_LOAD_ERROR=517 +DTD_MISSING_ATTRIBUTE=518 +DTD_MIXED_CORRUPT=519 +DTD_MULTIPLE_ID=520 +DTD_NO_DOC=521 +DTD_NO_DTD=522 +DTD_NO_ELEM_NAME=523 +DTD_NO_PREFIX=524 +DTD_NO_ROOT=525 +DTD_NOTATION_REDEFINED=526 +DTD_NOTATION_VALUE=527 +DTD_NOT_EMPTY=528 +DTD_NOT_PCDATA=529 +DTD_NOT_STANDALONE=530 +DTD_ROOT_NAME=531 +DTD_STANDALONE_WHITE_SPACE=532 +DTD_UNKNOWN_ATTRIBUTE=533 +DTD_UNKNOWN_ELEM=534 +DTD_UNKNOWN_ENTITY=535 +DTD_UNKNOWN_ID=536 +DTD_UNKNOWN_NOTATION=537 +DTD_STANDALONE_DEFAULTED=538 +DTD_XMLID_VALUE=539 +DTD_XMLID_TYPE=540 +HTML_STRUCURE_ERROR=800 +HTML_UNKNOWN_TAG=801 +RNGP_ANYNAME_ATTR_ANCESTOR=1000 +RNGP_ATTR_CONFLICT=1001 +RNGP_ATTRIBUTE_CHILDREN=1002 +RNGP_ATTRIBUTE_CONTENT=1003 +RNGP_ATTRIBUTE_EMPTY=1004 +RNGP_ATTRIBUTE_NOOP=1005 +RNGP_CHOICE_CONTENT=1006 +RNGP_CHOICE_EMPTY=1007 +""", +"""\ +RNGP_CREATE_FAILURE=1008 +RNGP_DATA_CONTENT=1009 +RNGP_DEF_CHOICE_AND_INTERLEAVE=1010 +RNGP_DEFINE_CREATE_FAILED=1011 +RNGP_DEFINE_EMPTY=1012 +RNGP_DEFINE_MISSING=1013 +RNGP_DEFINE_NAME_MISSING=1014 +RNGP_ELEM_CONTENT_EMPTY=1015 +RNGP_ELEM_CONTENT_ERROR=1016 +RNGP_ELEMENT_EMPTY=1017 +RNGP_ELEMENT_CONTENT=1018 +RNGP_ELEMENT_NAME=1019 +RNGP_ELEMENT_NO_CONTENT=1020 +RNGP_ELEM_TEXT_CONFLICT=1021 +RNGP_EMPTY=1022 +RNGP_EMPTY_CONSTRUCT=1023 +RNGP_EMPTY_CONTENT=1024 +RNGP_EMPTY_NOT_EMPTY=1025 +RNGP_ERROR_TYPE_LIB=1026 +RNGP_EXCEPT_EMPTY=1027 +RNGP_EXCEPT_MISSING=1028 +RNGP_EXCEPT_MULTIPLE=1029 +RNGP_EXCEPT_NO_CONTENT=1030 +RNGP_EXTERNALREF_EMTPY=1031 +RNGP_EXTERNAL_REF_FAILURE=1032 +RNGP_EXTERNALREF_RECURSE=1033 +RNGP_FORBIDDEN_ATTRIBUTE=1034 +RNGP_FOREIGN_ELEMENT=1035 +RNGP_GRAMMAR_CONTENT=1036 +RNGP_GRAMMAR_EMPTY=1037 +RNGP_GRAMMAR_MISSING=1038 +RNGP_GRAMMAR_NO_START=1039 +RNGP_GROUP_ATTR_CONFLICT=1040 +RNGP_HREF_ERROR=1041 +RNGP_INCLUDE_EMPTY=1042 +RNGP_INCLUDE_FAILURE=1043 +RNGP_INCLUDE_RECURSE=1044 +RNGP_INTERLEAVE_ADD=1045 +RNGP_INTERLEAVE_CREATE_FAILED=1046 +RNGP_INTERLEAVE_EMPTY=1047 +RNGP_INTERLEAVE_NO_CONTENT=1048 +RNGP_INVALID_DEFINE_NAME=1049 +RNGP_INVALID_URI=1050 +RNGP_INVALID_VALUE=1051 +RNGP_MISSING_HREF=1052 +RNGP_NAME_MISSING=1053 +RNGP_NEED_COMBINE=1054 +RNGP_NOTALLOWED_NOT_EMPTY=1055 +RNGP_NSNAME_ATTR_ANCESTOR=1056 +RNGP_NSNAME_NO_NS=1057 +RNGP_PARAM_FORBIDDEN=1058 +RNGP_PARAM_NAME_MISSING=1059 +RNGP_PARENTREF_CREATE_FAILED=1060 +RNGP_PARENTREF_NAME_INVALID=1061 +RNGP_PARENTREF_NO_NAME=1062 +RNGP_PARENTREF_NO_PARENT=1063 +RNGP_PARENTREF_NOT_EMPTY=1064 +RNGP_PARSE_ERROR=1065 +RNGP_PAT_ANYNAME_EXCEPT_ANYNAME=1066 +RNGP_PAT_ATTR_ATTR=1067 +RNGP_PAT_ATTR_ELEM=1068 +RNGP_PAT_DATA_EXCEPT_ATTR=1069 +RNGP_PAT_DATA_EXCEPT_ELEM=1070 +RNGP_PAT_DATA_EXCEPT_EMPTY=1071 +RNGP_PAT_DATA_EXCEPT_GROUP=1072 +RNGP_PAT_DATA_EXCEPT_INTERLEAVE=1073 +RNGP_PAT_DATA_EXCEPT_LIST=1074 +RNGP_PAT_DATA_EXCEPT_ONEMORE=1075 +RNGP_PAT_DATA_EXCEPT_REF=1076 +RNGP_PAT_DATA_EXCEPT_TEXT=1077 +RNGP_PAT_LIST_ATTR=1078 +""", +"""\ +RNGP_PAT_LIST_ELEM=1079 +RNGP_PAT_LIST_INTERLEAVE=1080 +RNGP_PAT_LIST_LIST=1081 +RNGP_PAT_LIST_REF=1082 +RNGP_PAT_LIST_TEXT=1083 +RNGP_PAT_NSNAME_EXCEPT_ANYNAME=1084 +RNGP_PAT_NSNAME_EXCEPT_NSNAME=1085 +RNGP_PAT_ONEMORE_GROUP_ATTR=1086 +RNGP_PAT_ONEMORE_INTERLEAVE_ATTR=1087 +RNGP_PAT_START_ATTR=1088 +RNGP_PAT_START_DATA=1089 +RNGP_PAT_START_EMPTY=1090 +RNGP_PAT_START_GROUP=1091 +RNGP_PAT_START_INTERLEAVE=1092 +RNGP_PAT_START_LIST=1093 +RNGP_PAT_START_ONEMORE=1094 +RNGP_PAT_START_TEXT=1095 +RNGP_PAT_START_VALUE=1096 +RNGP_PREFIX_UNDEFINED=1097 +RNGP_REF_CREATE_FAILED=1098 +RNGP_REF_CYCLE=1099 +RNGP_REF_NAME_INVALID=1100 +RNGP_REF_NO_DEF=1101 +RNGP_REF_NO_NAME=1102 +RNGP_REF_NOT_EMPTY=1103 +RNGP_START_CHOICE_AND_INTERLEAVE=1104 +RNGP_START_CONTENT=1105 +RNGP_START_EMPTY=1106 +RNGP_START_MISSING=1107 +RNGP_TEXT_EXPECTED=1108 +RNGP_TEXT_HAS_CHILD=1109 +RNGP_TYPE_MISSING=1110 +RNGP_TYPE_NOT_FOUND=1111 +RNGP_TYPE_VALUE=1112 +RNGP_UNKNOWN_ATTRIBUTE=1113 +RNGP_UNKNOWN_COMBINE=1114 +RNGP_UNKNOWN_CONSTRUCT=1115 +RNGP_UNKNOWN_TYPE_LIB=1116 +RNGP_URI_FRAGMENT=1117 +RNGP_URI_NOT_ABSOLUTE=1118 +RNGP_VALUE_EMPTY=1119 +RNGP_VALUE_NO_CONTENT=1120 +RNGP_XMLNS_NAME=1121 +RNGP_XML_NS=1122 +XPATH_EXPRESSION_OK=1200 +XPATH_NUMBER_ERROR=1201 +XPATH_UNFINISHED_LITERAL_ERROR=1202 +XPATH_START_LITERAL_ERROR=1203 +XPATH_VARIABLE_REF_ERROR=1204 +XPATH_UNDEF_VARIABLE_ERROR=1205 +XPATH_INVALID_PREDICATE_ERROR=1206 +XPATH_EXPR_ERROR=1207 +XPATH_UNCLOSED_ERROR=1208 +XPATH_UNKNOWN_FUNC_ERROR=1209 +XPATH_INVALID_OPERAND=1210 +XPATH_INVALID_TYPE=1211 +XPATH_INVALID_ARITY=1212 +XPATH_INVALID_CTXT_SIZE=1213 +XPATH_INVALID_CTXT_POSITION=1214 +XPATH_MEMORY_ERROR=1215 +XPTR_SYNTAX_ERROR=1216 +XPTR_RESOURCE_ERROR=1217 +XPTR_SUB_RESOURCE_ERROR=1218 +XPATH_UNDEF_PREFIX_ERROR=1219 +XPATH_ENCODING_ERROR=1220 +XPATH_INVALID_CHAR_ERROR=1221 +TREE_INVALID_HEX=1300 +TREE_INVALID_DEC=1301 +TREE_UNTERMINATED_ENTITY=1302 +SAVE_NOT_UTF8=1400 +SAVE_CHAR_INVALID=1401 +SAVE_NO_DOCTYPE=1402 +SAVE_UNKNOWN_ENCODING=1403 +REGEXP_COMPILE_ERROR=1450 +""", +"""\ +IO_UNKNOWN=1500 +IO_EACCES=1501 +IO_EAGAIN=1502 +IO_EBADF=1503 +IO_EBADMSG=1504 +IO_EBUSY=1505 +IO_ECANCELED=1506 +IO_ECHILD=1507 +IO_EDEADLK=1508 +IO_EDOM=1509 +IO_EEXIST=1510 +IO_EFAULT=1511 +IO_EFBIG=1512 +IO_EINPROGRESS=1513 +IO_EINTR=1514 +IO_EINVAL=1515 +IO_EIO=1516 +IO_EISDIR=1517 +IO_EMFILE=1518 +IO_EMLINK=1519 +IO_EMSGSIZE=1520 +IO_ENAMETOOLONG=1521 +IO_ENFILE=1522 +IO_ENODEV=1523 +IO_ENOENT=1524 +IO_ENOEXEC=1525 +IO_ENOLCK=1526 +IO_ENOMEM=1527 +IO_ENOSPC=1528 +IO_ENOSYS=1529 +IO_ENOTDIR=1530 +IO_ENOTEMPTY=1531 +IO_ENOTSUP=1532 +IO_ENOTTY=1533 +IO_ENXIO=1534 +IO_EPERM=1535 +IO_EPIPE=1536 +IO_ERANGE=1537 +IO_EROFS=1538 +IO_ESPIPE=1539 +IO_ESRCH=1540 +IO_ETIMEDOUT=1541 +IO_EXDEV=1542 +IO_NETWORK_ATTEMPT=1543 +IO_ENCODER=1544 +IO_FLUSH=1545 +IO_WRITE=1546 +IO_NO_INPUT=1547 +IO_BUFFER_FULL=1548 +IO_LOAD_ERROR=1549 +IO_ENOTSOCK=1550 +IO_EISCONN=1551 +IO_ECONNREFUSED=1552 +IO_ENETUNREACH=1553 +IO_EADDRINUSE=1554 +IO_EALREADY=1555 +IO_EAFNOSUPPORT=1556 +XINCLUDE_RECURSION=1600 +XINCLUDE_PARSE_VALUE=1601 +XINCLUDE_ENTITY_DEF_MISMATCH=1602 +XINCLUDE_NO_HREF=1603 +XINCLUDE_NO_FALLBACK=1604 +XINCLUDE_HREF_URI=1605 +XINCLUDE_TEXT_FRAGMENT=1606 +XINCLUDE_TEXT_DOCUMENT=1607 +XINCLUDE_INVALID_CHAR=1608 +XINCLUDE_BUILD_FAILED=1609 +XINCLUDE_UNKNOWN_ENCODING=1610 +XINCLUDE_MULTIPLE_ROOT=1611 +XINCLUDE_XPTR_FAILED=1612 +XINCLUDE_XPTR_RESULT=1613 +XINCLUDE_INCLUDE_IN_INCLUDE=1614 +XINCLUDE_FALLBACKS_IN_INCLUDE=1615 +XINCLUDE_FALLBACK_NOT_IN_INCLUDE=1616 +XINCLUDE_DEPRECATED_NS=1617 +XINCLUDE_FRAGMENT_ID=1618 +CATALOG_MISSING_ATTR=1650 +CATALOG_ENTRY_BROKEN=1651 +CATALOG_PREFER_VALUE=1652 +CATALOG_NOT_CATALOG=1653 +CATALOG_RECURSION=1654 +SCHEMAP_PREFIX_UNDEFINED=1700 +SCHEMAP_ATTRFORMDEFAULT_VALUE=1701 +SCHEMAP_ATTRGRP_NONAME_NOREF=1702 +SCHEMAP_ATTR_NONAME_NOREF=1703 +SCHEMAP_COMPLEXTYPE_NONAME_NOREF=1704 +SCHEMAP_ELEMFORMDEFAULT_VALUE=1705 +SCHEMAP_ELEM_NONAME_NOREF=1706 +SCHEMAP_EXTENSION_NO_BASE=1707 +SCHEMAP_FACET_NO_VALUE=1708 +SCHEMAP_FAILED_BUILD_IMPORT=1709 +SCHEMAP_GROUP_NONAME_NOREF=1710 +""", +"""\ +SCHEMAP_IMPORT_NAMESPACE_NOT_URI=1711 +SCHEMAP_IMPORT_REDEFINE_NSNAME=1712 +SCHEMAP_IMPORT_SCHEMA_NOT_URI=1713 +SCHEMAP_INVALID_BOOLEAN=1714 +SCHEMAP_INVALID_ENUM=1715 +SCHEMAP_INVALID_FACET=1716 +SCHEMAP_INVALID_FACET_VALUE=1717 +SCHEMAP_INVALID_MAXOCCURS=1718 +SCHEMAP_INVALID_MINOCCURS=1719 +SCHEMAP_INVALID_REF_AND_SUBTYPE=1720 +SCHEMAP_INVALID_WHITE_SPACE=1721 +SCHEMAP_NOATTR_NOREF=1722 +SCHEMAP_NOTATION_NO_NAME=1723 +SCHEMAP_NOTYPE_NOREF=1724 +SCHEMAP_REF_AND_SUBTYPE=1725 +SCHEMAP_RESTRICTION_NONAME_NOREF=1726 +SCHEMAP_SIMPLETYPE_NONAME=1727 +SCHEMAP_TYPE_AND_SUBTYPE=1728 +SCHEMAP_UNKNOWN_ALL_CHILD=1729 +SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD=1730 +SCHEMAP_UNKNOWN_ATTR_CHILD=1731 +SCHEMAP_UNKNOWN_ATTRGRP_CHILD=1732 +SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP=1733 +SCHEMAP_UNKNOWN_BASE_TYPE=1734 +SCHEMAP_UNKNOWN_CHOICE_CHILD=1735 +SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD=1736 +SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD=1737 +SCHEMAP_UNKNOWN_ELEM_CHILD=1738 +SCHEMAP_UNKNOWN_EXTENSION_CHILD=1739 +SCHEMAP_UNKNOWN_FACET_CHILD=1740 +SCHEMAP_UNKNOWN_FACET_TYPE=1741 +SCHEMAP_UNKNOWN_GROUP_CHILD=1742 +SCHEMAP_UNKNOWN_IMPORT_CHILD=1743 +SCHEMAP_UNKNOWN_LIST_CHILD=1744 +SCHEMAP_UNKNOWN_NOTATION_CHILD=1745 +SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD=1746 +SCHEMAP_UNKNOWN_REF=1747 +SCHEMAP_UNKNOWN_RESTRICTION_CHILD=1748 +SCHEMAP_UNKNOWN_SCHEMAS_CHILD=1749 +SCHEMAP_UNKNOWN_SEQUENCE_CHILD=1750 +SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD=1751 +SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD=1752 +SCHEMAP_UNKNOWN_TYPE=1753 +SCHEMAP_UNKNOWN_UNION_CHILD=1754 +SCHEMAP_ELEM_DEFAULT_FIXED=1755 +SCHEMAP_REGEXP_INVALID=1756 +SCHEMAP_FAILED_LOAD=1757 +SCHEMAP_NOTHING_TO_PARSE=1758 +SCHEMAP_NOROOT=1759 +SCHEMAP_REDEFINED_GROUP=1760 +SCHEMAP_REDEFINED_TYPE=1761 +SCHEMAP_REDEFINED_ELEMENT=1762 +SCHEMAP_REDEFINED_ATTRGROUP=1763 +SCHEMAP_REDEFINED_ATTR=1764 +SCHEMAP_REDEFINED_NOTATION=1765 +SCHEMAP_FAILED_PARSE=1766 +SCHEMAP_UNKNOWN_PREFIX=1767 +SCHEMAP_DEF_AND_PREFIX=1768 +SCHEMAP_UNKNOWN_INCLUDE_CHILD=1769 +SCHEMAP_INCLUDE_SCHEMA_NOT_URI=1770 +SCHEMAP_INCLUDE_SCHEMA_NO_URI=1771 +""", +"""\ +SCHEMAP_NOT_SCHEMA=1772 +SCHEMAP_UNKNOWN_MEMBER_TYPE=1773 +SCHEMAP_INVALID_ATTR_USE=1774 +SCHEMAP_RECURSIVE=1775 +SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE=1776 +SCHEMAP_INVALID_ATTR_COMBINATION=1777 +SCHEMAP_INVALID_ATTR_INLINE_COMBINATION=1778 +SCHEMAP_MISSING_SIMPLETYPE_CHILD=1779 +SCHEMAP_INVALID_ATTR_NAME=1780 +SCHEMAP_REF_AND_CONTENT=1781 +SCHEMAP_CT_PROPS_CORRECT_1=1782 +SCHEMAP_CT_PROPS_CORRECT_2=1783 +SCHEMAP_CT_PROPS_CORRECT_3=1784 +SCHEMAP_CT_PROPS_CORRECT_4=1785 +SCHEMAP_CT_PROPS_CORRECT_5=1786 +SCHEMAP_DERIVATION_OK_RESTRICTION_1=1787 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1=1788 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2=1789 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_2=1790 +SCHEMAP_DERIVATION_OK_RESTRICTION_3=1791 +SCHEMAP_WILDCARD_INVALID_NS_MEMBER=1792 +SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE=1793 +SCHEMAP_UNION_NOT_EXPRESSIBLE=1794 +SCHEMAP_SRC_IMPORT_3_1=1795 +SCHEMAP_SRC_IMPORT_3_2=1796 +SCHEMAP_DERIVATION_OK_RESTRICTION_4_1=1797 +SCHEMAP_DERIVATION_OK_RESTRICTION_4_2=1798 +SCHEMAP_DERIVATION_OK_RESTRICTION_4_3=1799 +SCHEMAP_COS_CT_EXTENDS_1_3=1800 +SCHEMAV_NOROOT=1801 +SCHEMAV_UNDECLAREDELEM=1802 +SCHEMAV_NOTTOPLEVEL=1803 +SCHEMAV_MISSING=1804 +SCHEMAV_WRONGELEM=1805 +SCHEMAV_NOTYPE=1806 +SCHEMAV_NOROLLBACK=1807 +SCHEMAV_ISABSTRACT=1808 +SCHEMAV_NOTEMPTY=1809 +SCHEMAV_ELEMCONT=1810 +SCHEMAV_HAVEDEFAULT=1811 +SCHEMAV_NOTNILLABLE=1812 +SCHEMAV_EXTRACONTENT=1813 +SCHEMAV_INVALIDATTR=1814 +SCHEMAV_INVALIDELEM=1815 +SCHEMAV_NOTDETERMINIST=1816 +SCHEMAV_CONSTRUCT=1817 +SCHEMAV_INTERNAL=1818 +SCHEMAV_NOTSIMPLE=1819 +SCHEMAV_ATTRUNKNOWN=1820 +SCHEMAV_ATTRINVALID=1821 +SCHEMAV_VALUE=1822 +SCHEMAV_FACET=1823 +SCHEMAV_CVC_DATATYPE_VALID_1_2_1=1824 +SCHEMAV_CVC_DATATYPE_VALID_1_2_2=1825 +SCHEMAV_CVC_DATATYPE_VALID_1_2_3=1826 +SCHEMAV_CVC_TYPE_3_1_1=1827 +SCHEMAV_CVC_TYPE_3_1_2=1828 +SCHEMAV_CVC_FACET_VALID=1829 +SCHEMAV_CVC_LENGTH_VALID=1830 +SCHEMAV_CVC_MINLENGTH_VALID=1831 +SCHEMAV_CVC_MAXLENGTH_VALID=1832 +SCHEMAV_CVC_MININCLUSIVE_VALID=1833 +SCHEMAV_CVC_MAXINCLUSIVE_VALID=1834 +""", +"""\ +SCHEMAV_CVC_MINEXCLUSIVE_VALID=1835 +SCHEMAV_CVC_MAXEXCLUSIVE_VALID=1836 +SCHEMAV_CVC_TOTALDIGITS_VALID=1837 +SCHEMAV_CVC_FRACTIONDIGITS_VALID=1838 +SCHEMAV_CVC_PATTERN_VALID=1839 +SCHEMAV_CVC_ENUMERATION_VALID=1840 +SCHEMAV_CVC_COMPLEX_TYPE_2_1=1841 +SCHEMAV_CVC_COMPLEX_TYPE_2_2=1842 +SCHEMAV_CVC_COMPLEX_TYPE_2_3=1843 +SCHEMAV_CVC_COMPLEX_TYPE_2_4=1844 +SCHEMAV_CVC_ELT_1=1845 +SCHEMAV_CVC_ELT_2=1846 +SCHEMAV_CVC_ELT_3_1=1847 +SCHEMAV_CVC_ELT_3_2_1=1848 +SCHEMAV_CVC_ELT_3_2_2=1849 +SCHEMAV_CVC_ELT_4_1=1850 +SCHEMAV_CVC_ELT_4_2=1851 +SCHEMAV_CVC_ELT_4_3=1852 +SCHEMAV_CVC_ELT_5_1_1=1853 +SCHEMAV_CVC_ELT_5_1_2=1854 +SCHEMAV_CVC_ELT_5_2_1=1855 +SCHEMAV_CVC_ELT_5_2_2_1=1856 +SCHEMAV_CVC_ELT_5_2_2_2_1=1857 +SCHEMAV_CVC_ELT_5_2_2_2_2=1858 +SCHEMAV_CVC_ELT_6=1859 +SCHEMAV_CVC_ELT_7=1860 +SCHEMAV_CVC_ATTRIBUTE_1=1861 +SCHEMAV_CVC_ATTRIBUTE_2=1862 +SCHEMAV_CVC_ATTRIBUTE_3=1863 +SCHEMAV_CVC_ATTRIBUTE_4=1864 +SCHEMAV_CVC_COMPLEX_TYPE_3_1=1865 +SCHEMAV_CVC_COMPLEX_TYPE_3_2_1=1866 +SCHEMAV_CVC_COMPLEX_TYPE_3_2_2=1867 +SCHEMAV_CVC_COMPLEX_TYPE_4=1868 +SCHEMAV_CVC_COMPLEX_TYPE_5_1=1869 +SCHEMAV_CVC_COMPLEX_TYPE_5_2=1870 +SCHEMAV_ELEMENT_CONTENT=1871 +SCHEMAV_DOCUMENT_ELEMENT_MISSING=1872 +SCHEMAV_CVC_COMPLEX_TYPE_1=1873 +SCHEMAV_CVC_AU=1874 +SCHEMAV_CVC_TYPE_1=1875 +SCHEMAV_CVC_TYPE_2=1876 +SCHEMAV_CVC_IDC=1877 +SCHEMAV_CVC_WILDCARD=1878 +XPTR_UNKNOWN_SCHEME=1900 +XPTR_CHILDSEQ_START=1901 +XPTR_EVAL_FAILED=1902 +XPTR_EXTRA_OBJECTS=1903 +C14N_CREATE_CTXT=1950 +C14N_REQUIRES_UTF8=1951 +C14N_CREATE_STACK=1952 +C14N_INVALID_NODE=1953 +C14N_UNKNOW_NODE=1954 +C14N_RELATIVE_NAMESPACE=1955 +FTP_PASV_ANSWER=2000 +FTP_EPSV_ANSWER=2001 +FTP_ACCNT=2002 +FTP_URL_SYNTAX=2003 +HTTP_URL_SYNTAX=2020 +HTTP_USE_IP=2021 +HTTP_UNKNOWN_HOST=2022 +SCHEMAP_SRC_SIMPLE_TYPE_1=3000 +SCHEMAP_SRC_SIMPLE_TYPE_2=3001 +SCHEMAP_SRC_SIMPLE_TYPE_3=3002 +SCHEMAP_SRC_SIMPLE_TYPE_4=3003 +SCHEMAP_SRC_RESOLVE=3004 +SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE=3005 +SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE=3006 +SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 +""", +"""\ +SCHEMAP_ST_PROPS_CORRECT_1=3008 +SCHEMAP_ST_PROPS_CORRECT_2=3009 +SCHEMAP_ST_PROPS_CORRECT_3=3010 +SCHEMAP_COS_ST_RESTRICTS_1_1=3011 +SCHEMAP_COS_ST_RESTRICTS_1_2=3012 +SCHEMAP_COS_ST_RESTRICTS_1_3_1=3013 +SCHEMAP_COS_ST_RESTRICTS_1_3_2=3014 +SCHEMAP_COS_ST_RESTRICTS_2_1=3015 +SCHEMAP_COS_ST_RESTRICTS_2_3_1_1=3016 +SCHEMAP_COS_ST_RESTRICTS_2_3_1_2=3017 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_1=3018 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_2=3019 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_3=3020 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_4=3021 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_5=3022 +SCHEMAP_COS_ST_RESTRICTS_3_1=3023 +SCHEMAP_COS_ST_RESTRICTS_3_3_1=3024 +SCHEMAP_COS_ST_RESTRICTS_3_3_1_2=3025 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_2=3026 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_1=3027 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_3=3028 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_4=3029 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_5=3030 +SCHEMAP_COS_ST_DERIVED_OK_2_1=3031 +SCHEMAP_COS_ST_DERIVED_OK_2_2=3032 +SCHEMAP_S4S_ELEM_NOT_ALLOWED=3033 +SCHEMAP_S4S_ELEM_MISSING=3034 +SCHEMAP_S4S_ATTR_NOT_ALLOWED=3035 +SCHEMAP_S4S_ATTR_MISSING=3036 +SCHEMAP_S4S_ATTR_INVALID_VALUE=3037 +SCHEMAP_SRC_ELEMENT_1=3038 +SCHEMAP_SRC_ELEMENT_2_1=3039 +SCHEMAP_SRC_ELEMENT_2_2=3040 +SCHEMAP_SRC_ELEMENT_3=3041 +SCHEMAP_P_PROPS_CORRECT_1=3042 +SCHEMAP_P_PROPS_CORRECT_2_1=3043 +SCHEMAP_P_PROPS_CORRECT_2_2=3044 +SCHEMAP_E_PROPS_CORRECT_2=3045 +SCHEMAP_E_PROPS_CORRECT_3=3046 +SCHEMAP_E_PROPS_CORRECT_4=3047 +SCHEMAP_E_PROPS_CORRECT_5=3048 +SCHEMAP_E_PROPS_CORRECT_6=3049 +SCHEMAP_SRC_INCLUDE=3050 +SCHEMAP_SRC_ATTRIBUTE_1=3051 +SCHEMAP_SRC_ATTRIBUTE_2=3052 +SCHEMAP_SRC_ATTRIBUTE_3_1=3053 +SCHEMAP_SRC_ATTRIBUTE_3_2=3054 +SCHEMAP_SRC_ATTRIBUTE_4=3055 +SCHEMAP_NO_XMLNS=3056 +SCHEMAP_NO_XSI=3057 +SCHEMAP_COS_VALID_DEFAULT_1=3058 +SCHEMAP_COS_VALID_DEFAULT_2_1=3059 +SCHEMAP_COS_VALID_DEFAULT_2_2_1=3060 +SCHEMAP_COS_VALID_DEFAULT_2_2_2=3061 +SCHEMAP_CVC_SIMPLE_TYPE=3062 +SCHEMAP_COS_CT_EXTENDS_1_1=3063 +SCHEMAP_SRC_IMPORT_1_1=3064 +SCHEMAP_SRC_IMPORT_1_2=3065 +SCHEMAP_SRC_IMPORT_2=3066 +SCHEMAP_SRC_IMPORT_2_1=3067 +""", +"""\ +SCHEMAP_SRC_IMPORT_2_2=3068 +SCHEMAP_INTERNAL=3069 +SCHEMAP_NOT_DETERMINISTIC=3070 +SCHEMAP_SRC_ATTRIBUTE_GROUP_1=3071 +SCHEMAP_SRC_ATTRIBUTE_GROUP_2=3072 +SCHEMAP_SRC_ATTRIBUTE_GROUP_3=3073 +SCHEMAP_MG_PROPS_CORRECT_1=3074 +SCHEMAP_MG_PROPS_CORRECT_2=3075 +SCHEMAP_SRC_CT_1=3076 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3=3077 +SCHEMAP_AU_PROPS_CORRECT_2=3078 +SCHEMAP_A_PROPS_CORRECT_2=3079 +SCHEMAP_C_PROPS_CORRECT=3080 +SCHEMAP_SRC_REDEFINE=3081 +SCHEMAP_SRC_IMPORT=3082 +SCHEMAP_WARN_SKIP_SCHEMA=3083 +SCHEMAP_WARN_UNLOCATED_SCHEMA=3084 +SCHEMAP_WARN_ATTR_REDECL_PROH=3085 +SCHEMAP_WARN_ATTR_POINTLESS_PROH=3086 +SCHEMAP_AG_PROPS_CORRECT=3087 +SCHEMAP_COS_CT_EXTENDS_1_2=3088 +SCHEMAP_AU_PROPS_CORRECT=3089 +SCHEMAP_A_PROPS_CORRECT_3=3090 +SCHEMAP_COS_ALL_LIMITED=3091 +MODULE_OPEN=4900 +MODULE_CLOSE=4901 +CHECK_FOUND_ELEMENT=5000 +CHECK_FOUND_ATTRIBUTE=5001 +CHECK_FOUND_TEXT=5002 +CHECK_FOUND_CDATA=5003 +CHECK_FOUND_ENTITYREF=5004 +CHECK_FOUND_ENTITY=5005 +CHECK_FOUND_PI=5006 +CHECK_FOUND_COMMENT=5007 +CHECK_FOUND_DOCTYPE=5008 +CHECK_FOUND_FRAGMENT=5009 +CHECK_FOUND_NOTATION=5010 +CHECK_UNKNOWN_NODE=5011 +CHECK_ENTITY_TYPE=5012 +CHECK_NO_PARENT=5013 +CHECK_NO_DOC=5014 +CHECK_NO_NAME=5015 +CHECK_NO_ELEM=5016 +CHECK_WRONG_DOC=5017 +CHECK_NO_PREV=5018 +CHECK_WRONG_PREV=5019 +CHECK_NO_NEXT=5020 +CHECK_WRONG_NEXT=5021 +CHECK_NOT_DTD=5022 +CHECK_NOT_ATTR=5023 +CHECK_NOT_ATTR_DECL=5024 +CHECK_NOT_ELEM_DECL=5025 +CHECK_NOT_ENTITY_DECL=5026 +CHECK_NOT_NS_DECL=5027 +CHECK_NO_HREF=5028 +CHECK_WRONG_PARENT=5029 +CHECK_NS_SCOPE=5030 +CHECK_NS_ANCESTOR=5031 +CHECK_NOT_UTF8=5032 +CHECK_NO_DICT=5033 +CHECK_NOT_NCNAME=5034 +CHECK_OUTSIDE_DICT=5035 +CHECK_WRONG_NAME=5036 +CHECK_NAME_NOT_NULL=5037 +I18N_NO_NAME=6000 +I18N_NO_HANDLER=6001 +I18N_EXCESS_HANDLER=6002 +I18N_CONV_FAILED=6003 +I18N_NO_OUTPUT=6004 +CHECK_=6005 +CHECK_X=6006 """,) # --- END: GENERATED CONSTANTS --- Modified: lxml/trunk/update-error-constants.py ============================================================================== --- lxml/trunk/update-error-constants.py (original) +++ lxml/trunk/update-error-constants.py Sat Jun 3 11:17:09 2006 @@ -17,20 +17,17 @@ sys.path.insert(0, 'src') from lxml import etree +# map enum name to Python variable name and alignment for constant name ENUM_MAP = { - 'xmlErrorLevel' : '__ERROR_LEVELS', - 'xmlErrorDomain' : '__ERROR_DOMAINS', - 'xmlParserErrors' : '__ERROR_TYPES' + 'xmlErrorLevel' : ('__ERROR_LEVELS', 'XML_ERR_'), + 'xmlErrorDomain' : ('__ERROR_DOMAINS', 'XML_FROM_'), + 'xmlParserErrors' : ('__ERROR_TYPES', 'XML_') } ENUM_ORDER = ('xmlErrorLevel', 'xmlErrorDomain', 'xmlParserErrors') COMMENT = """ # This section is generated by the script '%s'. -# -# Constants are stored in tuples of strings, for which Pyrex generates very -# efficient setup code. To parse them, iterate over the tuples and parse each -# line in each string independently. """ % os.path.basename(sys.argv[0]) @@ -91,32 +88,42 @@ pxd_result = [] append_pxd = pxd_result.append +append_pxd('cdef extern from "libxml/xmlerror.h":') +append_pxi('''\ +# Constants are stored in tuples of strings, for which Pyrex generates very +# efficient setup code. To parse them, iterate over the tuples and parse each +# line in each string independently. +''') + ctypedef_indent = ' '*4 constant_indent = ctypedef_indent*2 -append_pxd('cdef extern from "libxml/xmlerror.h":') for enum_name in ENUM_ORDER: constants = enum_dict[enum_name] - pxi_name = ENUM_MAP[enum_name] + pxi_name, prefix = ENUM_MAP[enum_name] append_pxd(ctypedef_indent + 'ctypedef enum %s:' % enum_name) append_pxi('cdef object %s' % pxi_name) append_pxi('%s = ("""\\' % pxi_name) - length = 0 + + prefix_len = len(prefix) + length = 2 # each string ends with '\n\0' for name, val, descr in constants: if descr: - line = "%-50s = %7d # %s" % (name, val, descr) + line = '%-50s = %7d # %s' % (name, val, descr) else: - line = "%-50s = %7d" % (name, val) - + line = '%-50s = %7d' % (name, val) append_pxd(constant_indent + line) - if length + len(line) > 2000: # max string length in MSVC + if name[:prefix_len] == prefix and len(name) > prefix_len: + name = name[prefix_len:] + line = '%s=%d' % (name, val) + if length + len(line) >= 2040: # max string length in MSVC is 2048 append_pxi('""",') append_pxi('"""\\') - length = 0 + length = 2 # each string ends with '\n\0' append_pxi(line) - length += len(line) + 1 + length += len(line) + 2 # + '\n\0' append_pxd('') append_pxi('""",)') From scoder at codespeak.net Sat Jun 3 13:31:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 13:31:56 +0200 (CEST) Subject: [Lxml-checkins] r28153 - in lxml/trunk: . doc Message-ID: <20060603113156.4EFFB1006B@code0.codespeak.net> Author: scoder Date: Sat Jun 3 13:31:54 2006 New Revision: 28153 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/FAQ.txt lxml/trunk/doc/api.txt Log: documentation cleanup, TOC in api.txt, new FAQ entry on prefixes vs. namespaces (first try) Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sat Jun 3 13:31:54 2006 @@ -39,7 +39,7 @@ * PyErrorLog for error logging through the Python ``logging`` module -* ``element.getroottree()`` returns an ElementTree for the root node of the +* ``Element.getroottree()`` returns an ElementTree for the root node of the document that contains the element. * ElementTree.getpath(element) returns a simple, absolute XPath expression to Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Sat Jun 3 13:31:54 2006 @@ -31,17 +31,10 @@ #) My application crashes! Why does lxml.etree do that? - a) If you are using threads, make sure that you are not sharing non - thread-safe objects between threads. Especially the default parser, - XSLT() and the validators are not thread-safe for performance reasons. - You have to create a new one for each thread, use a thread-safe object - pool or assure thread-safe access to them yourself. - - b) One of the goals of lxml is "no segfaults", so if there is no clear - warning in the documentation that you were doing something potentially - harmful, you have found a bug and we would like to hear about it. - Please report this bug to the mailing list. See the next section on how - to do that. + One of the goals of lxml is "no segfaults", so if there is no clear warning + in the documentation that you were doing something potentially harmful, you + have found a bug and we would like to hear about it. Please report this + bug to the mailing list. See the next section on how to do that. #) I think I have found a bug in lxml. What should I do? @@ -92,6 +85,22 @@ lxml can add fresh whitespace to the XML tree to indent it. +#) How can I find out which namespace prefixes are used in a document? + + You can traverse the document (``getiterator()``) and collect the prefix + attributes from all Elements into a set. However, it is unlikely that you + really want to do that. You do not need these prefixes, honestly. You + only need the namespace URIs. All namespace comparisons use these, so feel + free to make up your own prefixes when you use XPath expressions or + extension functions. + + The only place where you might consider specifying prefixes is the + serialization of Elements that were created through the API. Here, you can + specify a prefix mapping through the ``nsmap`` argument when creating the + root Element. Its children will then inherit this prefix for + serialization. + + #) What are the ``findall()`` and ``xpath()`` methods on Element(Tree)? ``findall()`` is part of the original `ElementTree API`_. It supports a Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Sat Jun 3 13:31:54 2006 @@ -5,6 +5,21 @@ lxml tries to follow established APIs wherever possible. Sometimes, however, the need to expose a feature in an easy way led to the invention of a new API. +.. contents:: +.. + 1 lxml.etree + 2 Trees and Documents + 3 Parsers + 4 Error handling on exceptions + 5 Python unicode strings + 6 xpath method on ElementTree, Element + 7 XSLT + 8 RelaxNG + 9 XMLSchema + 10 xinclude + 11 write_c14n on ElementTree + + lxml.etree ---------- From scoder at codespeak.net Sat Jun 3 16:46:43 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 16:46:43 +0200 (CEST) Subject: [Lxml-checkins] r28170 - lxml/trunk/src/lxml Message-ID: <20060603144643.22C6F10070@code0.codespeak.net> Author: scoder Date: Sat Jun 3 16:46:41 2006 New Revision: 28170 Modified: lxml/trunk/src/lxml/xpath.pxi Log: docstring updates and cleanup in xpath.pxi, made all XPath evaluators callable, renamed XPathEvaluatorBase to _XPathEvaluatorBase to make clear it's an internal class Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Sat Jun 3 16:46:41 2006 @@ -47,7 +47,7 @@ cdef void _setupDict(xpath.xmlXPathContext* xpathCtxt): __GLOBAL_PARSER_CONTEXT._initXPathParserDict(xpathCtxt) -cdef class XPathEvaluatorBase: +cdef class _XPathEvaluatorBase: cdef xpath.xmlXPathContext* _xpathCtxt cdef _XPathContext _context @@ -58,6 +58,17 @@ if self._xpathCtxt is not NULL: xpath.xmlXPathFreeContext(self._xpathCtxt) + def evaluate(self, _eval_arg, **_variables): + """Evaluate an XPath expression. + + Instead of calling this method, you can also call the evaluator object + itself. + + Variables may be provided as keyword arguments. Note that namespaces + are currently not supported for variables. + """ + return self(_eval_arg, **_variables) + cdef int _checkAbsolutePath(self, char* path): cdef char c if path is NULL: @@ -97,7 +108,7 @@ return result -cdef class XPathElementEvaluator(XPathEvaluatorBase): +cdef class XPathElementEvaluator(_XPathEvaluatorBase): """Create an XPath evaluator for an element. Absolute XPath expressions (starting with '/') will be evaluated against @@ -117,7 +128,7 @@ raise XPathContextError, "Unable to create new XPath context" _setupDict(xpathCtxt) self._element = element - XPathEvaluatorBase.__init__(self, namespaces, extensions) + _XPathEvaluatorBase.__init__(self, namespaces, extensions) def registerNamespace(self, prefix, uri): """Register a namespace with the XPath context. @@ -131,7 +142,7 @@ for prefix, uri in namespaces.items(): add(prefix, uri) - def evaluate(self, _path, **_variables): + def __call__(self, _path, **_variables): """Evaluate an XPath expression on the document. Variables may be provided as keyword arguments. Note that namespaces @@ -168,7 +179,7 @@ XPathElementEvaluator.__init__( self, etree._context_node, namespaces, extensions) - def evaluate(self, _path, **_variables): + def __call__(self, _path, **_variables): """Evaluate an XPath expression on the document. Variables may be provided as keyword arguments. Note that namespaces @@ -197,7 +208,10 @@ def XPathEvaluator(etree_or_element, namespaces=None, extensions=None): - """Creates and XPath evaluator for an ElementTree or an Element. + """Creates an XPath evaluator for an ElementTree or an Element. + + The resulting object can be called with an XPath expression as argument + and XPath variables provided as keyword arguments. XPath evaluators must not be shared between threads. """ @@ -207,20 +221,25 @@ return XPathElementEvaluator(etree_or_element, namespaces, extensions) -cdef class XPath(XPathEvaluatorBase): +cdef class XPath(_XPathEvaluatorBase): + """A compiled XPath expression that can be called on Elements and + ElementTrees. + + Besides the XPath expression, you can pass namespace mappings and + extensions to the constructor through the keyword arguments ``namespaces`` + and ``extensions``. + """ cdef xpath.xmlXPathCompExpr* _xpath cdef readonly object path def __init__(self, path, namespaces=None, extensions=None): - cdef char* c_path - XPathEvaluatorBase.__init__(self, namespaces, extensions, None) + _XPathEvaluatorBase.__init__(self, namespaces, extensions) self._xpath = NULL self.path = path path = _utf8(path) - c_path = _cstr(path) self._xpathCtxt = xpath.xmlXPathNewContext(NULL) _setupDict(self._xpathCtxt) - self._xpath = xpath.xmlXPathCtxtCompile(self._xpathCtxt, c_path) + self._xpath = xpath.xmlXPathCtxtCompile(self._xpathCtxt, _cstr(path)) if self._xpath is NULL: self._raise_parse_error() @@ -235,7 +254,7 @@ element = _rootNodeOrRaise(_etree_or_element) xpathCtxt = self._xpathCtxt - xpathCtxt.doc = document._c_doc + xpathCtxt.doc = document._c_doc xpathCtxt.node = element._c_node context = self._context @@ -247,9 +266,6 @@ context.unregister_context() return self._handle_result(xpathObj, document) - def evaluate(self, _tree, **_variables): - return self(_tree, **_variables) - def __dealloc__(self): if self._xpath is not NULL: xpath.xmlXPathFreeCompExpr(self._xpath) From scoder at codespeak.net Sat Jun 3 16:51:06 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 3 Jun 2006 16:51:06 +0200 (CEST) Subject: [Lxml-checkins] r28171 - lxml/trunk/doc Message-ID: <20060603145106.6F68510070@code0.codespeak.net> Author: scoder Date: Sat Jun 3 16:51:04 2006 New Revision: 28171 Modified: lxml/trunk/doc/api.txt Log: doc updates on XPath and xpath() Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Sat Jun 3 16:51:04 2006 @@ -12,7 +12,7 @@ 3 Parsers 4 Error handling on exceptions 5 Python unicode strings - 6 xpath method on ElementTree, Element + 6 XPath 7 XSLT 8 RelaxNG 9 XMLSchema @@ -268,14 +268,22 @@ Note that using ``tostring()`` with UTF-8 is also typically faster. -xpath method on ElementTree, Element ------------------------------------- +XPath +----- lxml.etree supports the simple path syntax of the ``findall()`` etc. methods on ElementTree and Element, as known from the original ElementTree library. As an extension, these classes also provide an ``xpath()`` method that supports expressions in the complete XPath syntax. +There are also specialized XPath evaluator classes that are more efficient for +frequent evaluation: ``XPath`` and ``XPathEvaluator``. See the `performance +comparison`_ to learn when to use which. Their semantics when used on +Elements and ElementTrees are the same as for the ``xpath()`` method described +here. + +.. _`performance comparison`: performance.html#xpath + For ElementTree, the xpath method performs a global XPath query against the document (if absolute) or against the root node (if relative):: @@ -335,7 +343,8 @@ .. _`extension functions`: extensions.html -The return values of xpath vary, depending on the XPath expression used: +The return values of XPath evaluations vary, depending on the XPath expression +used: * True or False, when the XPath expression has a boolean result @@ -343,12 +352,11 @@ * a (unicode) string, when the XPath expression has a string result. -* a list of items, when the XPath expression has a list as result. The - items may include element nodes, strings. When the nodeset would - contain text nodes or attributes, the node result is also a string - (the text node content or attribute value). When the nodeset would - contain a comment, the result contains a string as well, inside - ```` markers. +* a list of items, when the XPath expression has a list as result. The items + may include elements and strings. Text nodes and attributes in the result + are returned as strings (the text node content or attribute value). Comments + are also returned as strings, enclosed by the usual ```` + markers. A related convenience method of ElementTree objects is ``getpath(element)``, which returns a structural, absolute XPath expression to find that element:: From scoder at codespeak.net Sun Jun 4 09:11:23 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 09:11:23 +0200 (CEST) Subject: [Lxml-checkins] r28206 - lxml/trunk/src/lxml Message-ID: <20060604071123.BBEE110069@code0.codespeak.net> Author: scoder Date: Sun Jun 4 09:11:19 2006 New Revision: 28206 Modified: lxml/trunk/src/lxml/sax.py Log: fixed ElementTreeProducer to call startDocument() and endDocument() Modified: lxml/trunk/src/lxml/sax.py ============================================================================== --- lxml/trunk/src/lxml/sax.py (original) +++ lxml/trunk/src/lxml/sax.py Sun Jun 4 09:11:19 2006 @@ -122,7 +122,9 @@ self._empty_attributes = attr_class({}, {}) def saxify(self): + self._content_handler.startDocument() self._recursive_saxify(self._element, {}) + self._content_handler.endDocument() def _recursive_saxify(self, element, prefixes): new_prefixes = [] From scoder at codespeak.net Sun Jun 4 09:12:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 09:12:13 +0200 (CEST) Subject: [Lxml-checkins] r28207 - lxml/trunk/src/lxml/tests Message-ID: <20060604071213.9ED0910069@code0.codespeak.net> Author: scoder Date: Sun Jun 4 09:12:11 2006 New Revision: 28207 Modified: lxml/trunk/src/lxml/tests/test_sax.py Log: cleanup in test_sax.py, new test case that builds a minidom through pulldom Modified: lxml/trunk/src/lxml/tests/test_sax.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_sax.py (original) +++ lxml/trunk/src/lxml/tests/test_sax.py Sun Jun 4 09:12:11 2006 @@ -9,6 +9,7 @@ from common_imports import HelperTestCase from lxml import sax +from xml.dom import pulldom class ETreeSaxTestCase(HelperTestCase): @@ -34,19 +35,38 @@ tree = self.parse('abbbba') new_tree = self._saxify_unsaxify(tree) root = new_tree.getroot() - self.assertEqual(root.tag, - '{bla}a') - self.assertEqual(root[0].tag, - '{bla}b') + self.assertEqual('{bla}a', + root.tag) + self.assertEqual('{bla}b', + root[0].tag) def test_etree_sax_ns2(self): tree = self.parse('abbbba') new_tree = self._saxify_unsaxify(tree) root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - '{blaB}b') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('{blaB}b', + root[0].tag) + + def test_sax_to_pulldom(self): + tree = self.parse('abbbba') + handler = pulldom.SAX2DOM() + sax.saxify(tree, handler) + dom = handler.document + + self.assertEqual('a', + dom.firstChild.localName) + self.assertEqual('blaA', + dom.firstChild.namespaceURI) + + children = dom.firstChild.childNodes + self.assertEqual('ab', + children[0].nodeValue) + self.assertEqual('blaB', + children[1].namespaceURI) + self.assertEqual('ba', + children[2].nodeValue) def test_element_sax(self): tree = self.parse('') @@ -68,17 +88,17 @@ new_tree = self._saxify_unsaxify(a) root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - 'b') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('b', + root[0].tag) new_tree = self._saxify_unsaxify(b) root = new_tree.getroot() - self.assertEqual(root.tag, - 'b') - self.assertEqual(len(root), - 0) + self.assertEqual('b', + root.tag) + self.assertEqual(0, + len(root)) def test_etree_sax_handler_default_ns(self): handler = sax.ElementTreeContentHandler() @@ -97,12 +117,12 @@ new_tree = handler.etree root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - '{blaB}b') - self.assertEqual(root[1].tag, - '{blaA}c') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('{blaB}b', + root[0].tag) + self.assertEqual('{blaA}c', + root[1].tag) def test_etree_sax_redefine_ns(self): handler = sax.ElementTreeContentHandler() @@ -121,12 +141,12 @@ new_tree = handler.etree root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - '{blaB}b') - self.assertEqual(root[1].tag, - '{blaA}c') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('{blaB}b', + root[0].tag) + self.assertEqual('{blaA}c', + root[1].tag) def test_etree_sax_no_ns(self): handler = sax.ElementTreeContentHandler() @@ -141,9 +161,9 @@ new_tree = handler.etree root = new_tree.getroot() - self.assertEqual(root.tag, 'a') - self.assertEqual(root[0].tag, 'b') - self.assertEqual(root[1].tag, 'c') + self.assertEqual('a', root.tag) + self.assertEqual('b', root[0].tag) + self.assertEqual('c', root[1].tag) def test_etree_sax_error(self): handler = sax.ElementTreeContentHandler() From scoder at codespeak.net Sun Jun 4 09:54:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 09:54:31 +0200 (CEST) Subject: [Lxml-checkins] r28208 - in lxml/trunk: . doc Message-ID: <20060604075431.9F79010070@code0.codespeak.net> Author: scoder Date: Sun Jun 4 09:54:30 2006 New Revision: 28208 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/sax.txt Log: cleanup in sax.txt, describe how to generate a minidom from lxml Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Jun 4 09:54:30 2006 @@ -16,6 +16,8 @@ Bugs fixed ---------- +* lxml.sax.ElementTreeProducer did not call startDocument() / endDocument() + * MSVC compiler complained about long strings (supports only 2048 bytes) Modified: lxml/trunk/doc/sax.txt ============================================================================== --- lxml/trunk/doc/sax.txt (original) +++ lxml/trunk/doc/sax.txt Sun Jun 4 09:54:30 2006 @@ -7,15 +7,47 @@ compatible with that in the Python core (xml.sax), so is useful for interfacing lxml with code that uses the Python core SAX facilities. +.. contents:: +.. + 1 Building a tree from SAX events + 2 Producing SAX events from an ElementTree or Element + 3 Interfacing with pulldom/minidom + + +Building a tree from SAX events +------------------------------- + +First of all, lxml has support for building a new tree given SAX events. To +do this, we use the special SAX content handler defined by lxml named +``lxml.sax.ElementTreeContentHandler``:: + + >>> import lxml.sax + >>> handler = lxml.sax.ElementTreeContentHandler() + +Now let's fire some SAX events at it:: + + >>> handler.startElementNS((None, 'a'), 'a', {}) + >>> handler.startElementNS((None, 'b'), 'b', {(None, 'foo'): 'bar'}) + >>> handler.characters('Hello world') + >>> handler.endElementNS((None, 'b'), 'b') + >>> handler.endElementNS((None, 'a'), 'a') + +This constructs an equivalent tree. You can access it through the ``etree`` +property of the handler:: + + >>> tree = handler.etree + >>> lxml.etree.tostring(tree.getroot()) + 'Hello world' + + Producing SAX events from an ElementTree or Element --------------------------------------------------- Let's make a tree we can generate SAX events for:: >>> from StringIO import StringIO - >>> import lxml >>> f = StringIO('Text') - >>> doc = lxml.etree.parse(f) + >>> tree = lxml.etree.parse(f) To see whether the correct SAX events are produced, we'll write a custom content handler:: @@ -41,7 +73,7 @@ handler:: >>> handler = MyContentHandler() - >>> lxml.sax.saxify(doc, handler) + >>> lxml.sax.saxify(tree, handler) This is what we expect:: @@ -52,32 +84,22 @@ >>> handler.text 'Text' -Building a tree from SAX events -------------------------------- - -lxml also has support for building a new tree given SAX events. To do -this, we use the special SAX content handler defined by lxml named -`ElementTreeContentHandler`. - -Let's make this content handler:: - - >>> handler = lxml.sax.ElementTreeContentHandler() - -Now let's fire some SAX events at it:: - - >>> handler.startElementNS((None, 'a'), 'a', {}) - >>> handler.startElementNS((None, 'b'), 'b', {(None, 'foo'): 'bar'}) - >>> handler.characters('Hello world') - >>> handler.endElementNS((None, 'b'), 'b') - >>> handler.endElementNS((None, 'a'), 'a') -We can now get the tree by accessing the `etree` property on the -handler:: +Interfacing with pulldom/minidom +-------------------------------- - >>> tree = handler.etree - >>> lxml.etree.tostring(tree.getroot()) - 'Hello world' +lxml.sax is a simple way to interface with the standard XML support in the +Python library. Note, however, that this is a one-way solution, as Python's +DOM implementation connot generate SAX events from a DOM tree. +You can use xml.dom.pulldom to build a minidom from lxml:: + >>> from xml.dom.pulldom import SAX2DOM + >>> handler = SAX2DOM() + >>> lxml.sax.saxify(tree, handler) +PullDOM makes the result available through the ``document`` attribute:: + >>> dom = handler.document + >>> print dom.firstChild.localName + a From scoder at codespeak.net Sun Jun 4 11:00:34 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 11:00:34 +0200 (CEST) Subject: [Lxml-checkins] r28213 - lxml/trunk/doc Message-ID: <20060604090034.CB28E10070@code0.codespeak.net> Author: scoder Date: Sun Jun 4 11:00:33 2006 New Revision: 28213 Added: lxml/trunk/doc/publish.py - copied unchanged from r28212, lxml/www/publish.py Log: copied www/publish.py to the trunk to integrate with the build process From scoder at codespeak.net Sun Jun 4 11:18:57 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 11:18:57 +0200 (CEST) Subject: [Lxml-checkins] r28220 - in lxml/trunk: . doc Message-ID: <20060604091857.C8C2310074@code0.codespeak.net> Author: scoder Date: Sun Jun 4 11:18:56 2006 New Revision: 28220 Added: lxml/trunk/doc/mkhtml.py - copied, changed from r28213, lxml/trunk/doc/publish.py Removed: lxml/trunk/doc/publish.py Modified: lxml/trunk/MANIFEST.in lxml/trunk/Makefile lxml/trunk/version.txt Log: integrate publish.py from svn/lxml/www as doc/mkhtml.py, new make target: make html Modified: lxml/trunk/MANIFEST.in ============================================================================== --- lxml/trunk/MANIFEST.in (original) +++ lxml/trunk/MANIFEST.in Sun Jun 4 11:18:56 2006 @@ -5,5 +5,5 @@ include CHANGES.txt CREDITS.txt INSTALL.txt LICENSES.txt README.txt TODO.txt recursive-include src *.pyx *.pxd *.pxi *.py etree.c etree.h recursive-include src/lxml/tests *.rng *.xslt *.xml -recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc +recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc mkhtml.py exclude doc/pyrex.txt Modified: lxml/trunk/Makefile ============================================================================== --- lxml/trunk/Makefile (original) +++ lxml/trunk/Makefile Sun Jun 4 11:18:56 2006 @@ -27,6 +27,10 @@ ftest_inplace: inplace $(PYTHON) test.py -f $(TESTFLAGS) $(TESTOPTS) +html: + mkdir -p doc/html + $(PYTHON) doc/mkhtml.py doc/html . `cat version.txt` + # XXX What should the default be? test: test_inplace Copied: lxml/trunk/doc/mkhtml.py (from r28213, lxml/trunk/doc/publish.py) ============================================================================== --- lxml/trunk/doc/publish.py (original) +++ lxml/trunk/doc/mkhtml.py Sun Jun 4 11:18:56 2006 @@ -3,14 +3,16 @@ def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) - stylesheet_url = 'style.css' + + doc_dir = os.path.join(lxml_path, 'doc') + stylesheet_url = os.path.join(doc_dir, 'style.css') shutil.copy(stylesheet_url, dirname) for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', 'build.txt', 'FAQ.txt', 'performance.txt', 'resolvers.txt']: - path = os.path.join(lxml_path, 'doc', name) + path = os.path.join(doc_dir, name) outname = os.path.splitext(name)[0] + '.html' outpath = os.path.join(dirname, outname) Deleted: /lxml/trunk/doc/publish.py ============================================================================== --- /lxml/trunk/doc/publish.py Sun Jun 4 11:18:56 2006 +++ (empty file) @@ -1,35 +0,0 @@ -import os, shutil, sys - -def publish(dirname, lxml_path, release): - if not os.path.exists(dirname): - os.mkdir(dirname) - stylesheet_url = 'style.css' - - shutil.copy(stylesheet_url, dirname) - - for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', - 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', - 'build.txt', 'FAQ.txt', 'performance.txt', 'resolvers.txt']: - path = os.path.join(lxml_path, 'doc', name) - outname = os.path.splitext(name)[0] + '.html' - outpath = os.path.join(dirname, outname) - - rest2html(path, outpath, stylesheet_url) - # also convert INSTALL.txt and CHANGES.txt - rest2html(os.path.join(lxml_path, 'INSTALL.txt'), - os.path.join(dirname, 'installation.html'), - stylesheet_url) - rest2html(os.path.join(lxml_path, 'CHANGES.txt'), - os.path.join(dirname, 'changes-%s.html' % release), - stylesheet_url) - os.rename(os.path.join(dirname, 'main.html'), - os.path.join(dirname, 'index.html')) - -def rest2html(source_path, dest_path, stylesheet_url): - - command = ('rest2html --stylesheet=%s --link-stylesheet %s > %s' % - (stylesheet_url, source_path, dest_path)) - os.system(command) - -if __name__ == '__main__': - publish(sys.argv[1], sys.argv[2], sys.argv[3]) Modified: lxml/trunk/version.txt ============================================================================== --- lxml/trunk/version.txt (original) +++ lxml/trunk/version.txt Sun Jun 4 11:18:56 2006 @@ -1 +1 @@ -1.0 +1.0.1 From scoder at codespeak.net Sun Jun 4 12:30:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 12:30:50 +0200 (CEST) Subject: [Lxml-checkins] r28239 - in lxml/trunk/src/lxml: . tests Message-ID: <20060604103050.3E3EB10075@code0.codespeak.net> Author: scoder Date: Sun Jun 4 12:30:49 2006 New Revision: 28239 Modified: lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/tests/test_xslt.py Log: parser fix: always set document URL if it is known, even when parsing from file-like objects, added xsl:include test case in test_xsl.py Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sun Jun 4 12:30:49 2006 @@ -419,6 +419,8 @@ if result is NULL: _raiseParseError(ctxt, c_filename) + elif result.URL is NULL and c_filename is not NULL: + result.URL = tree.xmlStrdup(c_filename) return result ############################################################ Modified: lxml/trunk/src/lxml/tests/test_xslt.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_xslt.py (original) +++ lxml/trunk/src/lxml/tests/test_xslt.py Sun Jun 4 12:30:49 2006 @@ -292,10 +292,16 @@ self.assertEquals('''B''', str(res).strip()) - def test_xslt_multiple_files(self): + def test_xslt_include(self): tree = etree.parse(fileInTestDir('test1.xslt')) st = etree.XSLT(tree) + def test_xslt_include_from_filelike(self): + f = open(fileInTestDir('test1.xslt'), 'r') + tree = etree.parse(f) + f.close() + st = etree.XSLT(tree) + def test_xslt_multiple_transforms(self): xml = '' xslt = '''\ From scoder at codespeak.net Sun Jun 4 12:49:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 12:49:31 +0200 (CEST) Subject: [Lxml-checkins] r28241 - lxml/trunk Message-ID: <20060604104931.8042410069@code0.codespeak.net> Author: scoder Date: Sun Jun 4 12:49:30 2006 New Revision: 28241 Modified: lxml/trunk/CHANGES.txt Log: mark xsl:include bug fixed Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Jun 4 12:49:30 2006 @@ -16,6 +16,8 @@ Bugs fixed ---------- +* xsl:include failed when the stylesheet was parsed from a file-like object + * lxml.sax.ElementTreeProducer did not call startDocument() / endDocument() * MSVC compiler complained about long strings (supports only 2048 bytes) From scoder at codespeak.net Sun Jun 4 12:50:34 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 12:50:34 +0200 (CEST) Subject: [Lxml-checkins] r28242 - in lxml/trunk: . doc Message-ID: <20060604105034.9A3C910069@code0.codespeak.net> Author: scoder Date: Sun Jun 4 12:50:33 2006 New Revision: 28242 Modified: lxml/trunk/bench.py lxml/trunk/doc/performance.txt Log: benchmark for Element.getchildren() Modified: lxml/trunk/bench.py ============================================================================== --- lxml/trunk/bench.py (original) +++ lxml/trunk/bench.py Sun Jun 4 12:50:33 2006 @@ -387,6 +387,9 @@ for child in root: child.get('a') + def bench_root_getchildren(self, root): + root.getchildren() + def bench_getchildren(self, root): for child in root: child.getchildren() Modified: lxml/trunk/doc/performance.txt ============================================================================== --- lxml/trunk/doc/performance.txt (original) +++ lxml/trunk/doc/performance.txt Sun Jun 4 12:50:33 2006 @@ -117,6 +117,14 @@ are no longer referenced. ET and cET represent the tree itself through these objects, which reduces the overhead in creating them. +The same reason makes operations like ``getchildren()`` more costly in lxml. +Where ET and cET can quickly create a shallow copy of their list of children, +lxml has to create a Python object for each child and collect them in a list:: + + lxe: root_getchildren (-- T2 ) 6.3981 msec/pass + cET: root_getchildren (-- T2 ) 0.0651 msec/pass + ET : root_getchildren (-- T2 ) 0.0224 msec/pass + As opposed to ET, libxml2 has a notion of documents that each element must be in. This results in a major performance difference for creating independent Elements that end up in independently created documents:: From scoder at codespeak.net Sun Jun 4 16:23:43 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 16:23:43 +0200 (CEST) Subject: [Lxml-checkins] r28263 - in lxml/trunk/src/lxml: . tests Message-ID: <20060604142343.A7C7F1006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 16:23:42 2006 New Revision: 28263 Modified: lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/tests/test_elementtree.py Log: cleanup in iterator code Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sun Jun 4 16:23:42 2006 @@ -1217,16 +1217,10 @@ ctypedef xmlNode* (*_node_to_node_function)(xmlNode*) -cdef class _ElementSiblingIterator: +cdef class _ElementIterator: # we keep Python references here to control GC cdef _NodeBase _node cdef _node_to_node_function _next_element - def __init__(self, _NodeBase node, preceding=False): - self._node = node - if preceding: - self._next_element = _previousElement - else: - self._next_element = _nextElement def __iter__(self): return self def __next__(self): @@ -1244,21 +1238,31 @@ self._node = _elementFactory(current_node._doc, c_node) return current_node -cdef class ElementChildIterator(_ElementSiblingIterator): +cdef class ElementChildIterator(_ElementIterator): + "Iterates over the children of an element" def __init__(self, _NodeBase node not None, reversed=False): cdef xmlNode* c_node if reversed: c_node = _findChildBackwards(node._c_node, 0) + self._next_element = _previousElement else: c_node = _findChildForwards(node._c_node, 0) + self._next_element = _nextElement if c_node is not NULL: - child = _elementFactory(node._doc, c_node) # Python ref! - _ElementSiblingIterator.__init__(self, child, reversed) + # Python ref! + self._node = _elementFactory(node._doc, c_node) + else: + self._node = None -cdef class SiblingsIterator(_ElementSiblingIterator): +cdef class SiblingsIterator(_ElementIterator): + "Iterates over the siblings of an element" def __init__(self, _NodeBase node not None, preceding=False): - _ElementSiblingIterator.__init__(self, node, preceding) - self.next() + if preceding: + self._next_element = _previousElement + self._node = node.getprevious() + else: + self._next_element = _nextElement + self._node = node.getnext() cdef class ElementDepthFirstIterator: """Iterates over an element and its sub-elements in document order (depth @@ -1290,7 +1294,7 @@ else: self._href = _cstr(self._pystrings[0]) self._name = _cstr(self._pystrings[1]) - if cstd.strcmp(self._name, '*') == 0: + if self._name[0] == c'*' and self._name[1] == c'\0': self._name = NULL if not _tagMatches(node._c_node, self._href, self._name): # this cannot raise StopIteration, self._next_node != None @@ -1300,34 +1304,31 @@ return self def __next__(self): + cdef xmlNode* c_node cdef _NodeBase current_node current_node = self._next_node if current_node is None: raise StopIteration + c_node = self._next_node._c_node if self._name is NULL and self._href is NULL: - self._prepareNextNodeAnyTag() + c_node = self._nextNodeAnyTag(c_node) else: - self._prepareNextNodeMatchTag() + c_node = self._nextNodeMatchTag(c_node) + self._next_node = _elementFactory(current_node._doc, c_node) return current_node - cdef void _prepareNextNodeAnyTag(self): - cdef xmlNode* c_node - c_node = self._next_node._c_node + cdef xmlNode* _nextNodeAnyTag(self, xmlNode* c_node): tree.BEGIN_FOR_EACH_ELEMENT_FROM(self._top_node._c_node, c_node, 0) - self._next_node = _elementFactory(self._next_node._doc, c_node) - return + return c_node tree.END_FOR_EACH_ELEMENT_FROM(c_node) - self._next_node = None + return NULL - cdef void _prepareNextNodeMatchTag(self): - cdef xmlNode* c_node - c_node = self._next_node._c_node + cdef xmlNode* _nextNodeMatchTag(self, xmlNode* c_node): tree.BEGIN_FOR_EACH_ELEMENT_FROM(self._top_node._c_node, c_node, 0) if _tagMatches(c_node, self._href, self._name): - self._next_node = _elementFactory(self._next_node._doc, c_node) - return + return c_node tree.END_FOR_EACH_ELEMENT_FROM(c_node) - self._next_node = None + return NULL cdef xmlNode* _createElement(xmlDoc* c_doc, object name_utf) except NULL: cdef xmlNode* c_node Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Sun Jun 4 16:23:42 2006 @@ -1203,6 +1203,26 @@ [d], list(d.getiterator())) + def test_getiterator_empty(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + e = SubElement(c, 'e') + + self.assertEquals( + [], + list(a.getiterator('none'))) + self.assertEquals( + [], + list(e.getiterator('none'))) + self.assertEquals( + [e], + list(e.getiterator())) + def test_getiterator_filter(self): Element = self.etree.Element SubElement = self.etree.SubElement From scoder at codespeak.net Sun Jun 4 17:12:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 17:12:10 +0200 (CEST) Subject: [Lxml-checkins] r28268 - in lxml/trunk: . src/lxml src/lxml/tests Message-ID: <20060604151210.A68D110075@code0.codespeak.net> Author: scoder Date: Sun Jun 4 17:12:07 2006 New Revision: 28268 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/apihelpers.pxi lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/tests/test_etree.py Log: Element.iterancestors() and Element.iterdescendants(), some more cleanup in iterator code Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Jun 4 17:12:07 2006 @@ -7,8 +7,15 @@ Features added -------------- -* Element.itersiblings() iterates over the siblings of an element in either - direction +* Element iteration over XPath axes: + + * Element.iterdescendants() iterates over the descendants of an element + + * Element.iterancestors() iterates over the ancestors of an element (from + parent to parent) + + * Element.itersiblings() iterates over the siblings of an element in either + direction * Element.getnext() and Element.getprevious() return the direct siblings of an element Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Sun Jun 4 17:12:07 2006 @@ -244,6 +244,15 @@ c_node = c_node.prev return NULL +cdef xmlNode* _parentElement(xmlNode* c_node): + "Given a node, find the parent element." + if c_node is NULL or not _isElement(c_node): + return NULL + c_node = c_node.parent + if c_node is NULL or not _isElement(c_node): + return NULL + return c_node + cdef int _tagMatches(xmlNode* c_node, char* c_href, char* c_name): if c_name is NULL: if c_href is NULL: Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sun Jun 4 17:12:07 2006 @@ -919,10 +919,11 @@ def getparent(self): "Returns the parent of this element or None for the root element" cdef xmlNode* c_node - c_node = self._c_node.parent - if c_node is not NULL and _isElement(c_node): + c_node = _parentElement(self._c_node) + if c_node is NULL: + return None + else: return _elementFactory(self._doc, c_node) - return None def getnext(self): "Returns the following sibling of this element or None" @@ -941,10 +942,26 @@ return None def itersiblings(self, preceding=False): - """Iterate over the following or preceding siblings of this element, - determined by the 'preceding' keyword (defaults to False).""" + """Iterate over the following or preceding siblings of this element. + + The direction is determined by the 'preceding' keyword which defaults + to False, i.e. forward iteration over the following siblings.""" return SiblingsIterator(self, preceding) + def iterancestors(self): + "Iterate over the ancestors of this element (from parent to parent)." + return AncestorsIterator(self) + + def iterdescendants(self): + """Iterate over the descendants of this element in document order. + + As opposed to getiterator(), this iterator does not yield the element + itself. + """ + iterator = ElementDepthFirstIterator(self) + iterator.next() + return iterator + def getroottree(self): """Return an ElementTree for the root node of the document that contains this element. @@ -956,8 +973,11 @@ def getiterator(self, tag=None): """Iterate over all elements in the subtree in document order (depth - first pre-order). Can be restricted to find only elements with a - specific tag or from a namespace.""" + first pre-order), starting with this element. + + Can be restricted to find only elements with a specific tag or from a + namespace. + """ return ElementDepthFirstIterator(self, tag) def makeelement(self, _tag, attrib=None, nsmap=None, **_extra): @@ -1223,6 +1243,16 @@ cdef _node_to_node_function _next_element def __iter__(self): return self + + cdef void _storeNext(self, _NodeBase node): + cdef xmlNode* c_node + c_node = self._next_element(node._c_node) + if c_node is NULL: + self._node = None + else: + # Python ref: + self._node = _elementFactory(node._doc, c_node) + def __next__(self): cdef xmlNode* c_node cdef _NodeBase current_node @@ -1230,16 +1260,11 @@ current_node = self._node if current_node is None: raise StopIteration - c_node = self._next_element(current_node._c_node) - if c_node is NULL: - self._node = None - else: - # Python ref: - self._node = _elementFactory(current_node._doc, c_node) + self._storeNext(current_node) return current_node cdef class ElementChildIterator(_ElementIterator): - "Iterates over the children of an element" + "Iterates over the children of an element." def __init__(self, _NodeBase node not None, reversed=False): cdef xmlNode* c_node if reversed: @@ -1249,20 +1274,26 @@ c_node = _findChildForwards(node._c_node, 0) self._next_element = _nextElement if c_node is not NULL: - # Python ref! + # store Python ref: self._node = _elementFactory(node._doc, c_node) - else: - self._node = None cdef class SiblingsIterator(_ElementIterator): - "Iterates over the siblings of an element" + """Iterates over the siblings of an element. + + You can pass the boolean keyword ``preceding`` to specify the direction. + """ def __init__(self, _NodeBase node not None, preceding=False): if preceding: self._next_element = _previousElement - self._node = node.getprevious() else: self._next_element = _nextElement - self._node = node.getnext() + self._storeNext(node) + +cdef class AncestorsIterator(_ElementIterator): + "Iterates over the ancestors of an element (from parent to parent)." + def __init__(self, _NodeBase node not None): + self._next_element = _parentElement + self._storeNext(node) cdef class ElementDepthFirstIterator: """Iterates over an element and its sub-elements in document order (depth Modified: lxml/trunk/src/lxml/tests/test_etree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_etree.py (original) +++ lxml/trunk/src/lxml/tests/test_etree.py Sun Jun 4 17:12:07 2006 @@ -274,6 +274,27 @@ b, d.getparent()) + def test_iterancestors(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + self.assertEquals( + [], + list(a.iterancestors())) + self.assertEquals( + [a], + list(b.iterancestors())) + self.assertEquals( + a, + c.iterancestors().next()) + self.assertEquals( + [b, a], + list(d.iterancestors())) + def test_getroottree(self): Element = self.etree.Element SubElement = self.etree.SubElement @@ -342,6 +363,9 @@ [c], list(b.itersiblings())) self.assertEquals( + c, + b.itersiblings().next()) + self.assertEquals( [], list(c.itersiblings())) self.assertEquals( From scoder at codespeak.net Sun Jun 4 17:15:19 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 17:15:19 +0200 (CEST) Subject: [Lxml-checkins] r28269 - lxml/branch/lxml-1.0 Message-ID: <20060604151519.DBCFA1006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 17:15:18 2006 New Revision: 28269 Added: lxml/branch/lxml-1.0/ - copied from r28268, lxml/tag/lxml-1.0/ Log: created maintenance branch for lxml 1.0 From scoder at codespeak.net Sun Jun 4 17:20:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 17:20:31 +0200 (CEST) Subject: [Lxml-checkins] r28271 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060604152031.264211006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 17:20:25 2006 New Revision: 28271 Added: lxml/branch/lxml-1.0/update-error-constants.py - copied unchanged from r28085, lxml/trunk/update-error-constants.py Modified: lxml/branch/lxml-1.0/MANIFEST.in lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi Log: merged in error constant generation from trunk Modified: lxml/branch/lxml-1.0/MANIFEST.in ============================================================================== --- lxml/branch/lxml-1.0/MANIFEST.in (original) +++ lxml/branch/lxml-1.0/MANIFEST.in Sun Jun 4 17:20:25 2006 @@ -1,4 +1,7 @@ -include setup.py MANIFEST.in version.txt +exclude *.py +include setup.py test.py selftest.py selftest2.py bench.py +include update-error-constants.py +include MANIFEST.in version.txt include CHANGES.txt CREDITS.txt INSTALL.txt LICENSES.txt README.txt TODO.txt recursive-include src *.pyx *.pxd *.pxi *.py etree.c etree.h recursive-include src/lxml/tests *.rng *.xslt *.xml Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd Sun Jun 4 17:20:25 2006 @@ -1,11 +1,771 @@ +# --- BEGIN: GENERATED CONSTANTS --- cdef extern from "libxml/xmlerror.h": ctypedef enum xmlErrorLevel: - XML_ERR_NONE = 0 - XML_ERR_WARNING = 1 # A simple warning - XML_ERR_ERROR = 2 # A recoverable error - XML_ERR_FATAL = 3 # A fatal error + XML_ERR_NONE = 0 + XML_ERR_WARNING = 1 # A simple warning + XML_ERR_ERROR = 2 # A recoverable error + XML_ERR_FATAL = 3 # A fatal error + ctypedef enum xmlErrorDomain: + XML_FROM_NONE = 0 + XML_FROM_PARSER = 1 # The XML parser + XML_FROM_TREE = 2 # The tree module + XML_FROM_NAMESPACE = 3 # The XML Namespace module + XML_FROM_DTD = 4 # The XML DTD validation with parser contex + XML_FROM_HTML = 5 # The HTML parser + XML_FROM_MEMORY = 6 # The memory allocator + XML_FROM_OUTPUT = 7 # The serialization code + XML_FROM_IO = 8 # The Input/Output stack + XML_FROM_FTP = 9 # The FTP module + XML_FROM_HTTP = 10 # The HTTP module + XML_FROM_XINCLUDE = 11 # The XInclude processing + XML_FROM_XPATH = 12 # The XPath module + XML_FROM_XPOINTER = 13 # The XPointer module + XML_FROM_REGEXP = 14 # The regular expressions module + XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module + XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module + XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module + XML_FROM_RELAXNGP = 18 # The Relax-NG parser module + XML_FROM_RELAXNGV = 19 # The Relax-NG validator module + XML_FROM_CATALOG = 20 # The Catalog module + XML_FROM_C14N = 21 # The Canonicalization module + XML_FROM_XSLT = 22 # The XSLT engine from libxslt + XML_FROM_VALID = 23 # The XML DTD validation with valid context + XML_FROM_CHECK = 24 # The error checking module + XML_FROM_WRITER = 25 # The xmlwriter module + XML_FROM_MODULE = 26 # The dynamically loaded module modul + XML_FROM_I18N = 27 # The module handling character conversion + + ctypedef enum xmlParserErrors: + XML_ERR_OK = 0 + XML_ERR_INTERNAL_ERROR = 1 # 1 + XML_ERR_NO_MEMORY = 2 # 2 + XML_ERR_DOCUMENT_START = 3 # 3 + XML_ERR_DOCUMENT_EMPTY = 4 # 4 + XML_ERR_DOCUMENT_END = 5 # 5 + XML_ERR_INVALID_HEX_CHARREF = 6 # 6 + XML_ERR_INVALID_DEC_CHARREF = 7 # 7 + XML_ERR_INVALID_CHARREF = 8 # 8 + XML_ERR_INVALID_CHAR = 9 # 9 + XML_ERR_CHARREF_AT_EOF = 10 # 10 + XML_ERR_CHARREF_IN_PROLOG = 11 # 11 + XML_ERR_CHARREF_IN_EPILOG = 12 # 12 + XML_ERR_CHARREF_IN_DTD = 13 # 13 + XML_ERR_ENTITYREF_AT_EOF = 14 # 14 + XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 + XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 + XML_ERR_ENTITYREF_IN_DTD = 17 # 17 + XML_ERR_PEREF_AT_EOF = 18 # 18 + XML_ERR_PEREF_IN_PROLOG = 19 # 19 + XML_ERR_PEREF_IN_EPILOG = 20 # 20 + XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 + XML_ERR_ENTITYREF_NO_NAME = 22 # 22 + XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 + XML_ERR_PEREF_NO_NAME = 24 # 24 + XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 + XML_ERR_UNDECLARED_ENTITY = 26 # 26 + XML_WAR_UNDECLARED_ENTITY = 27 # 27 + XML_ERR_UNPARSED_ENTITY = 28 # 28 + XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 + XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 + XML_ERR_UNKNOWN_ENCODING = 31 # 31 + XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 + XML_ERR_STRING_NOT_STARTED = 33 # 33 + XML_ERR_STRING_NOT_CLOSED = 34 # 34 + XML_ERR_NS_DECL_ERROR = 35 # 35 + XML_ERR_ENTITY_NOT_STARTED = 36 # 36 + XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 + XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 + XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 + XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 + XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 + XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 + XML_ERR_LITERAL_NOT_STARTED = 43 # 43 + XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 + XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 + XML_ERR_PI_NOT_STARTED = 46 # 46 + XML_ERR_PI_NOT_FINISHED = 47 # 47 + XML_ERR_NOTATION_NOT_STARTED = 48 # 48 + XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 + XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 + XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 + XML_ERR_MIXED_NOT_STARTED = 52 # 52 + XML_ERR_MIXED_NOT_FINISHED = 53 # 53 + XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 + XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 + XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 + XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 + XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 + XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 + XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 + XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 + XML_ERR_MISPLACED_CDATA_END = 62 # 62 + XML_ERR_CDATA_NOT_FINISHED = 63 # 63 + XML_ERR_RESERVED_XML_NAME = 64 # 64 + XML_ERR_SPACE_REQUIRED = 65 # 65 + XML_ERR_SEPARATOR_REQUIRED = 66 # 66 + XML_ERR_NMTOKEN_REQUIRED = 67 # 67 + XML_ERR_NAME_REQUIRED = 68 # 68 + XML_ERR_PCDATA_REQUIRED = 69 # 69 + XML_ERR_URI_REQUIRED = 70 # 70 + XML_ERR_PUBID_REQUIRED = 71 # 71 + XML_ERR_LT_REQUIRED = 72 # 72 + XML_ERR_GT_REQUIRED = 73 # 73 + XML_ERR_LTSLASH_REQUIRED = 74 # 74 + XML_ERR_EQUAL_REQUIRED = 75 # 75 + XML_ERR_TAG_NAME_MISMATCH = 76 # 76 + XML_ERR_TAG_NOT_FINISHED = 77 # 77 + XML_ERR_STANDALONE_VALUE = 78 # 78 + XML_ERR_ENCODING_NAME = 79 # 79 + XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 + XML_ERR_INVALID_ENCODING = 81 # 81 + XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 + XML_ERR_CONDSEC_INVALID = 83 # 83 + XML_ERR_VALUE_REQUIRED = 84 # 84 + XML_ERR_NOT_WELL_BALANCED = 85 # 85 + XML_ERR_EXTRA_CONTENT = 86 # 86 + XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 + XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 + XML_ERR_ENTITY_LOOP = 89 # 89 + XML_ERR_ENTITY_BOUNDARY = 90 # 90 + XML_ERR_INVALID_URI = 91 # 91 + XML_ERR_URI_FRAGMENT = 92 # 92 + XML_WAR_CATALOG_PI = 93 # 93 + XML_ERR_NO_DTD = 94 # 94 + XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 + XML_ERR_VERSION_MISSING = 96 # 96 + XML_WAR_UNKNOWN_VERSION = 97 # 97 + XML_WAR_LANG_VALUE = 98 # 98 + XML_WAR_NS_URI = 99 # 99 + XML_WAR_NS_URI_RELATIVE = 100 # 100 + XML_ERR_MISSING_ENCODING = 101 # 101 + XML_WAR_SPACE_VALUE = 102 # 102 + XML_ERR_NOT_STANDALONE = 103 # 103 + XML_ERR_ENTITY_PROCESSING = 104 # 104 + XML_ERR_NOTATION_PROCESSING = 105 # 105 + XML_WAR_NS_COLUMN = 106 # 106 + XML_WAR_ENTITY_REDEFINED = 107 # 107 + XML_NS_ERR_XML_NAMESPACE = 200 + XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 + XML_NS_ERR_QNAME = 202 # 202 + XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 + XML_NS_ERR_EMPTY = 204 # 204 + XML_DTD_ATTRIBUTE_DEFAULT = 500 + XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 + XML_DTD_ATTRIBUTE_VALUE = 502 # 502 + XML_DTD_CONTENT_ERROR = 503 # 503 + XML_DTD_CONTENT_MODEL = 504 # 504 + XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 + XML_DTD_DIFFERENT_PREFIX = 506 # 506 + XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 + XML_DTD_ELEM_NAMESPACE = 508 # 508 + XML_DTD_ELEM_REDEFINED = 509 # 509 + XML_DTD_EMPTY_NOTATION = 510 # 510 + XML_DTD_ENTITY_TYPE = 511 # 511 + XML_DTD_ID_FIXED = 512 # 512 + XML_DTD_ID_REDEFINED = 513 # 513 + XML_DTD_ID_SUBSET = 514 # 514 + XML_DTD_INVALID_CHILD = 515 # 515 + XML_DTD_INVALID_DEFAULT = 516 # 516 + XML_DTD_LOAD_ERROR = 517 # 517 + XML_DTD_MISSING_ATTRIBUTE = 518 # 518 + XML_DTD_MIXED_CORRUPT = 519 # 519 + XML_DTD_MULTIPLE_ID = 520 # 520 + XML_DTD_NO_DOC = 521 # 521 + XML_DTD_NO_DTD = 522 # 522 + XML_DTD_NO_ELEM_NAME = 523 # 523 + XML_DTD_NO_PREFIX = 524 # 524 + XML_DTD_NO_ROOT = 525 # 525 + XML_DTD_NOTATION_REDEFINED = 526 # 526 + XML_DTD_NOTATION_VALUE = 527 # 527 + XML_DTD_NOT_EMPTY = 528 # 528 + XML_DTD_NOT_PCDATA = 529 # 529 + XML_DTD_NOT_STANDALONE = 530 # 530 + XML_DTD_ROOT_NAME = 531 # 531 + XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 + XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 + XML_DTD_UNKNOWN_ELEM = 534 # 534 + XML_DTD_UNKNOWN_ENTITY = 535 # 535 + XML_DTD_UNKNOWN_ID = 536 # 536 + XML_DTD_UNKNOWN_NOTATION = 537 # 537 + XML_DTD_STANDALONE_DEFAULTED = 538 # 538 + XML_DTD_XMLID_VALUE = 539 # 539 + XML_DTD_XMLID_TYPE = 540 # 540 + XML_HTML_STRUCURE_ERROR = 800 + XML_HTML_UNKNOWN_TAG = 801 # 801 + XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 + XML_RNGP_ATTR_CONFLICT = 1001 # 1001 + XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 + XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 + XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 + XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 + XML_RNGP_CHOICE_CONTENT = 1006 # 1006 + XML_RNGP_CHOICE_EMPTY = 1007 # 1007 + XML_RNGP_CREATE_FAILURE = 1008 # 1008 + XML_RNGP_DATA_CONTENT = 1009 # 1009 + XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 + XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 + XML_RNGP_DEFINE_EMPTY = 1012 # 1012 + XML_RNGP_DEFINE_MISSING = 1013 # 1013 + XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 + XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 + XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 + XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 + XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 + XML_RNGP_ELEMENT_NAME = 1019 # 1019 + XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 + XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 + XML_RNGP_EMPTY = 1022 # 1022 + XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 + XML_RNGP_EMPTY_CONTENT = 1024 # 1024 + XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 + XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 + XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 + XML_RNGP_EXCEPT_MISSING = 1028 # 1028 + XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 + XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 + XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 + XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 + XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 + XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 + XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 + XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 + XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 + XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 + XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 + XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 + XML_RNGP_HREF_ERROR = 1041 # 1041 + XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 + XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 + XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 + XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 + XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 + XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 + XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 + XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 + XML_RNGP_INVALID_URI = 1050 # 1050 + XML_RNGP_INVALID_VALUE = 1051 # 1051 + XML_RNGP_MISSING_HREF = 1052 # 1052 + XML_RNGP_NAME_MISSING = 1053 # 1053 + XML_RNGP_NEED_COMBINE = 1054 # 1054 + XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 + XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 + XML_RNGP_NSNAME_NO_NS = 1057 # 1057 + XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 + XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 + XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 + XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 + XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 + XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 + XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 + XML_RNGP_PARSE_ERROR = 1065 # 1065 + XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 + XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 + XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 + XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 + XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 + XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 + XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 + XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 + XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 + XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 + XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 + XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 + XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 + XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 + XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 + XML_RNGP_PAT_LIST_LIST = 1081 # 1081 + XML_RNGP_PAT_LIST_REF = 1082 # 1082 + XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 + XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 + XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 + XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 + XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 + XML_RNGP_PAT_START_ATTR = 1088 # 1088 + XML_RNGP_PAT_START_DATA = 1089 # 1089 + XML_RNGP_PAT_START_EMPTY = 1090 # 1090 + XML_RNGP_PAT_START_GROUP = 1091 # 1091 + XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 + XML_RNGP_PAT_START_LIST = 1093 # 1093 + XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 + XML_RNGP_PAT_START_TEXT = 1095 # 1095 + XML_RNGP_PAT_START_VALUE = 1096 # 1096 + XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 + XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 + XML_RNGP_REF_CYCLE = 1099 # 1099 + XML_RNGP_REF_NAME_INVALID = 1100 # 1100 + XML_RNGP_REF_NO_DEF = 1101 # 1101 + XML_RNGP_REF_NO_NAME = 1102 # 1102 + XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 + XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 + XML_RNGP_START_CONTENT = 1105 # 1105 + XML_RNGP_START_EMPTY = 1106 # 1106 + XML_RNGP_START_MISSING = 1107 # 1107 + XML_RNGP_TEXT_EXPECTED = 1108 # 1108 + XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 + XML_RNGP_TYPE_MISSING = 1110 # 1110 + XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 + XML_RNGP_TYPE_VALUE = 1112 # 1112 + XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 + XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 + XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 + XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 + XML_RNGP_URI_FRAGMENT = 1117 # 1117 + XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 + XML_RNGP_VALUE_EMPTY = 1119 # 1119 + XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 + XML_RNGP_XMLNS_NAME = 1121 # 1121 + XML_RNGP_XML_NS = 1122 # 1122 + XML_XPATH_EXPRESSION_OK = 1200 + XML_XPATH_NUMBER_ERROR = 1201 # 1201 + XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 + XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 + XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 + XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 + XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 + XML_XPATH_EXPR_ERROR = 1207 # 1207 + XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 + XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 + XML_XPATH_INVALID_OPERAND = 1210 # 1210 + XML_XPATH_INVALID_TYPE = 1211 # 1211 + XML_XPATH_INVALID_ARITY = 1212 # 1212 + XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 + XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 + XML_XPATH_MEMORY_ERROR = 1215 # 1215 + XML_XPTR_SYNTAX_ERROR = 1216 # 1216 + XML_XPTR_RESOURCE_ERROR = 1217 # 1217 + XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 + XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 + XML_XPATH_ENCODING_ERROR = 1220 # 1220 + XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 + XML_TREE_INVALID_HEX = 1300 + XML_TREE_INVALID_DEC = 1301 # 1301 + XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 + XML_SAVE_NOT_UTF8 = 1400 + XML_SAVE_CHAR_INVALID = 1401 # 1401 + XML_SAVE_NO_DOCTYPE = 1402 # 1402 + XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 + XML_REGEXP_COMPILE_ERROR = 1450 + XML_IO_UNKNOWN = 1500 + XML_IO_EACCES = 1501 # 1501 + XML_IO_EAGAIN = 1502 # 1502 + XML_IO_EBADF = 1503 # 1503 + XML_IO_EBADMSG = 1504 # 1504 + XML_IO_EBUSY = 1505 # 1505 + XML_IO_ECANCELED = 1506 # 1506 + XML_IO_ECHILD = 1507 # 1507 + XML_IO_EDEADLK = 1508 # 1508 + XML_IO_EDOM = 1509 # 1509 + XML_IO_EEXIST = 1510 # 1510 + XML_IO_EFAULT = 1511 # 1511 + XML_IO_EFBIG = 1512 # 1512 + XML_IO_EINPROGRESS = 1513 # 1513 + XML_IO_EINTR = 1514 # 1514 + XML_IO_EINVAL = 1515 # 1515 + XML_IO_EIO = 1516 # 1516 + XML_IO_EISDIR = 1517 # 1517 + XML_IO_EMFILE = 1518 # 1518 + XML_IO_EMLINK = 1519 # 1519 + XML_IO_EMSGSIZE = 1520 # 1520 + XML_IO_ENAMETOOLONG = 1521 # 1521 + XML_IO_ENFILE = 1522 # 1522 + XML_IO_ENODEV = 1523 # 1523 + XML_IO_ENOENT = 1524 # 1524 + XML_IO_ENOEXEC = 1525 # 1525 + XML_IO_ENOLCK = 1526 # 1526 + XML_IO_ENOMEM = 1527 # 1527 + XML_IO_ENOSPC = 1528 # 1528 + XML_IO_ENOSYS = 1529 # 1529 + XML_IO_ENOTDIR = 1530 # 1530 + XML_IO_ENOTEMPTY = 1531 # 1531 + XML_IO_ENOTSUP = 1532 # 1532 + XML_IO_ENOTTY = 1533 # 1533 + XML_IO_ENXIO = 1534 # 1534 + XML_IO_EPERM = 1535 # 1535 + XML_IO_EPIPE = 1536 # 1536 + XML_IO_ERANGE = 1537 # 1537 + XML_IO_EROFS = 1538 # 1538 + XML_IO_ESPIPE = 1539 # 1539 + XML_IO_ESRCH = 1540 # 1540 + XML_IO_ETIMEDOUT = 1541 # 1541 + XML_IO_EXDEV = 1542 # 1542 + XML_IO_NETWORK_ATTEMPT = 1543 # 1543 + XML_IO_ENCODER = 1544 # 1544 + XML_IO_FLUSH = 1545 # 1545 + XML_IO_WRITE = 1546 # 1546 + XML_IO_NO_INPUT = 1547 # 1547 + XML_IO_BUFFER_FULL = 1548 # 1548 + XML_IO_LOAD_ERROR = 1549 # 1549 + XML_IO_ENOTSOCK = 1550 # 1550 + XML_IO_EISCONN = 1551 # 1551 + XML_IO_ECONNREFUSED = 1552 # 1552 + XML_IO_ENETUNREACH = 1553 # 1553 + XML_IO_EADDRINUSE = 1554 # 1554 + XML_IO_EALREADY = 1555 # 1555 + XML_IO_EAFNOSUPPORT = 1556 # 1556 + XML_XINCLUDE_RECURSION = 1600 + XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 + XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 + XML_XINCLUDE_NO_HREF = 1603 # 1603 + XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 + XML_XINCLUDE_HREF_URI = 1605 # 1605 + XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 + XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 + XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 + XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 + XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 + XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 + XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 + XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 + XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 + XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 + XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 + XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 + XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 + XML_CATALOG_MISSING_ATTR = 1650 + XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 + XML_CATALOG_PREFER_VALUE = 1652 # 1652 + XML_CATALOG_NOT_CATALOG = 1653 # 1653 + XML_CATALOG_RECURSION = 1654 # 1654 + XML_SCHEMAP_PREFIX_UNDEFINED = 1700 + XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 + XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 + XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 + XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 + XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 + XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 + XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 + XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 + XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 + XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 + XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 + XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 + XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 + XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 + XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 + XML_SCHEMAP_INVALID_FACET = 1716 # 1716 + XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 + XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 + XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 + XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 + XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 + XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 + XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 + XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 + XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 + XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 + XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 + XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 + XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 + XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 + XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 + XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 + XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 + XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 + XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 + XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 + XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 + XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 + XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 + XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 + XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 + XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 + XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 + XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 + XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 + XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 + XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 + XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 + XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 + XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 + XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 + XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 + XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 + XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 + XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 + XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 + XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 + XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 + XML_SCHEMAP_NOROOT = 1759 # 1759 + XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 + XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 + XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 + XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 + XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 + XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 + XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 + XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 + XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 + XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 + XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 + XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 + XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 + XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 + XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 + XML_SCHEMAP_RECURSIVE = 1775 # 1775 + XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 + XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 + XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 + XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 + XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 + XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 + XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 + XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 + XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 + XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 + XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 + XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 + XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 + XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 + XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 + XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 + XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 + XML_SCHEMAV_NOROOT = 1801 + XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 + XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 + XML_SCHEMAV_MISSING = 1804 # 1804 + XML_SCHEMAV_WRONGELEM = 1805 # 1805 + XML_SCHEMAV_NOTYPE = 1806 # 1806 + XML_SCHEMAV_NOROLLBACK = 1807 # 1807 + XML_SCHEMAV_ISABSTRACT = 1808 # 1808 + XML_SCHEMAV_NOTEMPTY = 1809 # 1809 + XML_SCHEMAV_ELEMCONT = 1810 # 1810 + XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 + XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 + XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 + XML_SCHEMAV_INVALIDATTR = 1814 # 1814 + XML_SCHEMAV_INVALIDELEM = 1815 # 1815 + XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 + XML_SCHEMAV_CONSTRUCT = 1817 # 1817 + XML_SCHEMAV_INTERNAL = 1818 # 1818 + XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 + XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 + XML_SCHEMAV_ATTRINVALID = 1821 # 1821 + XML_SCHEMAV_VALUE = 1822 # 1822 + XML_SCHEMAV_FACET = 1823 # 1823 + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 + XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 + XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 + XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 + XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 + XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 + XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 + XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 + XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 + XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 + XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 + XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 + XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 + XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 + XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 + XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 + XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 + XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 + XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 + XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 + XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 + XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 + XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 + XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 + XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 + XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 + XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 + XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 + XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 + XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 + XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 + XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 + XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 + XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 + XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 + XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 + XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 + XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 + XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 + XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 + XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 + XML_SCHEMAV_CVC_AU = 1874 # 1874 + XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 + XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 + XML_SCHEMAV_CVC_IDC = 1877 # 1877 + XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 + XML_XPTR_UNKNOWN_SCHEME = 1900 + XML_XPTR_CHILDSEQ_START = 1901 # 1901 + XML_XPTR_EVAL_FAILED = 1902 # 1902 + XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 + XML_C14N_CREATE_CTXT = 1950 + XML_C14N_REQUIRES_UTF8 = 1951 # 1951 + XML_C14N_CREATE_STACK = 1952 # 1952 + XML_C14N_INVALID_NODE = 1953 # 1953 + XML_C14N_UNKNOW_NODE = 1954 # 1954 + XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 + XML_FTP_PASV_ANSWER = 2000 + XML_FTP_EPSV_ANSWER = 2001 # 2001 + XML_FTP_ACCNT = 2002 # 2002 + XML_FTP_URL_SYNTAX = 2003 # 2003 + XML_HTTP_URL_SYNTAX = 2020 + XML_HTTP_USE_IP = 2021 # 2021 + XML_HTTP_UNKNOWN_HOST = 2022 # 2022 + XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 + XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 + XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 + XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 + XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 + XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 + XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 + XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 + XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 + XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 + XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 + XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 + XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 + XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 + XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 + XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 + XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 + XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 + XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 + XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 + XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 + XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 + XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 + XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 + XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 + XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 + XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 + XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 + XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 + XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 + XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 + XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 + XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 + XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 + XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 + XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 + XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 + XML_SCHEMAP_NO_XMLNS = 3056 # 3056 + XML_SCHEMAP_NO_XSI = 3057 # 3057 + XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 + XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 + XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 + XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 + XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 + XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 + XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 + XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 + XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 + XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 + XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 + XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C + XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 + XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 + XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 + XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 + XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 + XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 + XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 + XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 + XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 + XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 + XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 + XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 + XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 + XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 + XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 + XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 + XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 + XML_MODULE_OPEN = 4900 # 4900 + XML_MODULE_CLOSE = 4901 # 4901 + XML_CHECK_FOUND_ELEMENT = 5000 + XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 + XML_CHECK_FOUND_TEXT = 5002 # 5002 + XML_CHECK_FOUND_CDATA = 5003 # 5003 + XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 + XML_CHECK_FOUND_ENTITY = 5005 # 5005 + XML_CHECK_FOUND_PI = 5006 # 5006 + XML_CHECK_FOUND_COMMENT = 5007 # 5007 + XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 + XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 + XML_CHECK_FOUND_NOTATION = 5010 # 5010 + XML_CHECK_UNKNOWN_NODE = 5011 # 5011 + XML_CHECK_ENTITY_TYPE = 5012 # 5012 + XML_CHECK_NO_PARENT = 5013 # 5013 + XML_CHECK_NO_DOC = 5014 # 5014 + XML_CHECK_NO_NAME = 5015 # 5015 + XML_CHECK_NO_ELEM = 5016 # 5016 + XML_CHECK_WRONG_DOC = 5017 # 5017 + XML_CHECK_NO_PREV = 5018 # 5018 + XML_CHECK_WRONG_PREV = 5019 # 5019 + XML_CHECK_NO_NEXT = 5020 # 5020 + XML_CHECK_WRONG_NEXT = 5021 # 5021 + XML_CHECK_NOT_DTD = 5022 # 5022 + XML_CHECK_NOT_ATTR = 5023 # 5023 + XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 + XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 + XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 + XML_CHECK_NOT_NS_DECL = 5027 # 5027 + XML_CHECK_NO_HREF = 5028 # 5028 + XML_CHECK_WRONG_PARENT = 5029 # 5029 + XML_CHECK_NS_SCOPE = 5030 # 5030 + XML_CHECK_NS_ANCESTOR = 5031 # 5031 + XML_CHECK_NOT_UTF8 = 5032 # 5032 + XML_CHECK_NO_DICT = 5033 # 5033 + XML_CHECK_NOT_NCNAME = 5034 # 5034 + XML_CHECK_OUTSIDE_DICT = 5035 # 5035 + XML_CHECK_WRONG_NAME = 5036 # 5036 + XML_CHECK_NAME_NOT_NULL = 5037 # 5037 + XML_I18N_NO_NAME = 6000 + XML_I18N_NO_HANDLER = 6001 # 6001 + XML_I18N_EXCESS_HANDLER = 6002 # 6002 + XML_I18N_CONV_FAILED = 6003 # 6003 + XML_I18N_NO_OUTPUT = 6004 # 6004 + XML_CHECK_ = 6005 # 5033 + XML_CHECK_X = 6006 # 503 +# --- END: GENERATED CONSTANTS --- + +cdef extern from "libxml/xmlerror.h": ctypedef struct xmlError: int domain int code @@ -22,763 +782,6 @@ cdef void xmlSetGenericErrorFunc(void* ctxt, xmlGenericErrorFunc func) cdef void xmlSetStructuredErrorFunc(void* ctxt, xmlStructuredErrorFunc func) - - ctypedef enum xmlErrorDomain: - XML_FROM_NONE = 0 - XML_FROM_PARSER = 1 # The XML parser - XML_FROM_TREE = 2 # The tree module - XML_FROM_NAMESPACE = 3 # The XML Namespace module - XML_FROM_DTD = 4 # The XML DTD validation with parser contex - XML_FROM_HTML = 5 # The HTML parser - XML_FROM_MEMORY = 6 # The memory allocator - XML_FROM_OUTPUT = 7 # The serialization code - XML_FROM_IO = 8 # The Input/Output stack - XML_FROM_FTP = 9 # The FTP module - XML_FROM_HTTP = 10 # The FTP module - XML_FROM_XINCLUDE = 11 # The XInclude processing - XML_FROM_XPATH = 12 # The XPath module - XML_FROM_XPOINTER = 13 # The XPointer module - XML_FROM_REGEXP = 14 # The regular expressions module - XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module - XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module - XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module - XML_FROM_RELAXNGP = 18 # The Relax-NG parser module - XML_FROM_RELAXNGV = 19 # The Relax-NG validator module - XML_FROM_CATALOG = 20 # The Catalog module - XML_FROM_C14N = 21 # The Canonicalization module - XML_FROM_XSLT = 22 # The XSLT engine from libxslt - XML_FROM_VALID = 23 # The XML DTD validation with valid context - XML_FROM_CHECK = 24 # The error checking module - XML_FROM_WRITER = 25 # The xmlwriter module - XML_FROM_MODULE = 26 # The dynamically loaded module modu - XML_FROM_I18N = 27 # The module handling character conversion - - ctypedef enum xmlParserErrors: - XML_ERR_OK = 0 - XML_ERR_INTERNAL_ERROR = 1 # 1 - XML_ERR_NO_MEMORY = 2 # 2 - XML_ERR_DOCUMENT_START = 3 # 3 - XML_ERR_DOCUMENT_EMPTY = 4 # 4 - XML_ERR_DOCUMENT_END = 5 # 5 - XML_ERR_INVALID_HEX_CHARREF = 6 # 6 - XML_ERR_INVALID_DEC_CHARREF = 7 # 7 - XML_ERR_INVALID_CHARREF = 8 # 8 - XML_ERR_INVALID_CHAR = 9 # 9 - XML_ERR_CHARREF_AT_EOF = 10 # 10 - XML_ERR_CHARREF_IN_PROLOG = 11 # 11 - XML_ERR_CHARREF_IN_EPILOG = 12 # 12 - XML_ERR_CHARREF_IN_DTD = 13 # 13 - XML_ERR_ENTITYREF_AT_EOF = 14 # 14 - XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 - XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 - XML_ERR_ENTITYREF_IN_DTD = 17 # 17 - XML_ERR_PEREF_AT_EOF = 18 # 18 - XML_ERR_PEREF_IN_PROLOG = 19 # 19 - XML_ERR_PEREF_IN_EPILOG = 20 # 20 - XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 - XML_ERR_ENTITYREF_NO_NAME = 22 # 22 - XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 - XML_ERR_PEREF_NO_NAME = 24 # 24 - XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 - XML_ERR_UNDECLARED_ENTITY = 26 # 26 - XML_WAR_UNDECLARED_ENTITY = 27 # 27 - XML_ERR_UNPARSED_ENTITY = 28 # 28 - XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 - XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 - XML_ERR_UNKNOWN_ENCODING = 31 # 31 - XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 - XML_ERR_STRING_NOT_STARTED = 33 # 33 - XML_ERR_STRING_NOT_CLOSED = 34 # 34 - XML_ERR_NS_DECL_ERROR = 35 # 35 - XML_ERR_ENTITY_NOT_STARTED = 36 # 36 - XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 - XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 - XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 - XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 - XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 - XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 - XML_ERR_LITERAL_NOT_STARTED = 43 # 43 - XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 - XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 - XML_ERR_PI_NOT_STARTED = 46 # 46 - XML_ERR_PI_NOT_FINISHED = 47 # 47 - XML_ERR_NOTATION_NOT_STARTED = 48 # 48 - XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 - XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 - XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 - XML_ERR_MIXED_NOT_STARTED = 52 # 52 - XML_ERR_MIXED_NOT_FINISHED = 53 # 53 - XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 - XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 - XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 - XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 - XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 - XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 - XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 - XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 - XML_ERR_MISPLACED_CDATA_END = 62 # 62 - XML_ERR_CDATA_NOT_FINISHED = 63 # 63 - XML_ERR_RESERVED_XML_NAME = 64 # 64 - XML_ERR_SPACE_REQUIRED = 65 # 65 - XML_ERR_SEPARATOR_REQUIRED = 66 # 66 - XML_ERR_NMTOKEN_REQUIRED = 67 # 67 - XML_ERR_NAME_REQUIRED = 68 # 68 - XML_ERR_PCDATA_REQUIRED = 69 # 69 - XML_ERR_URI_REQUIRED = 70 # 70 - XML_ERR_PUBID_REQUIRED = 71 # 71 - XML_ERR_LT_REQUIRED = 72 # 72 - XML_ERR_GT_REQUIRED = 73 # 73 - XML_ERR_LTSLASH_REQUIRED = 74 # 74 - XML_ERR_EQUAL_REQUIRED = 75 # 75 - XML_ERR_TAG_NAME_MISMATCH = 76 # 76 - XML_ERR_TAG_NOT_FINISHED = 77 # 77 - XML_ERR_STANDALONE_VALUE = 78 # 78 - XML_ERR_ENCODING_NAME = 79 # 79 - XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 - XML_ERR_INVALID_ENCODING = 81 # 81 - XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 - XML_ERR_CONDSEC_INVALID = 83 # 83 - XML_ERR_VALUE_REQUIRED = 84 # 84 - XML_ERR_NOT_WELL_BALANCED = 85 # 85 - XML_ERR_EXTRA_CONTENT = 86 # 86 - XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 - XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 - XML_ERR_ENTITY_LOOP = 89 # 89 - XML_ERR_ENTITY_BOUNDARY = 90 # 90 - XML_ERR_INVALID_URI = 91 # 91 - XML_ERR_URI_FRAGMENT = 92 # 92 - XML_WAR_CATALOG_PI = 93 # 93 - XML_ERR_NO_DTD = 94 # 94 - XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 - XML_ERR_VERSION_MISSING = 96 # 96 - XML_WAR_UNKNOWN_VERSION = 97 # 97 - XML_WAR_LANG_VALUE = 98 # 98 - XML_WAR_NS_URI = 99 # 99 - XML_WAR_NS_URI_RELATIVE = 100 # 100 - XML_ERR_MISSING_ENCODING = 101 # 101 - XML_WAR_SPACE_VALUE = 102 # 102 - XML_ERR_NOT_STANDALONE = 103 # 103 - XML_ERR_ENTITY_PROCESSING = 104 # 104 - XML_ERR_NOTATION_PROCESSING = 105 # 105 - XML_WAR_NS_COLUMN = 106 # 106 - XML_WAR_ENTITY_REDEFINED = 107 # 107 - XML_NS_ERR_XML_NAMESPACE = 200 - XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 - XML_NS_ERR_QNAME = 202 # 202 - XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 - XML_NS_ERR_EMPTY = 204 # 204 - XML_DTD_ATTRIBUTE_DEFAULT = 500 - XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 - XML_DTD_ATTRIBUTE_VALUE = 502 # 502 - XML_DTD_CONTENT_ERROR = 503 # 503 - XML_DTD_CONTENT_MODEL = 504 # 504 - XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 - XML_DTD_DIFFERENT_PREFIX = 506 # 506 - XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 - XML_DTD_ELEM_NAMESPACE = 508 # 508 - XML_DTD_ELEM_REDEFINED = 509 # 509 - XML_DTD_EMPTY_NOTATION = 510 # 510 - XML_DTD_ENTITY_TYPE = 511 # 511 - XML_DTD_ID_FIXED = 512 # 512 - XML_DTD_ID_REDEFINED = 513 # 513 - XML_DTD_ID_SUBSET = 514 # 514 - XML_DTD_INVALID_CHILD = 515 # 515 - XML_DTD_INVALID_DEFAULT = 516 # 516 - XML_DTD_LOAD_ERROR = 517 # 517 - XML_DTD_MISSING_ATTRIBUTE = 518 # 518 - XML_DTD_MIXED_CORRUPT = 519 # 519 - XML_DTD_MULTIPLE_ID = 520 # 520 - XML_DTD_NO_DOC = 521 # 521 - XML_DTD_NO_DTD = 522 # 522 - XML_DTD_NO_ELEM_NAME = 523 # 523 - XML_DTD_NO_PREFIX = 524 # 524 - XML_DTD_NO_ROOT = 525 # 525 - XML_DTD_NOTATION_REDEFINED = 526 # 526 - XML_DTD_NOTATION_VALUE = 527 # 527 - XML_DTD_NOT_EMPTY = 528 # 528 - XML_DTD_NOT_PCDATA = 529 # 529 - XML_DTD_NOT_STANDALONE = 530 # 530 - XML_DTD_ROOT_NAME = 531 # 531 - XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 - XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 - XML_DTD_UNKNOWN_ELEM = 534 # 534 - XML_DTD_UNKNOWN_ENTITY = 535 # 535 - XML_DTD_UNKNOWN_ID = 536 # 536 - XML_DTD_UNKNOWN_NOTATION = 537 # 537 - XML_DTD_STANDALONE_DEFAULTED = 538 # 538 - XML_DTD_XMLID_VALUE = 539 # 539 - XML_DTD_XMLID_TYPE = 540 # 540 - XML_HTML_STRUCURE_ERROR = 800 - XML_HTML_UNKNOWN_TAG = 801 # 801 - XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 - XML_RNGP_ATTR_CONFLICT = 1001 # 1001 - XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 - XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 - XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 - XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 - XML_RNGP_CHOICE_CONTENT = 1006 # 1006 - XML_RNGP_CHOICE_EMPTY = 1007 # 1007 - XML_RNGP_CREATE_FAILURE = 1008 # 1008 - XML_RNGP_DATA_CONTENT = 1009 # 1009 - XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 - XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 - XML_RNGP_DEFINE_EMPTY = 1012 # 1012 - XML_RNGP_DEFINE_MISSING = 1013 # 1013 - XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 - XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 - XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 - XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 - XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 - XML_RNGP_ELEMENT_NAME = 1019 # 1019 - XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 - XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 - XML_RNGP_EMPTY = 1022 # 1022 - XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 - XML_RNGP_EMPTY_CONTENT = 1024 # 1024 - XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 - XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 - XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 - XML_RNGP_EXCEPT_MISSING = 1028 # 1028 - XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 - XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 - XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 - XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 - XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 - XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 - XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 - XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 - XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 - XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 - XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 - XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 - XML_RNGP_HREF_ERROR = 1041 # 1041 - XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 - XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 - XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 - XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 - XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 - XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 - XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 - XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 - XML_RNGP_INVALID_URI = 1050 # 1050 - XML_RNGP_INVALID_VALUE = 1051 # 1051 - XML_RNGP_MISSING_HREF = 1052 # 1052 - XML_RNGP_NAME_MISSING = 1053 # 1053 - XML_RNGP_NEED_COMBINE = 1054 # 1054 - XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 - XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 - XML_RNGP_NSNAME_NO_NS = 1057 # 1057 - XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 - XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 - XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 - XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 - XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 - XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 - XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 - XML_RNGP_PARSE_ERROR = 1065 # 1065 - XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 - XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 - XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 - XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 - XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 - XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 - XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 - XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 - XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 - XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 - XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 - XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 - XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 - XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 - XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 - XML_RNGP_PAT_LIST_LIST = 1081 # 1081 - XML_RNGP_PAT_LIST_REF = 1082 # 1082 - XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 - XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 - XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 - XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 - XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 - XML_RNGP_PAT_START_ATTR = 1088 # 1088 - XML_RNGP_PAT_START_DATA = 1089 # 1089 - XML_RNGP_PAT_START_EMPTY = 1090 # 1090 - XML_RNGP_PAT_START_GROUP = 1091 # 1091 - XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 - XML_RNGP_PAT_START_LIST = 1093 # 1093 - XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 - XML_RNGP_PAT_START_TEXT = 1095 # 1095 - XML_RNGP_PAT_START_VALUE = 1096 # 1096 - XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 - XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 - XML_RNGP_REF_CYCLE = 1099 # 1099 - XML_RNGP_REF_NAME_INVALID = 1100 # 1100 - XML_RNGP_REF_NO_DEF = 1101 # 1101 - XML_RNGP_REF_NO_NAME = 1102 # 1102 - XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 - XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 - XML_RNGP_START_CONTENT = 1105 # 1105 - XML_RNGP_START_EMPTY = 1106 # 1106 - XML_RNGP_START_MISSING = 1107 # 1107 - XML_RNGP_TEXT_EXPECTED = 1108 # 1108 - XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 - XML_RNGP_TYPE_MISSING = 1110 # 1110 - XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 - XML_RNGP_TYPE_VALUE = 1112 # 1112 - XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 - XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 - XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 - XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 - XML_RNGP_URI_FRAGMENT = 1117 # 1117 - XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 - XML_RNGP_VALUE_EMPTY = 1119 # 1119 - XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 - XML_RNGP_XMLNS_NAME = 1121 # 1121 - XML_RNGP_XML_NS = 1122 # 1122 - XML_XPATH_EXPRESSION_OK = 1200 - XML_XPATH_NUMBER_ERROR = 1201 # 1201 - XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 - XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 - XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 - XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 - XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 - XML_XPATH_EXPR_ERROR = 1207 # 1207 - XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 - XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 - XML_XPATH_INVALID_OPERAND = 1210 # 1210 - XML_XPATH_INVALID_TYPE = 1211 # 1211 - XML_XPATH_INVALID_ARITY = 1212 # 1212 - XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 - XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 - XML_XPATH_MEMORY_ERROR = 1215 # 1215 - XML_XPTR_SYNTAX_ERROR = 1216 # 1216 - XML_XPTR_RESOURCE_ERROR = 1217 # 1217 - XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 - XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 - XML_XPATH_ENCODING_ERROR = 1220 # 1220 - XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 - XML_TREE_INVALID_HEX = 1300 - XML_TREE_INVALID_DEC = 1301 # 1301 - XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 - XML_SAVE_NOT_UTF8 = 1400 - XML_SAVE_CHAR_INVALID = 1401 # 1401 - XML_SAVE_NO_DOCTYPE = 1402 # 1402 - XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 - XML_REGEXP_COMPILE_ERROR = 1450 - XML_IO_UNKNOWN = 1500 - XML_IO_EACCES = 1501 # 1501 - XML_IO_EAGAIN = 1502 # 1502 - XML_IO_EBADF = 1503 # 1503 - XML_IO_EBADMSG = 1504 # 1504 - XML_IO_EBUSY = 1505 # 1505 - XML_IO_ECANCELED = 1506 # 1506 - XML_IO_ECHILD = 1507 # 1507 - XML_IO_EDEADLK = 1508 # 1508 - XML_IO_EDOM = 1509 # 1509 - XML_IO_EEXIST = 1510 # 1510 - XML_IO_EFAULT = 1511 # 1511 - XML_IO_EFBIG = 1512 # 1512 - XML_IO_EINPROGRESS = 1513 # 1513 - XML_IO_EINTR = 1514 # 1514 - XML_IO_EINVAL = 1515 # 1515 - XML_IO_EIO = 1516 # 1516 - XML_IO_EISDIR = 1517 # 1517 - XML_IO_EMFILE = 1518 # 1518 - XML_IO_EMLINK = 1519 # 1519 - XML_IO_EMSGSIZE = 1520 # 1520 - XML_IO_ENAMETOOLONG = 1521 # 1521 - XML_IO_ENFILE = 1522 # 1522 - XML_IO_ENODEV = 1523 # 1523 - XML_IO_ENOENT = 1524 # 1524 - XML_IO_ENOEXEC = 1525 # 1525 - XML_IO_ENOLCK = 1526 # 1526 - XML_IO_ENOMEM = 1527 # 1527 - XML_IO_ENOSPC = 1528 # 1528 - XML_IO_ENOSYS = 1529 # 1529 - XML_IO_ENOTDIR = 1530 # 1530 - XML_IO_ENOTEMPTY = 1531 # 1531 - XML_IO_ENOTSUP = 1532 # 1532 - XML_IO_ENOTTY = 1533 # 1533 - XML_IO_ENXIO = 1534 # 1534 - XML_IO_EPERM = 1535 # 1535 - XML_IO_EPIPE = 1536 # 1536 - XML_IO_ERANGE = 1537 # 1537 - XML_IO_EROFS = 1538 # 1538 - XML_IO_ESPIPE = 1539 # 1539 - XML_IO_ESRCH = 1540 # 1540 - XML_IO_ETIMEDOUT = 1541 # 1541 - XML_IO_EXDEV = 1542 # 1542 - XML_IO_NETWORK_ATTEMPT = 1543 # 1543 - XML_IO_ENCODER = 1544 # 1544 - XML_IO_FLUSH = 1545 # 1545 - XML_IO_WRITE = 1546 # 1546 - XML_IO_NO_INPUT = 1547 # 1547 - XML_IO_BUFFER_FULL = 1548 # 1548 - XML_IO_LOAD_ERROR = 1549 # 1549 - XML_IO_ENOTSOCK = 1550 # 1550 - XML_IO_EISCONN = 1551 # 1551 - XML_IO_ECONNREFUSED = 1552 # 1552 - XML_IO_ENETUNREACH = 1553 # 1553 - XML_IO_EADDRINUSE = 1554 # 1554 - XML_IO_EALREADY = 1555 # 1555 - XML_IO_EAFNOSUPPORT = 1556 # 1556 - XML_XINCLUDE_RECURSION = 1600 - XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 - XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 - XML_XINCLUDE_NO_HREF = 1603 # 1603 - XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 - XML_XINCLUDE_HREF_URI = 1605 # 1605 - XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 - XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 - XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 - XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 - XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 - XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 - XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 - XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 - XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 - XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 - XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 - XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 - XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 - XML_CATALOG_MISSING_ATTR = 1650 - XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 - XML_CATALOG_PREFER_VALUE = 1652 # 1652 - XML_CATALOG_NOT_CATALOG = 1653 # 1653 - XML_CATALOG_RECURSION = 1654 # 1654 - XML_SCHEMAP_PREFIX_UNDEFINED = 1700 - XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 - XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 - XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 - XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 - XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 - XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 - XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 - XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 - XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 - XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 - XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 - XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 - XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 - XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 - XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 - XML_SCHEMAP_INVALID_FACET = 1716 # 1716 - XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 - XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 - XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 - XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 - XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 - XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 - XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 - XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 - XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 - XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 - XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 - XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 - XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 - XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 - XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 - XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 - XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 - XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 - XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 - XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 - XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 - XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 - XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 - XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 - XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 - XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 - XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 - XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 - XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 - XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 - XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 - XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 - XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 - XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 - XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 - XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 - XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 - XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 - XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 - XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 - XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 - XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 - XML_SCHEMAP_NOROOT = 1759 # 1759 - XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 - XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 - XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 - XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 - XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 - XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 - XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 - XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 - XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 - XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 - XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 - XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 - XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 - XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 - XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 - XML_SCHEMAP_RECURSIVE = 1775 # 1775 - XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 - XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 - XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 - XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 - XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 - XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 - XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 - XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 - XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 - XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 - XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 - XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 - XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 - XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 - XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 - XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 - XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 - XML_SCHEMAV_NOROOT = 1801 - XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 - XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 - XML_SCHEMAV_MISSING = 1804 # 1804 - XML_SCHEMAV_WRONGELEM = 1805 # 1805 - XML_SCHEMAV_NOTYPE = 1806 # 1806 - XML_SCHEMAV_NOROLLBACK = 1807 # 1807 - XML_SCHEMAV_ISABSTRACT = 1808 # 1808 - XML_SCHEMAV_NOTEMPTY = 1809 # 1809 - XML_SCHEMAV_ELEMCONT = 1810 # 1810 - XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 - XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 - XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 - XML_SCHEMAV_INVALIDATTR = 1814 # 1814 - XML_SCHEMAV_INVALIDELEM = 1815 # 1815 - XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 - XML_SCHEMAV_CONSTRUCT = 1817 # 1817 - XML_SCHEMAV_INTERNAL = 1818 # 1818 - XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 - XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 - XML_SCHEMAV_ATTRINVALID = 1821 # 1821 - XML_SCHEMAV_VALUE = 1822 # 1822 - XML_SCHEMAV_FACET = 1823 # 1823 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 - XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 - XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 - XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 - XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 - XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 - XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 - XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 - XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 - XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 - XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 - XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 - XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 - XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 - XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 - XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 - XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 - XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 - XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 - XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 - XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 - XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 - XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 - XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 - XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 - XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 - XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 - XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 - XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 - XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 - XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 - XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 - XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 - XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 - XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 - XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 - XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 - XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 - XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 - XML_SCHEMAV_CVC_AU = 1874 # 1874 - XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 - XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 - XML_SCHEMAV_CVC_IDC = 1877 # 1877 - XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 - XML_XPTR_UNKNOWN_SCHEME = 1900 - XML_XPTR_CHILDSEQ_START = 1901 # 1901 - XML_XPTR_EVAL_FAILED = 1902 # 1902 - XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 - XML_C14N_CREATE_CTXT = 1950 - XML_C14N_REQUIRES_UTF8 = 1951 # 1951 - XML_C14N_CREATE_STACK = 1952 # 1952 - XML_C14N_INVALID_NODE = 1953 # 1953 - XML_C14N_UNKNOW_NODE = 1954 # 1954 - XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 - XML_FTP_PASV_ANSWER = 2000 - XML_FTP_EPSV_ANSWER = 2001 # 2001 - XML_FTP_ACCNT = 2002 # 2002 - XML_FTP_URL_SYNTAX = 2003 # 2003 - XML_HTTP_URL_SYNTAX = 2020 - XML_HTTP_USE_IP = 2021 # 2021 - XML_HTTP_UNKNOWN_HOST = 2022 # 2022 - XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 - XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 - XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 - XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 - XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 - XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 - XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 - XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 - XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 - XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 - XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 - XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 - XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 - XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 - XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 - XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 - XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 - XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 - XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 - XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 - XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 - XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 - XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 - XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 - XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 - XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 - XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 - XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 - XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 - XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 - XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 - XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 - XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 - XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 - XML_SCHEMAP_NO_XMLNS = 3056 # 3056 - XML_SCHEMAP_NO_XSI = 3057 # 3057 - XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 - XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 - XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 - XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 - XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 - XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 - XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 - XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 - XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 - XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C - XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 - XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 - XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 - XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 - XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 - XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 - XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 - XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 - XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 - XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 - XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 - XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 - XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 - XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 - XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 - XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 - XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 - XML_MODULE_OPEN = 4900 # 4900 - XML_MODULE_CLOSE = 4901 # 4901 - XML_CHECK_FOUND_ELEMENT = 5000 - XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 - XML_CHECK_FOUND_TEXT = 5002 # 5002 - XML_CHECK_FOUND_CDATA = 5003 # 5003 - XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 - XML_CHECK_FOUND_ENTITY = 5005 # 5005 - XML_CHECK_FOUND_PI = 5006 # 5006 - XML_CHECK_FOUND_COMMENT = 5007 # 5007 - XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 - XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 - XML_CHECK_FOUND_NOTATION = 5010 # 5010 - XML_CHECK_UNKNOWN_NODE = 5011 # 5011 - XML_CHECK_ENTITY_TYPE = 5012 # 5012 - XML_CHECK_NO_PARENT = 5013 # 5013 - XML_CHECK_NO_DOC = 5014 # 5014 - XML_CHECK_NO_NAME = 5015 # 5015 - XML_CHECK_NO_ELEM = 5016 # 5016 - XML_CHECK_WRONG_DOC = 5017 # 5017 - XML_CHECK_NO_PREV = 5018 # 5018 - XML_CHECK_WRONG_PREV = 5019 # 5019 - XML_CHECK_NO_NEXT = 5020 # 5020 - XML_CHECK_WRONG_NEXT = 5021 # 5021 - XML_CHECK_NOT_DTD = 5022 # 5022 - XML_CHECK_NOT_ATTR = 5023 # 5023 - XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 - XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 - XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 - XML_CHECK_NOT_NS_DECL = 5027 # 5027 - XML_CHECK_NO_HREF = 5028 # 5028 - XML_CHECK_WRONG_PARENT = 5029 # 5029 - XML_CHECK_NS_SCOPE = 5030 # 5030 - XML_CHECK_NS_ANCESTOR = 5031 # 5031 - XML_CHECK_NOT_UTF8 = 5032 # 5032 - XML_CHECK_NO_DICT = 5033 # 5033 - XML_CHECK_NOT_NCNAME = 5034 # 5034 - XML_CHECK_OUTSIDE_DICT = 5035 # 5035 - XML_CHECK_WRONG_NAME = 5036 # 5036 - XML_CHECK_NAME_NOT_NULL = 5037 # 5037 - XML_I18N_NO_NAME = 6000 - XML_I18N_NO_HANDLER = 6001 # 6001 - XML_I18N_EXCESS_HANDLER = 6002 # 6002 - XML_I18N_CONV_FAILED = 6003 # 6003 - XML_I18N_NO_OUTPUT = 6004 # 6004 - XML_CHECK_ = 6005 # 5033 - XML_CHECK_X = 6006 # 503 cdef extern from "libxml/globals.h": cdef void xmlThrDefSetGenericErrorFunc(void* ctx, Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi Sun Jun 4 17:20:25 2006 @@ -378,7 +378,7 @@ xmlerror.xmlSetStructuredErrorFunc(NULL, _receiveError) ################################################################################ -## CONSTANTS FROM "xmlerror.h" +## CONSTANTS FROM "xmlerror.h" (or rather libxml-xmlerror.html) ################################################################################ cdef void __initErrorConstants(): @@ -400,779 +400,831 @@ class ErrorLevels: "Libxml2 error levels" -cdef object __ERROR_LEVELS -__ERROR_LEVELS = """ - XML_ERR_NONE = 0 - XML_ERR_WARNING = 1 : A simple warning - XML_ERR_ERROR = 2 : A recoverable error - XML_ERR_FATAL = 3 : A fatal error -""" - class ErrorDomains: "Libxml2 error domains" -cdef object __ERROR_DOMAINS -__ERROR_DOMAINS = """ - XML_FROM_NONE = 0 - XML_FROM_PARSER = 1 : The XML parser - XML_FROM_TREE = 2 : The tree module - XML_FROM_NAMESPACE = 3 : The XML Namespace module - XML_FROM_DTD = 4 : The XML DTD validation with parser contex - XML_FROM_HTML = 5 : The HTML parser - XML_FROM_MEMORY = 6 : The memory allocator - XML_FROM_OUTPUT = 7 : The serialization code - XML_FROM_IO = 8 : The Input/Output stack - XML_FROM_FTP = 9 : The FTP module - XML_FROM_HTTP = 10 : The HTTP module - XML_FROM_XINCLUDE = 11 : The XInclude processing - XML_FROM_XPATH = 12 : The XPath module - XML_FROM_XPOINTER = 13 : The XPointer module - XML_FROM_REGEXP = 14 : The regular expressions module - XML_FROM_DATATYPE = 15 : The W3C XML Schemas Datatype module - XML_FROM_SCHEMASP = 16 : The W3C XML Schemas parser module - XML_FROM_SCHEMASV = 17 : The W3C XML Schemas validation module - XML_FROM_RELAXNGP = 18 : The Relax-NG parser module - XML_FROM_RELAXNGV = 19 : The Relax-NG validator module - XML_FROM_CATALOG = 20 : The Catalog module - XML_FROM_C14N = 21 : The Canonicalization module - XML_FROM_XSLT = 22 : The XSLT engine from libxslt - XML_FROM_VALID = 23 : The XML DTD validation with valid context - XML_FROM_CHECK = 24 : The error checking module - XML_FROM_WRITER = 25 : The xmlwriter module - XML_FROM_MODULE = 26 : The dynamically loaded module modul - XML_FROM_I18N = 27 : The module handling character conversion -""" - class ErrorTypes: "Libxml2 error types" +# --- BEGIN: GENERATED CONSTANTS --- +cdef object __ERROR_LEVELS +__ERROR_LEVELS = """\ +XML_ERR_NONE = 0 +XML_ERR_WARNING = 1 # A simple warning +XML_ERR_ERROR = 2 # A recoverable error +XML_ERR_FATAL = 3 # A fatal error +""" + +cdef object __ERROR_DOMAINS +__ERROR_DOMAINS = """\ +XML_FROM_NONE = 0 +XML_FROM_PARSER = 1 # The XML parser +XML_FROM_TREE = 2 # The tree module +XML_FROM_NAMESPACE = 3 # The XML Namespace module +XML_FROM_DTD = 4 # The XML DTD validation with parser contex +XML_FROM_HTML = 5 # The HTML parser +XML_FROM_MEMORY = 6 # The memory allocator +XML_FROM_OUTPUT = 7 # The serialization code +XML_FROM_IO = 8 # The Input/Output stack +XML_FROM_FTP = 9 # The FTP module +XML_FROM_HTTP = 10 # The HTTP module +XML_FROM_XINCLUDE = 11 # The XInclude processing +XML_FROM_XPATH = 12 # The XPath module +XML_FROM_XPOINTER = 13 # The XPointer module +XML_FROM_REGEXP = 14 # The regular expressions module +XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module +XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module +XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module +XML_FROM_RELAXNGP = 18 # The Relax-NG parser module +XML_FROM_RELAXNGV = 19 # The Relax-NG validator module +XML_FROM_CATALOG = 20 # The Catalog module +XML_FROM_C14N = 21 # The Canonicalization module +XML_FROM_XSLT = 22 # The XSLT engine from libxslt +""" + \ +"""\ +XML_FROM_VALID = 23 # The XML DTD validation with valid context +XML_FROM_CHECK = 24 # The error checking module +XML_FROM_WRITER = 25 # The xmlwriter module +XML_FROM_MODULE = 26 # The dynamically loaded module modul +XML_FROM_I18N = 27 # The module handling character conversion +""" + cdef object __ERROR_TYPES -__ERROR_TYPES = """ - XML_ERR_OK = 0 - XML_ERR_INTERNAL_ERROR = 1 : 1 - XML_ERR_NO_MEMORY = 2 : 2 - XML_ERR_DOCUMENT_START = 3 : 3 - XML_ERR_DOCUMENT_EMPTY = 4 : 4 - XML_ERR_DOCUMENT_END = 5 : 5 - XML_ERR_INVALID_HEX_CHARREF = 6 : 6 - XML_ERR_INVALID_DEC_CHARREF = 7 : 7 - XML_ERR_INVALID_CHARREF = 8 : 8 - XML_ERR_INVALID_CHAR = 9 : 9 - XML_ERR_CHARREF_AT_EOF = 10 : 10 - XML_ERR_CHARREF_IN_PROLOG = 11 : 11 - XML_ERR_CHARREF_IN_EPILOG = 12 : 12 - XML_ERR_CHARREF_IN_DTD = 13 : 13 - XML_ERR_ENTITYREF_AT_EOF = 14 : 14 - XML_ERR_ENTITYREF_IN_PROLOG = 15 : 15 - XML_ERR_ENTITYREF_IN_EPILOG = 16 : 16 - XML_ERR_ENTITYREF_IN_DTD = 17 : 17 - XML_ERR_PEREF_AT_EOF = 18 : 18 - XML_ERR_PEREF_IN_PROLOG = 19 : 19 - XML_ERR_PEREF_IN_EPILOG = 20 : 20 - XML_ERR_PEREF_IN_INT_SUBSET = 21 : 21 - XML_ERR_ENTITYREF_NO_NAME = 22 : 22 - XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 : 23 - XML_ERR_PEREF_NO_NAME = 24 : 24 - XML_ERR_PEREF_SEMICOL_MISSING = 25 : 25 - XML_ERR_UNDECLARED_ENTITY = 26 : 26 - XML_WAR_UNDECLARED_ENTITY = 27 : 27 - XML_ERR_UNPARSED_ENTITY = 28 : 28 - XML_ERR_ENTITY_IS_EXTERNAL = 29 : 29 - XML_ERR_ENTITY_IS_PARAMETER = 30 : 30 - XML_ERR_UNKNOWN_ENCODING = 31 : 31 - XML_ERR_UNSUPPORTED_ENCODING = 32 : 32 - XML_ERR_STRING_NOT_STARTED = 33 : 33 - XML_ERR_STRING_NOT_CLOSED = 34 : 34 - XML_ERR_NS_DECL_ERROR = 35 : 35 - XML_ERR_ENTITY_NOT_STARTED = 36 : 36 - XML_ERR_ENTITY_NOT_FINISHED = 37 : 37 - XML_ERR_LT_IN_ATTRIBUTE = 38 : 38 - XML_ERR_ATTRIBUTE_NOT_STARTED = 39 : 39 - XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 : 40 - XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 : 41 - XML_ERR_ATTRIBUTE_REDEFINED = 42 : 42 - XML_ERR_LITERAL_NOT_STARTED = 43 : 43 - XML_ERR_LITERAL_NOT_FINISHED = 44 : 44 - XML_ERR_COMMENT_NOT_FINISHED = 45 : 45 - XML_ERR_PI_NOT_STARTED = 46 : 46 - XML_ERR_PI_NOT_FINISHED = 47 : 47 - XML_ERR_NOTATION_NOT_STARTED = 48 : 48 - XML_ERR_NOTATION_NOT_FINISHED = 49 : 49 - XML_ERR_ATTLIST_NOT_STARTED = 50 : 50 - XML_ERR_ATTLIST_NOT_FINISHED = 51 : 51 - XML_ERR_MIXED_NOT_STARTED = 52 : 52 - XML_ERR_MIXED_NOT_FINISHED = 53 : 53 - XML_ERR_ELEMCONTENT_NOT_STARTED = 54 : 54 - XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 : 55 - XML_ERR_XMLDECL_NOT_STARTED = 56 : 56 - XML_ERR_XMLDECL_NOT_FINISHED = 57 : 57 - XML_ERR_CONDSEC_NOT_STARTED = 58 : 58 - XML_ERR_CONDSEC_NOT_FINISHED = 59 : 59 - XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 : 60 - XML_ERR_DOCTYPE_NOT_FINISHED = 61 : 61 - XML_ERR_MISPLACED_CDATA_END = 62 : 62 - XML_ERR_CDATA_NOT_FINISHED = 63 : 63 - XML_ERR_RESERVED_XML_NAME = 64 : 64 - XML_ERR_SPACE_REQUIRED = 65 : 65 - XML_ERR_SEPARATOR_REQUIRED = 66 : 66 - XML_ERR_NMTOKEN_REQUIRED = 67 : 67 - XML_ERR_NAME_REQUIRED = 68 : 68 - XML_ERR_PCDATA_REQUIRED = 69 : 69 - XML_ERR_URI_REQUIRED = 70 : 70 - XML_ERR_PUBID_REQUIRED = 71 : 71 - XML_ERR_LT_REQUIRED = 72 : 72 - XML_ERR_GT_REQUIRED = 73 : 73 - XML_ERR_LTSLASH_REQUIRED = 74 : 74 - XML_ERR_EQUAL_REQUIRED = 75 : 75 - XML_ERR_TAG_NAME_MISMATCH = 76 : 76 - XML_ERR_TAG_NOT_FINISHED = 77 : 77 - XML_ERR_STANDALONE_VALUE = 78 : 78 - XML_ERR_ENCODING_NAME = 79 : 79 - XML_ERR_HYPHEN_IN_COMMENT = 80 : 80 - XML_ERR_INVALID_ENCODING = 81 : 81 - XML_ERR_EXT_ENTITY_STANDALONE = 82 : 82 - XML_ERR_CONDSEC_INVALID = 83 : 83 - XML_ERR_VALUE_REQUIRED = 84 : 84 - XML_ERR_NOT_WELL_BALANCED = 85 : 85 - XML_ERR_EXTRA_CONTENT = 86 : 86 - XML_ERR_ENTITY_CHAR_ERROR = 87 : 87 - XML_ERR_ENTITY_PE_INTERNAL = 88 : 88 - XML_ERR_ENTITY_LOOP = 89 : 89 - XML_ERR_ENTITY_BOUNDARY = 90 : 90 - XML_ERR_INVALID_URI = 91 : 91 - XML_ERR_URI_FRAGMENT = 92 : 92 - XML_WAR_CATALOG_PI = 93 : 93 - XML_ERR_NO_DTD = 94 : 94 - XML_ERR_CONDSEC_INVALID_KEYWORD = 95 : 95 - XML_ERR_VERSION_MISSING = 96 : 96 - XML_WAR_UNKNOWN_VERSION = 97 : 97 - XML_WAR_LANG_VALUE = 98 : 98 - XML_WAR_NS_URI = 99 : 99 - XML_WAR_NS_URI_RELATIVE = 100 : 100 - XML_ERR_MISSING_ENCODING = 101 : 101 - XML_WAR_SPACE_VALUE = 102 : 102 - XML_ERR_NOT_STANDALONE = 103 : 103 - XML_ERR_ENTITY_PROCESSING = 104 : 104 - XML_ERR_NOTATION_PROCESSING = 105 : 105 - XML_WAR_NS_COLUMN = 106 : 106 - XML_WAR_ENTITY_REDEFINED = 107 : 107 - XML_NS_ERR_XML_NAMESPACE = 200 - XML_NS_ERR_UNDEFINED_NAMESPACE = 201 : 201 - XML_NS_ERR_QNAME = 202 : 202 - XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 : 203 - XML_NS_ERR_EMPTY = 204 : 204 - XML_DTD_ATTRIBUTE_DEFAULT = 500 - XML_DTD_ATTRIBUTE_REDEFINED = 501 : 501 - XML_DTD_ATTRIBUTE_VALUE = 502 : 502 - XML_DTD_CONTENT_ERROR = 503 : 503 - XML_DTD_CONTENT_MODEL = 504 : 504 - XML_DTD_CONTENT_NOT_DETERMINIST = 505 : 505 - XML_DTD_DIFFERENT_PREFIX = 506 : 506 - XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 : 507 - XML_DTD_ELEM_NAMESPACE = 508 : 508 - XML_DTD_ELEM_REDEFINED = 509 : 509 - XML_DTD_EMPTY_NOTATION = 510 : 510 - XML_DTD_ENTITY_TYPE = 511 : 511 - XML_DTD_ID_FIXED = 512 : 512 - XML_DTD_ID_REDEFINED = 513 : 513 - XML_DTD_ID_SUBSET = 514 : 514 - XML_DTD_INVALID_CHILD = 515 : 515 - XML_DTD_INVALID_DEFAULT = 516 : 516 - XML_DTD_LOAD_ERROR = 517 : 517 - XML_DTD_MISSING_ATTRIBUTE = 518 : 518 - XML_DTD_MIXED_CORRUPT = 519 : 519 - XML_DTD_MULTIPLE_ID = 520 : 520 - XML_DTD_NO_DOC = 521 : 521 - XML_DTD_NO_DTD = 522 : 522 - XML_DTD_NO_ELEM_NAME = 523 : 523 - XML_DTD_NO_PREFIX = 524 : 524 - XML_DTD_NO_ROOT = 525 : 525 - XML_DTD_NOTATION_REDEFINED = 526 : 526 - XML_DTD_NOTATION_VALUE = 527 : 527 - XML_DTD_NOT_EMPTY = 528 : 528 - XML_DTD_NOT_PCDATA = 529 : 529 - XML_DTD_NOT_STANDALONE = 530 : 530 - XML_DTD_ROOT_NAME = 531 : 531 - XML_DTD_STANDALONE_WHITE_SPACE = 532 : 532 - XML_DTD_UNKNOWN_ATTRIBUTE = 533 : 533 - XML_DTD_UNKNOWN_ELEM = 534 : 534 - XML_DTD_UNKNOWN_ENTITY = 535 : 535 - XML_DTD_UNKNOWN_ID = 536 : 536 - XML_DTD_UNKNOWN_NOTATION = 537 : 537 - XML_DTD_STANDALONE_DEFAULTED = 538 : 538 - XML_DTD_XMLID_VALUE = 539 : 539 - XML_DTD_XMLID_TYPE = 540 : 540 - XML_HTML_STRUCURE_ERROR = 800 - XML_HTML_UNKNOWN_TAG = 801 : 801 - XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 - XML_RNGP_ATTR_CONFLICT = 1001 : 1001 - XML_RNGP_ATTRIBUTE_CHILDREN = 1002 : 1002 - XML_RNGP_ATTRIBUTE_CONTENT = 1003 : 1003 - XML_RNGP_ATTRIBUTE_EMPTY = 1004 : 1004 - XML_RNGP_ATTRIBUTE_NOOP = 1005 : 1005 - XML_RNGP_CHOICE_CONTENT = 1006 : 1006 - XML_RNGP_CHOICE_EMPTY = 1007 : 1007 - XML_RNGP_CREATE_FAILURE = 1008 : 1008 - XML_RNGP_DATA_CONTENT = 1009 : 1009 - XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 : 1010 - XML_RNGP_DEFINE_CREATE_FAILED = 1011 : 1011 - XML_RNGP_DEFINE_EMPTY = 1012 : 1012 - XML_RNGP_DEFINE_MISSING = 1013 : 1013 - XML_RNGP_DEFINE_NAME_MISSING = 1014 : 1014 - XML_RNGP_ELEM_CONTENT_EMPTY = 1015 : 1015 - XML_RNGP_ELEM_CONTENT_ERROR = 1016 : 1016 - XML_RNGP_ELEMENT_EMPTY = 1017 : 1017 - XML_RNGP_ELEMENT_CONTENT = 1018 : 1018 - XML_RNGP_ELEMENT_NAME = 1019 : 1019 - XML_RNGP_ELEMENT_NO_CONTENT = 1020 : 1020 - XML_RNGP_ELEM_TEXT_CONFLICT = 1021 : 1021 - XML_RNGP_EMPTY = 1022 : 1022 - XML_RNGP_EMPTY_CONSTRUCT = 1023 : 1023 - XML_RNGP_EMPTY_CONTENT = 1024 : 1024 - XML_RNGP_EMPTY_NOT_EMPTY = 1025 : 1025 - XML_RNGP_ERROR_TYPE_LIB = 1026 : 1026 - XML_RNGP_EXCEPT_EMPTY = 1027 : 1027 - XML_RNGP_EXCEPT_MISSING = 1028 : 1028 - XML_RNGP_EXCEPT_MULTIPLE = 1029 : 1029 - XML_RNGP_EXCEPT_NO_CONTENT = 1030 : 1030 - XML_RNGP_EXTERNALREF_EMTPY = 1031 : 1031 - XML_RNGP_EXTERNAL_REF_FAILURE = 1032 : 1032 - XML_RNGP_EXTERNALREF_RECURSE = 1033 : 1033 - XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 : 1034 - XML_RNGP_FOREIGN_ELEMENT = 1035 : 1035 - XML_RNGP_GRAMMAR_CONTENT = 1036 : 1036 - XML_RNGP_GRAMMAR_EMPTY = 1037 : 1037 - XML_RNGP_GRAMMAR_MISSING = 1038 : 1038 - XML_RNGP_GRAMMAR_NO_START = 1039 : 1039 - XML_RNGP_GROUP_ATTR_CONFLICT = 1040 : 1040 - XML_RNGP_HREF_ERROR = 1041 : 1041 - XML_RNGP_INCLUDE_EMPTY = 1042 : 1042 - XML_RNGP_INCLUDE_FAILURE = 1043 : 1043 - XML_RNGP_INCLUDE_RECURSE = 1044 : 1044 - XML_RNGP_INTERLEAVE_ADD = 1045 : 1045 - XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 : 1046 - XML_RNGP_INTERLEAVE_EMPTY = 1047 : 1047 - XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 : 1048 - XML_RNGP_INVALID_DEFINE_NAME = 1049 : 1049 - XML_RNGP_INVALID_URI = 1050 : 1050 - XML_RNGP_INVALID_VALUE = 1051 : 1051 - XML_RNGP_MISSING_HREF = 1052 : 1052 - XML_RNGP_NAME_MISSING = 1053 : 1053 - XML_RNGP_NEED_COMBINE = 1054 : 1054 - XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 : 1055 - XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 : 1056 - XML_RNGP_NSNAME_NO_NS = 1057 : 1057 - XML_RNGP_PARAM_FORBIDDEN = 1058 : 1058 - XML_RNGP_PARAM_NAME_MISSING = 1059 : 1059 - XML_RNGP_PARENTREF_CREATE_FAILED = 1060 : 1060 - XML_RNGP_PARENTREF_NAME_INVALID = 1061 : 1061 - XML_RNGP_PARENTREF_NO_NAME = 1062 : 1062 - XML_RNGP_PARENTREF_NO_PARENT = 1063 : 1063 - XML_RNGP_PARENTREF_NOT_EMPTY = 1064 : 1064 - XML_RNGP_PARSE_ERROR = 1065 : 1065 - XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 : 1066 - XML_RNGP_PAT_ATTR_ATTR = 1067 : 1067 - XML_RNGP_PAT_ATTR_ELEM = 1068 : 1068 - XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 : 1069 - XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 : 1070 - XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 : 1071 - XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 : 1072 - XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 : 1073 - XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 : 1074 - XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 : 1075 - XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 : 1076 - XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 : 1077 - XML_RNGP_PAT_LIST_ATTR = 1078 : 1078 - XML_RNGP_PAT_LIST_ELEM = 1079 : 1079 - XML_RNGP_PAT_LIST_INTERLEAVE = 1080 : 1080 - XML_RNGP_PAT_LIST_LIST = 1081 : 1081 - XML_RNGP_PAT_LIST_REF = 1082 : 1082 - XML_RNGP_PAT_LIST_TEXT = 1083 : 1083 - XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 : 1084 - XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 : 1085 - XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 : 1086 - XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 : 1087 - XML_RNGP_PAT_START_ATTR = 1088 : 1088 - XML_RNGP_PAT_START_DATA = 1089 : 1089 - XML_RNGP_PAT_START_EMPTY = 1090 : 1090 - XML_RNGP_PAT_START_GROUP = 1091 : 1091 - XML_RNGP_PAT_START_INTERLEAVE = 1092 : 1092 - XML_RNGP_PAT_START_LIST = 1093 : 1093 - XML_RNGP_PAT_START_ONEMORE = 1094 : 1094 - XML_RNGP_PAT_START_TEXT = 1095 : 1095 - XML_RNGP_PAT_START_VALUE = 1096 : 1096 - XML_RNGP_PREFIX_UNDEFINED = 1097 : 1097 - XML_RNGP_REF_CREATE_FAILED = 1098 : 1098 - XML_RNGP_REF_CYCLE = 1099 : 1099 - XML_RNGP_REF_NAME_INVALID = 1100 : 1100 - XML_RNGP_REF_NO_DEF = 1101 : 1101 - XML_RNGP_REF_NO_NAME = 1102 : 1102 - XML_RNGP_REF_NOT_EMPTY = 1103 : 1103 - XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 : 1104 - XML_RNGP_START_CONTENT = 1105 : 1105 - XML_RNGP_START_EMPTY = 1106 : 1106 - XML_RNGP_START_MISSING = 1107 : 1107 - XML_RNGP_TEXT_EXPECTED = 1108 : 1108 - XML_RNGP_TEXT_HAS_CHILD = 1109 : 1109 - XML_RNGP_TYPE_MISSING = 1110 : 1110 - XML_RNGP_TYPE_NOT_FOUND = 1111 : 1111 - XML_RNGP_TYPE_VALUE = 1112 : 1112 - XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 : 1113 - XML_RNGP_UNKNOWN_COMBINE = 1114 : 1114 - XML_RNGP_UNKNOWN_CONSTRUCT = 1115 : 1115 - XML_RNGP_UNKNOWN_TYPE_LIB = 1116 : 1116 - XML_RNGP_URI_FRAGMENT = 1117 : 1117 - XML_RNGP_URI_NOT_ABSOLUTE = 1118 : 1118 - XML_RNGP_VALUE_EMPTY = 1119 : 1119 - XML_RNGP_VALUE_NO_CONTENT = 1120 : 1120 - XML_RNGP_XMLNS_NAME = 1121 : 1121 - XML_RNGP_XML_NS = 1122 : 1122 - XML_XPATH_EXPRESSION_OK = 1200 - XML_XPATH_NUMBER_ERROR = 1201 : 1201 - XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 : 1202 - XML_XPATH_START_LITERAL_ERROR = 1203 : 1203 - XML_XPATH_VARIABLE_REF_ERROR = 1204 : 1204 - XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 : 1205 - XML_XPATH_INVALID_PREDICATE_ERROR = 1206 : 1206 - XML_XPATH_EXPR_ERROR = 1207 : 1207 - XML_XPATH_UNCLOSED_ERROR = 1208 : 1208 - XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 : 1209 - XML_XPATH_INVALID_OPERAND = 1210 : 1210 - XML_XPATH_INVALID_TYPE = 1211 : 1211 - XML_XPATH_INVALID_ARITY = 1212 : 1212 - XML_XPATH_INVALID_CTXT_SIZE = 1213 : 1213 - XML_XPATH_INVALID_CTXT_POSITION = 1214 : 1214 - XML_XPATH_MEMORY_ERROR = 1215 : 1215 - XML_XPTR_SYNTAX_ERROR = 1216 : 1216 - XML_XPTR_RESOURCE_ERROR = 1217 : 1217 - XML_XPTR_SUB_RESOURCE_ERROR = 1218 : 1218 - XML_XPATH_UNDEF_PREFIX_ERROR = 1219 : 1219 - XML_XPATH_ENCODING_ERROR = 1220 : 1220 - XML_XPATH_INVALID_CHAR_ERROR = 1221 : 1221 - XML_TREE_INVALID_HEX = 1300 - XML_TREE_INVALID_DEC = 1301 : 1301 - XML_TREE_UNTERMINATED_ENTITY = 1302 : 1302 - XML_SAVE_NOT_UTF8 = 1400 - XML_SAVE_CHAR_INVALID = 1401 : 1401 - XML_SAVE_NO_DOCTYPE = 1402 : 1402 - XML_SAVE_UNKNOWN_ENCODING = 1403 : 1403 - XML_REGEXP_COMPILE_ERROR = 1450 - XML_IO_UNKNOWN = 1500 - XML_IO_EACCES = 1501 : 1501 - XML_IO_EAGAIN = 1502 : 1502 - XML_IO_EBADF = 1503 : 1503 - XML_IO_EBADMSG = 1504 : 1504 - XML_IO_EBUSY = 1505 : 1505 - XML_IO_ECANCELED = 1506 : 1506 - XML_IO_ECHILD = 1507 : 1507 - XML_IO_EDEADLK = 1508 : 1508 - XML_IO_EDOM = 1509 : 1509 - XML_IO_EEXIST = 1510 : 1510 - XML_IO_EFAULT = 1511 : 1511 - XML_IO_EFBIG = 1512 : 1512 - XML_IO_EINPROGRESS = 1513 : 1513 - XML_IO_EINTR = 1514 : 1514 - XML_IO_EINVAL = 1515 : 1515 - XML_IO_EIO = 1516 : 1516 - XML_IO_EISDIR = 1517 : 1517 - XML_IO_EMFILE = 1518 : 1518 - XML_IO_EMLINK = 1519 : 1519 - XML_IO_EMSGSIZE = 1520 : 1520 - XML_IO_ENAMETOOLONG = 1521 : 1521 - XML_IO_ENFILE = 1522 : 1522 - XML_IO_ENODEV = 1523 : 1523 - XML_IO_ENOENT = 1524 : 1524 - XML_IO_ENOEXEC = 1525 : 1525 - XML_IO_ENOLCK = 1526 : 1526 - XML_IO_ENOMEM = 1527 : 1527 - XML_IO_ENOSPC = 1528 : 1528 - XML_IO_ENOSYS = 1529 : 1529 - XML_IO_ENOTDIR = 1530 : 1530 - XML_IO_ENOTEMPTY = 1531 : 1531 - XML_IO_ENOTSUP = 1532 : 1532 - XML_IO_ENOTTY = 1533 : 1533 - XML_IO_ENXIO = 1534 : 1534 - XML_IO_EPERM = 1535 : 1535 - XML_IO_EPIPE = 1536 : 1536 - XML_IO_ERANGE = 1537 : 1537 - XML_IO_EROFS = 1538 : 1538 - XML_IO_ESPIPE = 1539 : 1539 - XML_IO_ESRCH = 1540 : 1540 - XML_IO_ETIMEDOUT = 1541 : 1541 - XML_IO_EXDEV = 1542 : 1542 - XML_IO_NETWORK_ATTEMPT = 1543 : 1543 - XML_IO_ENCODER = 1544 : 1544 - XML_IO_FLUSH = 1545 : 1545 - XML_IO_WRITE = 1546 : 1546 - XML_IO_NO_INPUT = 1547 : 1547 - XML_IO_BUFFER_FULL = 1548 : 1548 - XML_IO_LOAD_ERROR = 1549 : 1549 - XML_IO_ENOTSOCK = 1550 : 1550 - XML_IO_EISCONN = 1551 : 1551 - XML_IO_ECONNREFUSED = 1552 : 1552 - XML_IO_ENETUNREACH = 1553 : 1553 - XML_IO_EADDRINUSE = 1554 : 1554 - XML_IO_EALREADY = 1555 : 1555 - XML_IO_EAFNOSUPPORT = 1556 : 1556 - XML_XINCLUDE_RECURSION = 1600 - XML_XINCLUDE_PARSE_VALUE = 1601 : 1601 - XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 : 1602 - XML_XINCLUDE_NO_HREF = 1603 : 1603 - XML_XINCLUDE_NO_FALLBACK = 1604 : 1604 - XML_XINCLUDE_HREF_URI = 1605 : 1605 - XML_XINCLUDE_TEXT_FRAGMENT = 1606 : 1606 - XML_XINCLUDE_TEXT_DOCUMENT = 1607 : 1607 - XML_XINCLUDE_INVALID_CHAR = 1608 : 1608 - XML_XINCLUDE_BUILD_FAILED = 1609 : 1609 - XML_XINCLUDE_UNKNOWN_ENCODING = 1610 : 1610 - XML_XINCLUDE_MULTIPLE_ROOT = 1611 : 1611 - XML_XINCLUDE_XPTR_FAILED = 1612 : 1612 - XML_XINCLUDE_XPTR_RESULT = 1613 : 1613 - XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 : 1614 - XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 : 1615 - XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 : 1616 - XML_XINCLUDE_DEPRECATED_NS = 1617 : 1617 - XML_XINCLUDE_FRAGMENT_ID = 1618 : 1618 - XML_CATALOG_MISSING_ATTR = 1650 - XML_CATALOG_ENTRY_BROKEN = 1651 : 1651 - XML_CATALOG_PREFER_VALUE = 1652 : 1652 - XML_CATALOG_NOT_CATALOG = 1653 : 1653 - XML_CATALOG_RECURSION = 1654 : 1654 - XML_SCHEMAP_PREFIX_UNDEFINED = 1700 - XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 : 1701 - XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 : 1702 - XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 : 1703 - XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 : 1704 - XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 : 1705 - XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 : 1706 - XML_SCHEMAP_EXTENSION_NO_BASE = 1707 : 1707 - XML_SCHEMAP_FACET_NO_VALUE = 1708 : 1708 - XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 : 1709 - XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 : 1710 - XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 : 1711 - XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 : 1712 - XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 : 1713 - XML_SCHEMAP_INVALID_BOOLEAN = 1714 : 1714 - XML_SCHEMAP_INVALID_ENUM = 1715 : 1715 - XML_SCHEMAP_INVALID_FACET = 1716 : 1716 - XML_SCHEMAP_INVALID_FACET_VALUE = 1717 : 1717 - XML_SCHEMAP_INVALID_MAXOCCURS = 1718 : 1718 - XML_SCHEMAP_INVALID_MINOCCURS = 1719 : 1719 - XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 : 1720 - XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 : 1721 - XML_SCHEMAP_NOATTR_NOREF = 1722 : 1722 - XML_SCHEMAP_NOTATION_NO_NAME = 1723 : 1723 - XML_SCHEMAP_NOTYPE_NOREF = 1724 : 1724 - XML_SCHEMAP_REF_AND_SUBTYPE = 1725 : 1725 - XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 : 1726 - XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 : 1727 - XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 : 1728 - XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 : 1729 - XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 : 1730 - XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 : 1731 - XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 : 1732 - XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 : 1733 - XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 : 1734 - XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 : 1735 - XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 : 1736 - XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 : 1737 - XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 : 1738 - XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 : 1739 - XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 : 1740 - XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 : 1741 - XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 : 1742 - XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 : 1743 - XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 : 1744 - XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 : 1745 - XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 : 1746 - XML_SCHEMAP_UNKNOWN_REF = 1747 : 1747 - XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 : 1748 - XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 : 1749 - XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 : 1750 - XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 : 1751 - XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 : 1752 - XML_SCHEMAP_UNKNOWN_TYPE = 1753 : 1753 - XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 : 1754 - XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 : 1755 - XML_SCHEMAP_REGEXP_INVALID = 1756 : 1756 - XML_SCHEMAP_FAILED_LOAD = 1757 : 1757 - XML_SCHEMAP_NOTHING_TO_PARSE = 1758 : 1758 - XML_SCHEMAP_NOROOT = 1759 : 1759 - XML_SCHEMAP_REDEFINED_GROUP = 1760 : 1760 - XML_SCHEMAP_REDEFINED_TYPE = 1761 : 1761 - XML_SCHEMAP_REDEFINED_ELEMENT = 1762 : 1762 - XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 : 1763 - XML_SCHEMAP_REDEFINED_ATTR = 1764 : 1764 - XML_SCHEMAP_REDEFINED_NOTATION = 1765 : 1765 - XML_SCHEMAP_FAILED_PARSE = 1766 : 1766 - XML_SCHEMAP_UNKNOWN_PREFIX = 1767 : 1767 - XML_SCHEMAP_DEF_AND_PREFIX = 1768 : 1768 - XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 : 1769 - XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 : 1770 - XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 : 1771 - XML_SCHEMAP_NOT_SCHEMA = 1772 : 1772 - XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 : 1773 - XML_SCHEMAP_INVALID_ATTR_USE = 1774 : 1774 - XML_SCHEMAP_RECURSIVE = 1775 : 1775 - XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 : 1776 - XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 : 1777 - XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 : 1778 - XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 : 1779 - XML_SCHEMAP_INVALID_ATTR_NAME = 1780 : 1780 - XML_SCHEMAP_REF_AND_CONTENT = 1781 : 1781 - XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 : 1782 - XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 : 1783 - XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 : 1784 - XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 : 1785 - XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 : 1786 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 : 1787 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 : 1788 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 : 1789 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 : 1790 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 : 1791 - XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 : 1792 - XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 : 1793 - XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 : 1794 - XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 : 1795 - XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 : 1796 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 : 1797 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 : 1798 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 : 1799 - XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 : 1800 - XML_SCHEMAV_NOROOT = 1801 - XML_SCHEMAV_UNDECLAREDELEM = 1802 : 1802 - XML_SCHEMAV_NOTTOPLEVEL = 1803 : 1803 - XML_SCHEMAV_MISSING = 1804 : 1804 - XML_SCHEMAV_WRONGELEM = 1805 : 1805 - XML_SCHEMAV_NOTYPE = 1806 : 1806 - XML_SCHEMAV_NOROLLBACK = 1807 : 1807 - XML_SCHEMAV_ISABSTRACT = 1808 : 1808 - XML_SCHEMAV_NOTEMPTY = 1809 : 1809 - XML_SCHEMAV_ELEMCONT = 1810 : 1810 - XML_SCHEMAV_HAVEDEFAULT = 1811 : 1811 - XML_SCHEMAV_NOTNILLABLE = 1812 : 1812 - XML_SCHEMAV_EXTRACONTENT = 1813 : 1813 - XML_SCHEMAV_INVALIDATTR = 1814 : 1814 - XML_SCHEMAV_INVALIDELEM = 1815 : 1815 - XML_SCHEMAV_NOTDETERMINIST = 1816 : 1816 - XML_SCHEMAV_CONSTRUCT = 1817 : 1817 - XML_SCHEMAV_INTERNAL = 1818 : 1818 - XML_SCHEMAV_NOTSIMPLE = 1819 : 1819 - XML_SCHEMAV_ATTRUNKNOWN = 1820 : 1820 - XML_SCHEMAV_ATTRINVALID = 1821 : 1821 - XML_SCHEMAV_VALUE = 1822 : 1822 - XML_SCHEMAV_FACET = 1823 : 1823 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 : 1824 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 : 1825 - XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 : 1826 - XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 : 1827 - XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 : 1828 - XML_SCHEMAV_CVC_FACET_VALID = 1829 : 1829 - XML_SCHEMAV_CVC_LENGTH_VALID = 1830 : 1830 - XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 : 1831 - XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 : 1832 - XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 : 1833 - XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 : 1834 - XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 : 1835 - XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 : 1836 - XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 : 1837 - XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 : 1838 - XML_SCHEMAV_CVC_PATTERN_VALID = 1839 : 1839 - XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 : 1840 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 : 1841 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 : 1842 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 : 1843 - XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 : 1844 - XML_SCHEMAV_CVC_ELT_1 = 1845 : 1845 - XML_SCHEMAV_CVC_ELT_2 = 1846 : 1846 - XML_SCHEMAV_CVC_ELT_3_1 = 1847 : 1847 - XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 : 1848 - XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 : 1849 - XML_SCHEMAV_CVC_ELT_4_1 = 1850 : 1850 - XML_SCHEMAV_CVC_ELT_4_2 = 1851 : 1851 - XML_SCHEMAV_CVC_ELT_4_3 = 1852 : 1852 - XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 : 1853 - XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 : 1854 - XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 : 1855 - XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 : 1856 - XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 : 1857 - XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 : 1858 - XML_SCHEMAV_CVC_ELT_6 = 1859 : 1859 - XML_SCHEMAV_CVC_ELT_7 = 1860 : 1860 - XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 : 1861 - XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 : 1862 - XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 : 1863 - XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 : 1864 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 : 1865 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 : 1866 - XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 : 1867 - XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 : 1868 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 : 1869 - XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 : 1870 - XML_SCHEMAV_ELEMENT_CONTENT = 1871 : 1871 - XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 : 1872 - XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 : 1873 - XML_SCHEMAV_CVC_AU = 1874 : 1874 - XML_SCHEMAV_CVC_TYPE_1 = 1875 : 1875 - XML_SCHEMAV_CVC_TYPE_2 = 1876 : 1876 - XML_SCHEMAV_CVC_IDC = 1877 : 1877 - XML_SCHEMAV_CVC_WILDCARD = 1878 : 1878 - XML_XPTR_UNKNOWN_SCHEME = 1900 - XML_XPTR_CHILDSEQ_START = 1901 : 1901 - XML_XPTR_EVAL_FAILED = 1902 : 1902 - XML_XPTR_EXTRA_OBJECTS = 1903 : 1903 - XML_C14N_CREATE_CTXT = 1950 - XML_C14N_REQUIRES_UTF8 = 1951 : 1951 - XML_C14N_CREATE_STACK = 1952 : 1952 - XML_C14N_INVALID_NODE = 1953 : 1953 - XML_C14N_UNKNOW_NODE = 1954 : 1954 - XML_C14N_RELATIVE_NAMESPACE = 1955 : 1955 - XML_FTP_PASV_ANSWER = 2000 - XML_FTP_EPSV_ANSWER = 2001 : 2001 - XML_FTP_ACCNT = 2002 : 2002 - XML_FTP_URL_SYNTAX = 2003 : 2003 - XML_HTTP_URL_SYNTAX = 2020 - XML_HTTP_USE_IP = 2021 : 2021 - XML_HTTP_UNKNOWN_HOST = 2022 : 2022 - XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 - XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 : 3001 - XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 : 3002 - XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 : 3003 - XML_SCHEMAP_SRC_RESOLVE = 3004 : 3004 - XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 : 3005 - XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 : 3006 - XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 : 3007 - XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 : 3008 - XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 : 3009 - XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 : 3010 - XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 : 3011 - XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 : 3012 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 : 3013 - XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 : 3014 - XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 : 3015 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 : 3016 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 : 3017 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 : 3018 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 : 3019 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 : 3020 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 : 3021 - XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 : 3022 - XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 : 3023 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 : 3024 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 : 3025 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 : 3026 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 : 3027 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 : 3028 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 : 3029 - XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 : 3030 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 : 3031 - XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 : 3032 - XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 : 3033 - XML_SCHEMAP_S4S_ELEM_MISSING = 3034 : 3034 - XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 : 3035 - XML_SCHEMAP_S4S_ATTR_MISSING = 3036 : 3036 - XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 : 3037 - XML_SCHEMAP_SRC_ELEMENT_1 = 3038 : 3038 - XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 : 3039 - XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 : 3040 - XML_SCHEMAP_SRC_ELEMENT_3 = 3041 : 3041 - XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 : 3042 - XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 : 3043 - XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 : 3044 - XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 : 3045 - XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 : 3046 - XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 : 3047 - XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 : 3048 - XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 : 3049 - XML_SCHEMAP_SRC_INCLUDE = 3050 : 3050 - XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 : 3051 - XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 : 3052 - XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 : 3053 - XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 : 3054 - XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 : 3055 - XML_SCHEMAP_NO_XMLNS = 3056 : 3056 - XML_SCHEMAP_NO_XSI = 3057 : 3057 - XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 : 3058 - XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 : 3059 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 : 3060 - XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 : 3061 - XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 : 3062 - XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 : 3063 - XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 : 3064 - XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 : 3065 - XML_SCHEMAP_SRC_IMPORT_2 = 3066 : 3066 - XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 : 3067 - XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 : 3068 - XML_SCHEMAP_INTERNAL = 3069 : 3069 non-W3C - XML_SCHEMAP_NOT_DETERMINISTIC = 3070 : 3070 non-W3C - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 : 3071 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 : 3072 - XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 : 3073 - XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 : 3074 - XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 : 3075 - XML_SCHEMAP_SRC_CT_1 = 3076 : 3076 - XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 : 3077 - XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 : 3078 - XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 : 3079 - XML_SCHEMAP_C_PROPS_CORRECT = 3080 : 3080 - XML_SCHEMAP_SRC_REDEFINE = 3081 : 3081 - XML_SCHEMAP_SRC_IMPORT = 3082 : 3082 - XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 : 3083 - XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 : 3084 - XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 : 3085 - XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 : 3085 - XML_SCHEMAP_AG_PROPS_CORRECT = 3087 : 3086 - XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 : 3087 - XML_SCHEMAP_AU_PROPS_CORRECT = 3089 : 3088 - XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 : 3089 - XML_SCHEMAP_COS_ALL_LIMITED = 3091 : 3090 - XML_MODULE_OPEN = 4900 : 4900 - XML_MODULE_CLOSE = 4901 : 4901 - XML_CHECK_FOUND_ELEMENT = 5000 - XML_CHECK_FOUND_ATTRIBUTE = 5001 : 5001 - XML_CHECK_FOUND_TEXT = 5002 : 5002 - XML_CHECK_FOUND_CDATA = 5003 : 5003 - XML_CHECK_FOUND_ENTITYREF = 5004 : 5004 - XML_CHECK_FOUND_ENTITY = 5005 : 5005 - XML_CHECK_FOUND_PI = 5006 : 5006 - XML_CHECK_FOUND_COMMENT = 5007 : 5007 - XML_CHECK_FOUND_DOCTYPE = 5008 : 5008 - XML_CHECK_FOUND_FRAGMENT = 5009 : 5009 - XML_CHECK_FOUND_NOTATION = 5010 : 5010 - XML_CHECK_UNKNOWN_NODE = 5011 : 5011 - XML_CHECK_ENTITY_TYPE = 5012 : 5012 - XML_CHECK_NO_PARENT = 5013 : 5013 - XML_CHECK_NO_DOC = 5014 : 5014 - XML_CHECK_NO_NAME = 5015 : 5015 - XML_CHECK_NO_ELEM = 5016 : 5016 - XML_CHECK_WRONG_DOC = 5017 : 5017 - XML_CHECK_NO_PREV = 5018 : 5018 - XML_CHECK_WRONG_PREV = 5019 : 5019 - XML_CHECK_NO_NEXT = 5020 : 5020 - XML_CHECK_WRONG_NEXT = 5021 : 5021 - XML_CHECK_NOT_DTD = 5022 : 5022 - XML_CHECK_NOT_ATTR = 5023 : 5023 - XML_CHECK_NOT_ATTR_DECL = 5024 : 5024 - XML_CHECK_NOT_ELEM_DECL = 5025 : 5025 - XML_CHECK_NOT_ENTITY_DECL = 5026 : 5026 - XML_CHECK_NOT_NS_DECL = 5027 : 5027 - XML_CHECK_NO_HREF = 5028 : 5028 - XML_CHECK_WRONG_PARENT = 5029 : 5029 - XML_CHECK_NS_SCOPE = 5030 : 5030 - XML_CHECK_NS_ANCESTOR = 5031 : 5031 - XML_CHECK_NOT_UTF8 = 5032 : 5032 - XML_CHECK_NO_DICT = 5033 : 5033 - XML_CHECK_NOT_NCNAME = 5034 : 5034 - XML_CHECK_OUTSIDE_DICT = 5035 : 5035 - XML_CHECK_WRONG_NAME = 5036 : 5036 - XML_CHECK_NAME_NOT_NULL = 5037 : 5037 - XML_I18N_NO_NAME = 6000 - XML_I18N_NO_HANDLER = 6001 : 6001 - XML_I18N_EXCESS_HANDLER = 6002 : 6002 - XML_I18N_CONV_FAILED = 6003 : 6003 - XML_I18N_NO_OUTPUT = 6004 : 6004 - XML_CHECK_ = 6005 : 5033 - XML_CHECK_X = 6006 : 503 +__ERROR_TYPES = """\ +XML_ERR_OK = 0 +XML_ERR_INTERNAL_ERROR = 1 # 1 +XML_ERR_NO_MEMORY = 2 # 2 +XML_ERR_DOCUMENT_START = 3 # 3 +XML_ERR_DOCUMENT_EMPTY = 4 # 4 +XML_ERR_DOCUMENT_END = 5 # 5 +XML_ERR_INVALID_HEX_CHARREF = 6 # 6 +XML_ERR_INVALID_DEC_CHARREF = 7 # 7 +XML_ERR_INVALID_CHARREF = 8 # 8 +XML_ERR_INVALID_CHAR = 9 # 9 +XML_ERR_CHARREF_AT_EOF = 10 # 10 +XML_ERR_CHARREF_IN_PROLOG = 11 # 11 +XML_ERR_CHARREF_IN_EPILOG = 12 # 12 +XML_ERR_CHARREF_IN_DTD = 13 # 13 +XML_ERR_ENTITYREF_AT_EOF = 14 # 14 +XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 +XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 +XML_ERR_ENTITYREF_IN_DTD = 17 # 17 +XML_ERR_PEREF_AT_EOF = 18 # 18 +XML_ERR_PEREF_IN_PROLOG = 19 # 19 +XML_ERR_PEREF_IN_EPILOG = 20 # 20 +XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 +XML_ERR_ENTITYREF_NO_NAME = 22 # 22 +XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 +XML_ERR_PEREF_NO_NAME = 24 # 24 +XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 +XML_ERR_UNDECLARED_ENTITY = 26 # 26 +XML_WAR_UNDECLARED_ENTITY = 27 # 27 +XML_ERR_UNPARSED_ENTITY = 28 # 28 +XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 +""" + \ +"""\ +XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 +XML_ERR_UNKNOWN_ENCODING = 31 # 31 +XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 +XML_ERR_STRING_NOT_STARTED = 33 # 33 +XML_ERR_STRING_NOT_CLOSED = 34 # 34 +XML_ERR_NS_DECL_ERROR = 35 # 35 +XML_ERR_ENTITY_NOT_STARTED = 36 # 36 +XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 +XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 +XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 +XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 +XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 +XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 +XML_ERR_LITERAL_NOT_STARTED = 43 # 43 +XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 +XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 +XML_ERR_PI_NOT_STARTED = 46 # 46 +XML_ERR_PI_NOT_FINISHED = 47 # 47 +XML_ERR_NOTATION_NOT_STARTED = 48 # 48 +XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 +XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 +XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 +XML_ERR_MIXED_NOT_STARTED = 52 # 52 +XML_ERR_MIXED_NOT_FINISHED = 53 # 53 +XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 +XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 +XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 +XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 +XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 +XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 +""" + \ +"""\ +XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 +XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 +XML_ERR_MISPLACED_CDATA_END = 62 # 62 +XML_ERR_CDATA_NOT_FINISHED = 63 # 63 +XML_ERR_RESERVED_XML_NAME = 64 # 64 +XML_ERR_SPACE_REQUIRED = 65 # 65 +XML_ERR_SEPARATOR_REQUIRED = 66 # 66 +XML_ERR_NMTOKEN_REQUIRED = 67 # 67 +XML_ERR_NAME_REQUIRED = 68 # 68 +XML_ERR_PCDATA_REQUIRED = 69 # 69 +XML_ERR_URI_REQUIRED = 70 # 70 +XML_ERR_PUBID_REQUIRED = 71 # 71 +XML_ERR_LT_REQUIRED = 72 # 72 +XML_ERR_GT_REQUIRED = 73 # 73 +XML_ERR_LTSLASH_REQUIRED = 74 # 74 +XML_ERR_EQUAL_REQUIRED = 75 # 75 +XML_ERR_TAG_NAME_MISMATCH = 76 # 76 +XML_ERR_TAG_NOT_FINISHED = 77 # 77 +XML_ERR_STANDALONE_VALUE = 78 # 78 +XML_ERR_ENCODING_NAME = 79 # 79 +XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 +XML_ERR_INVALID_ENCODING = 81 # 81 +XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 +XML_ERR_CONDSEC_INVALID = 83 # 83 +XML_ERR_VALUE_REQUIRED = 84 # 84 +XML_ERR_NOT_WELL_BALANCED = 85 # 85 +XML_ERR_EXTRA_CONTENT = 86 # 86 +XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 +XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 +XML_ERR_ENTITY_LOOP = 89 # 89 +""" + \ +"""\ +XML_ERR_ENTITY_BOUNDARY = 90 # 90 +XML_ERR_INVALID_URI = 91 # 91 +XML_ERR_URI_FRAGMENT = 92 # 92 +XML_WAR_CATALOG_PI = 93 # 93 +XML_ERR_NO_DTD = 94 # 94 +XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 +XML_ERR_VERSION_MISSING = 96 # 96 +XML_WAR_UNKNOWN_VERSION = 97 # 97 +XML_WAR_LANG_VALUE = 98 # 98 +XML_WAR_NS_URI = 99 # 99 +XML_WAR_NS_URI_RELATIVE = 100 # 100 +XML_ERR_MISSING_ENCODING = 101 # 101 +XML_WAR_SPACE_VALUE = 102 # 102 +XML_ERR_NOT_STANDALONE = 103 # 103 +XML_ERR_ENTITY_PROCESSING = 104 # 104 +XML_ERR_NOTATION_PROCESSING = 105 # 105 +XML_WAR_NS_COLUMN = 106 # 106 +XML_WAR_ENTITY_REDEFINED = 107 # 107 +XML_NS_ERR_XML_NAMESPACE = 200 +XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 +XML_NS_ERR_QNAME = 202 # 202 +XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 +XML_NS_ERR_EMPTY = 204 # 204 +XML_DTD_ATTRIBUTE_DEFAULT = 500 +XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 +XML_DTD_ATTRIBUTE_VALUE = 502 # 502 +XML_DTD_CONTENT_ERROR = 503 # 503 +XML_DTD_CONTENT_MODEL = 504 # 504 +XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 +XML_DTD_DIFFERENT_PREFIX = 506 # 506 +""" + \ +"""\ +XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 +XML_DTD_ELEM_NAMESPACE = 508 # 508 +XML_DTD_ELEM_REDEFINED = 509 # 509 +XML_DTD_EMPTY_NOTATION = 510 # 510 +XML_DTD_ENTITY_TYPE = 511 # 511 +XML_DTD_ID_FIXED = 512 # 512 +XML_DTD_ID_REDEFINED = 513 # 513 +XML_DTD_ID_SUBSET = 514 # 514 +XML_DTD_INVALID_CHILD = 515 # 515 +XML_DTD_INVALID_DEFAULT = 516 # 516 +XML_DTD_LOAD_ERROR = 517 # 517 +XML_DTD_MISSING_ATTRIBUTE = 518 # 518 +XML_DTD_MIXED_CORRUPT = 519 # 519 +XML_DTD_MULTIPLE_ID = 520 # 520 +XML_DTD_NO_DOC = 521 # 521 +XML_DTD_NO_DTD = 522 # 522 +XML_DTD_NO_ELEM_NAME = 523 # 523 +XML_DTD_NO_PREFIX = 524 # 524 +XML_DTD_NO_ROOT = 525 # 525 +XML_DTD_NOTATION_REDEFINED = 526 # 526 +XML_DTD_NOTATION_VALUE = 527 # 527 +XML_DTD_NOT_EMPTY = 528 # 528 +XML_DTD_NOT_PCDATA = 529 # 529 +XML_DTD_NOT_STANDALONE = 530 # 530 +XML_DTD_ROOT_NAME = 531 # 531 +XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 +XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 +XML_DTD_UNKNOWN_ELEM = 534 # 534 +XML_DTD_UNKNOWN_ENTITY = 535 # 535 +""" + \ +"""\ +XML_DTD_UNKNOWN_ID = 536 # 536 +XML_DTD_UNKNOWN_NOTATION = 537 # 537 +XML_DTD_STANDALONE_DEFAULTED = 538 # 538 +XML_DTD_XMLID_VALUE = 539 # 539 +XML_DTD_XMLID_TYPE = 540 # 540 +XML_HTML_STRUCURE_ERROR = 800 +XML_HTML_UNKNOWN_TAG = 801 # 801 +XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 +XML_RNGP_ATTR_CONFLICT = 1001 # 1001 +XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 +XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 +XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 +XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 +XML_RNGP_CHOICE_CONTENT = 1006 # 1006 +XML_RNGP_CHOICE_EMPTY = 1007 # 1007 +XML_RNGP_CREATE_FAILURE = 1008 # 1008 +XML_RNGP_DATA_CONTENT = 1009 # 1009 +XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 +XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 +XML_RNGP_DEFINE_EMPTY = 1012 # 1012 +XML_RNGP_DEFINE_MISSING = 1013 # 1013 +XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 +XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 +XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 +XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 +XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 +XML_RNGP_ELEMENT_NAME = 1019 # 1019 +XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 +XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 +""" + \ +"""\ +XML_RNGP_EMPTY = 1022 # 1022 +XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 +XML_RNGP_EMPTY_CONTENT = 1024 # 1024 +XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 +XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 +XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 +XML_RNGP_EXCEPT_MISSING = 1028 # 1028 +XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 +XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 +XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 +XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 +XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 +XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 +XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 +XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 +XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 +XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 +XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 +XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 +XML_RNGP_HREF_ERROR = 1041 # 1041 +XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 +XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 +XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 +XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 +XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 +XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 +XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 +XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 +XML_RNGP_INVALID_URI = 1050 # 1050 +""" + \ +"""\ +XML_RNGP_INVALID_VALUE = 1051 # 1051 +XML_RNGP_MISSING_HREF = 1052 # 1052 +XML_RNGP_NAME_MISSING = 1053 # 1053 +XML_RNGP_NEED_COMBINE = 1054 # 1054 +XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 +XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 +XML_RNGP_NSNAME_NO_NS = 1057 # 1057 +XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 +XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 +XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 +XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 +XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 +XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 +XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 +XML_RNGP_PARSE_ERROR = 1065 # 1065 +XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 +XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 +XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 +XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 +XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 +XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 +XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 +XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 +XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 +XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 +XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 +XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 +XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 +XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 +""" + \ +"""\ +XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 +XML_RNGP_PAT_LIST_LIST = 1081 # 1081 +XML_RNGP_PAT_LIST_REF = 1082 # 1082 +XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 +XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 +XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 +XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 +XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 +XML_RNGP_PAT_START_ATTR = 1088 # 1088 +XML_RNGP_PAT_START_DATA = 1089 # 1089 +XML_RNGP_PAT_START_EMPTY = 1090 # 1090 +XML_RNGP_PAT_START_GROUP = 1091 # 1091 +XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 +XML_RNGP_PAT_START_LIST = 1093 # 1093 +XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 +XML_RNGP_PAT_START_TEXT = 1095 # 1095 +XML_RNGP_PAT_START_VALUE = 1096 # 1096 +XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 +XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 +XML_RNGP_REF_CYCLE = 1099 # 1099 +XML_RNGP_REF_NAME_INVALID = 1100 # 1100 +XML_RNGP_REF_NO_DEF = 1101 # 1101 +XML_RNGP_REF_NO_NAME = 1102 # 1102 +XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 +XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 +XML_RNGP_START_CONTENT = 1105 # 1105 +XML_RNGP_START_EMPTY = 1106 # 1106 +XML_RNGP_START_MISSING = 1107 # 1107 +XML_RNGP_TEXT_EXPECTED = 1108 # 1108 +""" + \ +"""\ +XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 +XML_RNGP_TYPE_MISSING = 1110 # 1110 +XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 +XML_RNGP_TYPE_VALUE = 1112 # 1112 +XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 +XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 +XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 +XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 +XML_RNGP_URI_FRAGMENT = 1117 # 1117 +XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 +XML_RNGP_VALUE_EMPTY = 1119 # 1119 +XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 +XML_RNGP_XMLNS_NAME = 1121 # 1121 +XML_RNGP_XML_NS = 1122 # 1122 +XML_XPATH_EXPRESSION_OK = 1200 +XML_XPATH_NUMBER_ERROR = 1201 # 1201 +XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 +XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 +XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 +XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 +XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 +XML_XPATH_EXPR_ERROR = 1207 # 1207 +XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 +XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 +XML_XPATH_INVALID_OPERAND = 1210 # 1210 +XML_XPATH_INVALID_TYPE = 1211 # 1211 +XML_XPATH_INVALID_ARITY = 1212 # 1212 +XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 +XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 +""" + \ +"""\ +XML_XPATH_MEMORY_ERROR = 1215 # 1215 +XML_XPTR_SYNTAX_ERROR = 1216 # 1216 +XML_XPTR_RESOURCE_ERROR = 1217 # 1217 +XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 +XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 +XML_XPATH_ENCODING_ERROR = 1220 # 1220 +XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 +XML_TREE_INVALID_HEX = 1300 +XML_TREE_INVALID_DEC = 1301 # 1301 +XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 +XML_SAVE_NOT_UTF8 = 1400 +XML_SAVE_CHAR_INVALID = 1401 # 1401 +XML_SAVE_NO_DOCTYPE = 1402 # 1402 +XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 +XML_REGEXP_COMPILE_ERROR = 1450 +XML_IO_UNKNOWN = 1500 +XML_IO_EACCES = 1501 # 1501 +XML_IO_EAGAIN = 1502 # 1502 +XML_IO_EBADF = 1503 # 1503 +XML_IO_EBADMSG = 1504 # 1504 +XML_IO_EBUSY = 1505 # 1505 +XML_IO_ECANCELED = 1506 # 1506 +XML_IO_ECHILD = 1507 # 1507 +XML_IO_EDEADLK = 1508 # 1508 +XML_IO_EDOM = 1509 # 1509 +XML_IO_EEXIST = 1510 # 1510 +XML_IO_EFAULT = 1511 # 1511 +XML_IO_EFBIG = 1512 # 1512 +XML_IO_EINPROGRESS = 1513 # 1513 +""" + \ +"""\ +XML_IO_EINTR = 1514 # 1514 +XML_IO_EINVAL = 1515 # 1515 +XML_IO_EIO = 1516 # 1516 +XML_IO_EISDIR = 1517 # 1517 +XML_IO_EMFILE = 1518 # 1518 +XML_IO_EMLINK = 1519 # 1519 +XML_IO_EMSGSIZE = 1520 # 1520 +XML_IO_ENAMETOOLONG = 1521 # 1521 +XML_IO_ENFILE = 1522 # 1522 +XML_IO_ENODEV = 1523 # 1523 +XML_IO_ENOENT = 1524 # 1524 +XML_IO_ENOEXEC = 1525 # 1525 +XML_IO_ENOLCK = 1526 # 1526 +XML_IO_ENOMEM = 1527 # 1527 +XML_IO_ENOSPC = 1528 # 1528 +XML_IO_ENOSYS = 1529 # 1529 +XML_IO_ENOTDIR = 1530 # 1530 +XML_IO_ENOTEMPTY = 1531 # 1531 +XML_IO_ENOTSUP = 1532 # 1532 +XML_IO_ENOTTY = 1533 # 1533 +XML_IO_ENXIO = 1534 # 1534 +XML_IO_EPERM = 1535 # 1535 +XML_IO_EPIPE = 1536 # 1536 +XML_IO_ERANGE = 1537 # 1537 +XML_IO_EROFS = 1538 # 1538 +XML_IO_ESPIPE = 1539 # 1539 +XML_IO_ESRCH = 1540 # 1540 +XML_IO_ETIMEDOUT = 1541 # 1541 +XML_IO_EXDEV = 1542 # 1542 +""" + \ +"""\ +XML_IO_NETWORK_ATTEMPT = 1543 # 1543 +XML_IO_ENCODER = 1544 # 1544 +XML_IO_FLUSH = 1545 # 1545 +XML_IO_WRITE = 1546 # 1546 +XML_IO_NO_INPUT = 1547 # 1547 +XML_IO_BUFFER_FULL = 1548 # 1548 +XML_IO_LOAD_ERROR = 1549 # 1549 +XML_IO_ENOTSOCK = 1550 # 1550 +XML_IO_EISCONN = 1551 # 1551 +XML_IO_ECONNREFUSED = 1552 # 1552 +XML_IO_ENETUNREACH = 1553 # 1553 +XML_IO_EADDRINUSE = 1554 # 1554 +XML_IO_EALREADY = 1555 # 1555 +XML_IO_EAFNOSUPPORT = 1556 # 1556 +XML_XINCLUDE_RECURSION = 1600 +XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 +XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 +XML_XINCLUDE_NO_HREF = 1603 # 1603 +XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 +XML_XINCLUDE_HREF_URI = 1605 # 1605 +XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 +XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 +XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 +XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 +XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 +XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 +XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 +XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 +XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 +""" + \ +"""\ +XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 +XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 +XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 +XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 +XML_CATALOG_MISSING_ATTR = 1650 +XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 +XML_CATALOG_PREFER_VALUE = 1652 # 1652 +XML_CATALOG_NOT_CATALOG = 1653 # 1653 +XML_CATALOG_RECURSION = 1654 # 1654 +XML_SCHEMAP_PREFIX_UNDEFINED = 1700 +XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 +XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 +XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 +XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 +XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 +XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 +XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 +XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 +XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 +XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 +XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 +XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 +XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 +XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 +XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 +XML_SCHEMAP_INVALID_FACET = 1716 # 1716 +XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 +XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 +XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 +""" + \ +"""\ +XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 +XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 +XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 +XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 +XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 +XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 +XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 +XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 +XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 +XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 +XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 +XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 +XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 +XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 +XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 +XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 +XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 +XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 +XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 +XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 +XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 +XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 +XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 +XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 +XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 +XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 +XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 +XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 +XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 +""" + \ +"""\ +XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 +XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 +XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 +XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 +XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 +XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 +XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 +XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 +XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 +XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 +XML_SCHEMAP_NOROOT = 1759 # 1759 +XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 +XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 +XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 +XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 +XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 +XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 +XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 +XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 +XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 +XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 +XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 +XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 +XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 +XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 +XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 +XML_SCHEMAP_RECURSIVE = 1775 # 1775 +XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 +XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 +""" + \ +"""\ +XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 +XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 +XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 +XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 +XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 +XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 +XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 +XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 +XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 +XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 +XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 +XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 +XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 +XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 +XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 +XML_SCHEMAV_NOROOT = 1801 +XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 +XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 +XML_SCHEMAV_MISSING = 1804 # 1804 +XML_SCHEMAV_WRONGELEM = 1805 # 1805 +XML_SCHEMAV_NOTYPE = 1806 # 1806 +""" + \ +"""\ +XML_SCHEMAV_NOROLLBACK = 1807 # 1807 +XML_SCHEMAV_ISABSTRACT = 1808 # 1808 +XML_SCHEMAV_NOTEMPTY = 1809 # 1809 +XML_SCHEMAV_ELEMCONT = 1810 # 1810 +XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 +XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 +XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 +XML_SCHEMAV_INVALIDATTR = 1814 # 1814 +XML_SCHEMAV_INVALIDELEM = 1815 # 1815 +XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 +XML_SCHEMAV_CONSTRUCT = 1817 # 1817 +XML_SCHEMAV_INTERNAL = 1818 # 1818 +XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 +XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 +XML_SCHEMAV_ATTRINVALID = 1821 # 1821 +XML_SCHEMAV_VALUE = 1822 # 1822 +XML_SCHEMAV_FACET = 1823 # 1823 +XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 +XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 +XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 +XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 +XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 +XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 +XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 +XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 +XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 +XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 +XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 +XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 +""" + \ +"""\ +XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 +XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 +XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 +XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 +XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 +XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 +XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 +XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 +XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 +XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 +XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 +XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 +XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 +XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 +XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 +XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 +XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 +XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 +XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 +XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 +XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 +XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 +XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 +XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 +XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 +XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 +""" + \ +"""\ +XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 +XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 +XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 +XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 +XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 +XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 +XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 +XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 +XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 +XML_SCHEMAV_CVC_AU = 1874 # 1874 +XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 +XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 +XML_SCHEMAV_CVC_IDC = 1877 # 1877 +XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 +XML_XPTR_UNKNOWN_SCHEME = 1900 +XML_XPTR_CHILDSEQ_START = 1901 # 1901 +XML_XPTR_EVAL_FAILED = 1902 # 1902 +XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 +XML_C14N_CREATE_CTXT = 1950 +XML_C14N_REQUIRES_UTF8 = 1951 # 1951 +XML_C14N_CREATE_STACK = 1952 # 1952 +XML_C14N_INVALID_NODE = 1953 # 1953 +XML_C14N_UNKNOW_NODE = 1954 # 1954 +XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 +XML_FTP_PASV_ANSWER = 2000 +XML_FTP_EPSV_ANSWER = 2001 # 2001 +XML_FTP_ACCNT = 2002 # 2002 +XML_FTP_URL_SYNTAX = 2003 # 2003 +XML_HTTP_URL_SYNTAX = 2020 +""" + \ +"""\ +XML_HTTP_USE_IP = 2021 # 2021 +XML_HTTP_UNKNOWN_HOST = 2022 # 2022 +XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 +XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 +XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 +XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 +XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 +XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 +XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 +XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 +XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 +XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 +XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 +XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 +XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 +XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 +XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 +XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 +XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 +XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 +""" + \ +"""\ +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 +XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 +XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 +XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 +XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 +XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 +XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 +XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 +XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 +XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 +XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 +XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 +XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 +XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 +XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 +XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 +XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 +XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 +XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 +XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 +XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 +XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 +XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 +XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 +XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 +XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 +XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 +""" + \ +"""\ +XML_SCHEMAP_NO_XMLNS = 3056 # 3056 +XML_SCHEMAP_NO_XSI = 3057 # 3057 +XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 +XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 +XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 +XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 +XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 +XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 +XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 +XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 +XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 +XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 +XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 +XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C +XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C +XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 +XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 +XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 +XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 +XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 +XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 +XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 +XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 +XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 +XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 +XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 +XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 +XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 +XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 +""" + \ +"""\ +XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 +XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 +XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 +XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 +XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 +XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 +XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 +XML_MODULE_OPEN = 4900 # 4900 +XML_MODULE_CLOSE = 4901 # 4901 +XML_CHECK_FOUND_ELEMENT = 5000 +XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 +XML_CHECK_FOUND_TEXT = 5002 # 5002 +XML_CHECK_FOUND_CDATA = 5003 # 5003 +XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 +XML_CHECK_FOUND_ENTITY = 5005 # 5005 +XML_CHECK_FOUND_PI = 5006 # 5006 +XML_CHECK_FOUND_COMMENT = 5007 # 5007 +XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 +XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 +XML_CHECK_FOUND_NOTATION = 5010 # 5010 +XML_CHECK_UNKNOWN_NODE = 5011 # 5011 +XML_CHECK_ENTITY_TYPE = 5012 # 5012 +XML_CHECK_NO_PARENT = 5013 # 5013 +XML_CHECK_NO_DOC = 5014 # 5014 +XML_CHECK_NO_NAME = 5015 # 5015 +XML_CHECK_NO_ELEM = 5016 # 5016 +XML_CHECK_WRONG_DOC = 5017 # 5017 +XML_CHECK_NO_PREV = 5018 # 5018 +XML_CHECK_WRONG_PREV = 5019 # 5019 +""" + \ +"""\ +XML_CHECK_NO_NEXT = 5020 # 5020 +XML_CHECK_WRONG_NEXT = 5021 # 5021 +XML_CHECK_NOT_DTD = 5022 # 5022 +XML_CHECK_NOT_ATTR = 5023 # 5023 +XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 +XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 +XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 +XML_CHECK_NOT_NS_DECL = 5027 # 5027 +XML_CHECK_NO_HREF = 5028 # 5028 +XML_CHECK_WRONG_PARENT = 5029 # 5029 +XML_CHECK_NS_SCOPE = 5030 # 5030 +XML_CHECK_NS_ANCESTOR = 5031 # 5031 +XML_CHECK_NOT_UTF8 = 5032 # 5032 +XML_CHECK_NO_DICT = 5033 # 5033 +XML_CHECK_NOT_NCNAME = 5034 # 5034 +XML_CHECK_OUTSIDE_DICT = 5035 # 5035 +XML_CHECK_WRONG_NAME = 5036 # 5036 +XML_CHECK_NAME_NOT_NULL = 5037 # 5037 +XML_I18N_NO_NAME = 6000 +XML_I18N_NO_HANDLER = 6001 # 6001 +XML_I18N_EXCESS_HANDLER = 6002 # 6002 +XML_I18N_CONV_FAILED = 6003 # 6003 +XML_I18N_NO_OUTPUT = 6004 # 6004 +XML_CHECK_ = 6005 # 5033 +XML_CHECK_X = 6006 # 503 """ +# --- END: GENERATED CONSTANTS --- __initErrorConstants() From scoder at codespeak.net Sun Jun 4 17:28:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 17:28:41 +0200 (CEST) Subject: [Lxml-checkins] r28278 - in lxml/branch/lxml-1.0: . doc src/lxml src/lxml/tests Message-ID: <20060604152841.55F6310076@code0.codespeak.net> Author: scoder Date: Sun Jun 4 17:28:35 2006 New Revision: 28278 Added: lxml/branch/lxml-1.0/doc/mkhtml.py - copied unchanged from r28242, lxml/trunk/doc/mkhtml.py Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/MANIFEST.in lxml/branch/lxml-1.0/Makefile lxml/branch/lxml-1.0/bench.py lxml/branch/lxml-1.0/doc/FAQ.txt lxml/branch/lxml-1.0/doc/api.txt lxml/branch/lxml-1.0/doc/performance.txt lxml/branch/lxml-1.0/doc/sax.txt lxml/branch/lxml-1.0/src/lxml/etree.h lxml/branch/lxml-1.0/src/lxml/etree.pyx lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/python.pxd lxml/branch/lxml-1.0/src/lxml/sax.py lxml/branch/lxml-1.0/src/lxml/serializer.pxi lxml/branch/lxml-1.0/src/lxml/tests/test_sax.py lxml/branch/lxml-1.0/src/lxml/tests/test_xslt.py lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi lxml/branch/lxml-1.0/src/lxml/xpath.pxi lxml/branch/lxml-1.0/src/lxml/xslt.pxi lxml/branch/lxml-1.0/update-error-constants.py lxml/branch/lxml-1.0/version.txt Log: merged in remaining fixes from trunk: xsl:include, lxml.sax, update-error-constants.py Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Sun Jun 4 17:28:35 2006 @@ -1,14 +1,30 @@ lxml changelog ============== +current +======= + +Features added +-------------- + +Bugs fixed +---------- + +* xsl:include failed when the stylesheet was parsed from a file-like object + +* lxml.sax.ElementTreeProducer did not call startDocument() / endDocument() + +* MSVC compiler complained about long strings (supports only 2048 bytes) + + 1.0 (2006-06-01) ================ Features added -------------- -See also the features added for lxml 1.0beta (below) to find out more about -what's new. +See also the features added for lxml 1.0beta to find out more about what's +new. * Element.getiterator() and the findall() methods support finding arbitrary elements from a namespace (pattern ``{namespace}*``) @@ -21,7 +37,7 @@ * PyErrorLog for error logging through the Python ``logging`` module -* ``element.getroottree()`` returns an ElementTree for the root node of the +* ``Element.getroottree()`` returns an ElementTree for the root node of the document that contains the element. * ElementTree.getpath(element) returns a simple, absolute XPath expression to Modified: lxml/branch/lxml-1.0/MANIFEST.in ============================================================================== --- lxml/branch/lxml-1.0/MANIFEST.in (original) +++ lxml/branch/lxml-1.0/MANIFEST.in Sun Jun 4 17:28:35 2006 @@ -5,5 +5,5 @@ include CHANGES.txt CREDITS.txt INSTALL.txt LICENSES.txt README.txt TODO.txt recursive-include src *.pyx *.pxd *.pxi *.py etree.c etree.h recursive-include src/lxml/tests *.rng *.xslt *.xml -recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc +recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc mkhtml.py exclude doc/pyrex.txt Modified: lxml/branch/lxml-1.0/Makefile ============================================================================== --- lxml/branch/lxml-1.0/Makefile (original) +++ lxml/branch/lxml-1.0/Makefile Sun Jun 4 17:28:35 2006 @@ -27,6 +27,10 @@ ftest_inplace: inplace $(PYTHON) test.py -f $(TESTFLAGS) $(TESTOPTS) +html: + mkdir -p doc/html + $(PYTHON) doc/mkhtml.py doc/html . `cat version.txt` + # XXX What should the default be? test: test_inplace Modified: lxml/branch/lxml-1.0/bench.py ============================================================================== --- lxml/branch/lxml-1.0/bench.py (original) +++ lxml/branch/lxml-1.0/bench.py Sun Jun 4 17:28:35 2006 @@ -387,6 +387,9 @@ for child in root: child.get('a') + def bench_root_getchildren(self, root): + root.getchildren() + def bench_getchildren(self, root): for child in root: child.getchildren() Modified: lxml/branch/lxml-1.0/doc/FAQ.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/FAQ.txt (original) +++ lxml/branch/lxml-1.0/doc/FAQ.txt Sun Jun 4 17:28:35 2006 @@ -31,17 +31,10 @@ #) My application crashes! Why does lxml.etree do that? - a) If you are using threads, make sure that you are not sharing non - thread-safe objects between threads. Especially the default parser, - XSLT() and the validators are not thread-safe for performance reasons. - You have to create a new one for each thread, use a thread-safe object - pool or assure thread-safe access to them yourself. - - b) One of the goals of lxml is "no segfaults", so if there is no clear - warning in the documentation that you were doing something potentially - harmful, you have found a bug and we would like to hear about it. - Please report this bug to the mailing list. See the next section on how - to do that. + One of the goals of lxml is "no segfaults", so if there is no clear warning + in the documentation that you were doing something potentially harmful, you + have found a bug and we would like to hear about it. Please report this + bug to the mailing list. See the next section on how to do that. #) I think I have found a bug in lxml. What should I do? @@ -92,6 +85,22 @@ lxml can add fresh whitespace to the XML tree to indent it. +#) How can I find out which namespace prefixes are used in a document? + + You can traverse the document (``getiterator()``) and collect the prefix + attributes from all Elements into a set. However, it is unlikely that you + really want to do that. You do not need these prefixes, honestly. You + only need the namespace URIs. All namespace comparisons use these, so feel + free to make up your own prefixes when you use XPath expressions or + extension functions. + + The only place where you might consider specifying prefixes is the + serialization of Elements that were created through the API. Here, you can + specify a prefix mapping through the ``nsmap`` argument when creating the + root Element. Its children will then inherit this prefix for + serialization. + + #) What are the ``findall()`` and ``xpath()`` methods on Element(Tree)? ``findall()`` is part of the original `ElementTree API`_. It supports a Modified: lxml/branch/lxml-1.0/doc/api.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/api.txt (original) +++ lxml/branch/lxml-1.0/doc/api.txt Sun Jun 4 17:28:35 2006 @@ -5,6 +5,21 @@ lxml tries to follow established APIs wherever possible. Sometimes, however, the need to expose a feature in an easy way led to the invention of a new API. +.. contents:: +.. + 1 lxml.etree + 2 Trees and Documents + 3 Parsers + 4 Error handling on exceptions + 5 Python unicode strings + 6 XPath + 7 XSLT + 8 RelaxNG + 9 XMLSchema + 10 xinclude + 11 write_c14n on ElementTree + + lxml.etree ---------- @@ -197,14 +212,22 @@ Note that using ``tostring()`` with UTF-8 is also typically faster. -xpath method on ElementTree, Element ------------------------------------- +XPath +----- lxml.etree supports the simple path syntax of the ``findall()`` etc. methods on ElementTree and Element, as known from the original ElementTree library. As an extension, these classes also provide an ``xpath()`` method that supports expressions in the complete XPath syntax. +There are also specialized XPath evaluator classes that are more efficient for +frequent evaluation: ``XPath`` and ``XPathEvaluator``. See the `performance +comparison`_ to learn when to use which. Their semantics when used on +Elements and ElementTrees are the same as for the ``xpath()`` method described +here. + +.. _`performance comparison`: performance.html#xpath + For ElementTree, the xpath method performs a global XPath query against the document (if absolute) or against the root node (if relative):: @@ -264,7 +287,8 @@ .. _`extension functions`: extensions.html -The return values of xpath vary, depending on the XPath expression used: +The return values of XPath evaluations vary, depending on the XPath expression +used: * True or False, when the XPath expression has a boolean result @@ -272,12 +296,11 @@ * a (unicode) string, when the XPath expression has a string result. -* a list of items, when the XPath expression has a list as result. The - items may include element nodes, strings. When the nodeset would - contain text nodes or attributes, the node result is also a string - (the text node content or attribute value). When the nodeset would - contain a comment, the result contains a string as well, inside - ```` markers. +* a list of items, when the XPath expression has a list as result. The items + may include elements and strings. Text nodes and attributes in the result + are returned as strings (the text node content or attribute value). Comments + are also returned as strings, enclosed by the usual ```` + markers. A related convenience method of ElementTree objects is ``getpath(element)``, which returns a structural, absolute XPath expression to find that element:: Modified: lxml/branch/lxml-1.0/doc/performance.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/performance.txt (original) +++ lxml/branch/lxml-1.0/doc/performance.txt Sun Jun 4 17:28:35 2006 @@ -117,6 +117,14 @@ are no longer referenced. ET and cET represent the tree itself through these objects, which reduces the overhead in creating them. +The same reason makes operations like ``getchildren()`` more costly in lxml. +Where ET and cET can quickly create a shallow copy of their list of children, +lxml has to create a Python object for each child and collect them in a list:: + + lxe: root_getchildren (-- T2 ) 6.3981 msec/pass + cET: root_getchildren (-- T2 ) 0.0651 msec/pass + ET : root_getchildren (-- T2 ) 0.0224 msec/pass + As opposed to ET, libxml2 has a notion of documents that each element must be in. This results in a major performance difference for creating independent Elements that end up in independently created documents:: Modified: lxml/branch/lxml-1.0/doc/sax.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/sax.txt (original) +++ lxml/branch/lxml-1.0/doc/sax.txt Sun Jun 4 17:28:35 2006 @@ -7,15 +7,47 @@ compatible with that in the Python core (xml.sax), so is useful for interfacing lxml with code that uses the Python core SAX facilities. +.. contents:: +.. + 1 Building a tree from SAX events + 2 Producing SAX events from an ElementTree or Element + 3 Interfacing with pulldom/minidom + + +Building a tree from SAX events +------------------------------- + +First of all, lxml has support for building a new tree given SAX events. To +do this, we use the special SAX content handler defined by lxml named +``lxml.sax.ElementTreeContentHandler``:: + + >>> import lxml.sax + >>> handler = lxml.sax.ElementTreeContentHandler() + +Now let's fire some SAX events at it:: + + >>> handler.startElementNS((None, 'a'), 'a', {}) + >>> handler.startElementNS((None, 'b'), 'b', {(None, 'foo'): 'bar'}) + >>> handler.characters('Hello world') + >>> handler.endElementNS((None, 'b'), 'b') + >>> handler.endElementNS((None, 'a'), 'a') + +This constructs an equivalent tree. You can access it through the ``etree`` +property of the handler:: + + >>> tree = handler.etree + >>> lxml.etree.tostring(tree.getroot()) + 'Hello world' + + Producing SAX events from an ElementTree or Element --------------------------------------------------- Let's make a tree we can generate SAX events for:: >>> from StringIO import StringIO - >>> import lxml >>> f = StringIO('Text') - >>> doc = lxml.etree.parse(f) + >>> tree = lxml.etree.parse(f) To see whether the correct SAX events are produced, we'll write a custom content handler:: @@ -41,7 +73,7 @@ handler:: >>> handler = MyContentHandler() - >>> lxml.sax.saxify(doc, handler) + >>> lxml.sax.saxify(tree, handler) This is what we expect:: @@ -52,32 +84,22 @@ >>> handler.text 'Text' -Building a tree from SAX events -------------------------------- - -lxml also has support for building a new tree given SAX events. To do -this, we use the special SAX content handler defined by lxml named -`ElementTreeContentHandler`. - -Let's make this content handler:: - - >>> handler = lxml.sax.ElementTreeContentHandler() - -Now let's fire some SAX events at it:: - - >>> handler.startElementNS((None, 'a'), 'a', {}) - >>> handler.startElementNS((None, 'b'), 'b', {(None, 'foo'): 'bar'}) - >>> handler.characters('Hello world') - >>> handler.endElementNS((None, 'b'), 'b') - >>> handler.endElementNS((None, 'a'), 'a') -We can now get the tree by accessing the `etree` property on the -handler:: +Interfacing with pulldom/minidom +-------------------------------- - >>> tree = handler.etree - >>> lxml.etree.tostring(tree.getroot()) - 'Hello world' +lxml.sax is a simple way to interface with the standard XML support in the +Python library. Note, however, that this is a one-way solution, as Python's +DOM implementation connot generate SAX events from a DOM tree. +You can use xml.dom.pulldom to build a minidom from lxml:: + >>> from xml.dom.pulldom import SAX2DOM + >>> handler = SAX2DOM() + >>> lxml.sax.saxify(tree, handler) +PullDOM makes the result available through the ``document`` attribute:: + >>> dom = handler.document + >>> print dom.firstChild.localName + a Modified: lxml/branch/lxml-1.0/src/lxml/etree.h ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.h (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.h Sun Jun 4 17:28:35 2006 @@ -24,6 +24,8 @@ #define iter(o) PyObject_GetIter(o) #define _cstr(s) PyString_AS_STRING(s) +#define _isString(obj) PyObject_TypeCheck(obj, &PyBaseString_Type) + #define _isElement(c_node) \ ((c_node)->type == XML_ELEMENT_NODE || \ (c_node)->type == XML_COMMENT_NODE) Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Sun Jun 4 17:28:35 2006 @@ -1,7 +1,7 @@ cimport tree, python from tree cimport xmlDoc, xmlNode, xmlAttr, xmlNs, _isElement from python cimport isinstance, issubclass, hasattr, callable -from python cimport iter, str, _cstr, Py_ssize_t +from python cimport iter, str, _cstr, _isString, Py_ssize_t cimport xpath cimport xinclude cimport c14n @@ -1397,8 +1397,7 @@ def __init__(self, text_or_uri, tag=None): if tag is not None: text_or_uri = "{%s}%s" % (text_or_uri, tag) - elif not python.PyString_Check(text_or_uri) and \ - not python.PyUnicode_Check(text_or_uri): + elif not _isString(text_or_uri): text_or_uri = str(text_or_uri) self.text = text_or_uri def __str__(self): Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Sun Jun 4 17:28:35 2006 @@ -419,6 +419,8 @@ if result is NULL: _raiseParseError(ctxt, c_filename) + elif result.URL is NULL and c_filename is not NULL: + result.URL = tree.xmlStrdup(c_filename) return result ############################################################ Modified: lxml/branch/lxml-1.0/src/lxml/python.pxd ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/python.pxd (original) +++ lxml/branch/lxml-1.0/src/lxml/python.pxd Sun Jun 4 17:28:35 2006 @@ -26,6 +26,7 @@ cdef object PyString_FromFormat(char* format, ...) cdef Py_ssize_t PyString_GET_SIZE(object s) cdef object PyBool_FromLong(long value) + cdef object PyNumber_Int(object value) cdef Py_ssize_t PyList_GET_SIZE(object l) cdef int PyList_Append(object l, object obj) @@ -56,6 +57,7 @@ cdef void PyMem_Free(void* p) cdef extern from "etree.h": # redefines some functions as macros + cdef int _isString(object obj) cdef int isinstance(object instance, object classes) cdef int issubclass(object derived, object superclasses) cdef int hasattr(object obj, object attr) Modified: lxml/branch/lxml-1.0/src/lxml/sax.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/sax.py (original) +++ lxml/branch/lxml-1.0/src/lxml/sax.py Sun Jun 4 17:28:35 2006 @@ -122,7 +122,9 @@ self._empty_attributes = attr_class({}, {}) def saxify(self): + self._content_handler.startDocument() self._recursive_saxify(self._element, {}) + self._content_handler.endDocument() def _recursive_saxify(self, element, prefixes): new_prefixes = [] Modified: lxml/branch/lxml-1.0/src/lxml/serializer.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/serializer.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/serializer.pxi Sun Jun 4 17:28:35 2006 @@ -155,7 +155,7 @@ raise LookupError, python.PyString_FromFormat( "unknown encoding: '%s'", c_enc) - if python.PyString_Check(f) or python.PyUnicode_Check(f): + if _isString(f): filename = _utf8(f) c_buffer = tree.xmlOutputBufferCreateFilename( _cstr(filename), enchandler, 0) @@ -184,7 +184,7 @@ c_base_doc = element._c_node.doc c_doc = _fakeRootDoc(c_base_doc, element._c_node) try: - if python.PyString_Check(f) or python.PyUnicode_Check(f): + if _isString(f): filename = _utf8(f) bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, _cstr(filename), 0) Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_sax.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_sax.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_sax.py Sun Jun 4 17:28:35 2006 @@ -9,6 +9,7 @@ from common_imports import HelperTestCase from lxml import sax +from xml.dom import pulldom class ETreeSaxTestCase(HelperTestCase): @@ -34,19 +35,38 @@ tree = self.parse('abbbba') new_tree = self._saxify_unsaxify(tree) root = new_tree.getroot() - self.assertEqual(root.tag, - '{bla}a') - self.assertEqual(root[0].tag, - '{bla}b') + self.assertEqual('{bla}a', + root.tag) + self.assertEqual('{bla}b', + root[0].tag) def test_etree_sax_ns2(self): tree = self.parse('abbbba') new_tree = self._saxify_unsaxify(tree) root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - '{blaB}b') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('{blaB}b', + root[0].tag) + + def test_sax_to_pulldom(self): + tree = self.parse('abbbba') + handler = pulldom.SAX2DOM() + sax.saxify(tree, handler) + dom = handler.document + + self.assertEqual('a', + dom.firstChild.localName) + self.assertEqual('blaA', + dom.firstChild.namespaceURI) + + children = dom.firstChild.childNodes + self.assertEqual('ab', + children[0].nodeValue) + self.assertEqual('blaB', + children[1].namespaceURI) + self.assertEqual('ba', + children[2].nodeValue) def test_element_sax(self): tree = self.parse('') @@ -68,17 +88,17 @@ new_tree = self._saxify_unsaxify(a) root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - 'b') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('b', + root[0].tag) new_tree = self._saxify_unsaxify(b) root = new_tree.getroot() - self.assertEqual(root.tag, - 'b') - self.assertEqual(len(root), - 0) + self.assertEqual('b', + root.tag) + self.assertEqual(0, + len(root)) def test_etree_sax_handler_default_ns(self): handler = sax.ElementTreeContentHandler() @@ -97,12 +117,12 @@ new_tree = handler.etree root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - '{blaB}b') - self.assertEqual(root[1].tag, - '{blaA}c') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('{blaB}b', + root[0].tag) + self.assertEqual('{blaA}c', + root[1].tag) def test_etree_sax_redefine_ns(self): handler = sax.ElementTreeContentHandler() @@ -121,12 +141,12 @@ new_tree = handler.etree root = new_tree.getroot() - self.assertEqual(root.tag, - '{blaA}a') - self.assertEqual(root[0].tag, - '{blaB}b') - self.assertEqual(root[1].tag, - '{blaA}c') + self.assertEqual('{blaA}a', + root.tag) + self.assertEqual('{blaB}b', + root[0].tag) + self.assertEqual('{blaA}c', + root[1].tag) def test_etree_sax_no_ns(self): handler = sax.ElementTreeContentHandler() @@ -141,9 +161,9 @@ new_tree = handler.etree root = new_tree.getroot() - self.assertEqual(root.tag, 'a') - self.assertEqual(root[0].tag, 'b') - self.assertEqual(root[1].tag, 'c') + self.assertEqual('a', root.tag) + self.assertEqual('b', root[0].tag) + self.assertEqual('c', root[1].tag) def test_etree_sax_error(self): handler = sax.ElementTreeContentHandler() Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_xslt.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_xslt.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_xslt.py Sun Jun 4 17:28:35 2006 @@ -292,10 +292,16 @@ self.assertEquals('''B''', str(res).strip()) - def test_xslt_multiple_files(self): + def test_xslt_include(self): tree = etree.parse(fileInTestDir('test1.xslt')) st = etree.XSLT(tree) + def test_xslt_include_from_filelike(self): + f = open(fileInTestDir('test1.xslt'), 'r') + tree = etree.parse(f) + f.close() + st = etree.XSLT(tree) + def test_xslt_multiple_transforms(self): xml = '' xslt = '''\ Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd Sun Jun 4 17:28:35 2006 @@ -1,5 +1,8 @@ # --- BEGIN: GENERATED CONSTANTS --- + +# This section is generated by the script 'update-error-constants.py'. + cdef extern from "libxml/xmlerror.h": ctypedef enum xmlErrorLevel: XML_ERR_NONE = 0 Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi Sun Jun 4 17:28:35 2006 @@ -382,20 +382,21 @@ ################################################################################ cdef void __initErrorConstants(): + "Called at setup time to parse the constants and build the classes below." find_constants = re.compile(r"\s*([a-zA-Z0-9_]+)\s*=\s*([0-9]+)").findall - for cls, constants, prefix in [(ErrorLevels, __ERROR_LEVELS, 'XML_ERR_'), - (ErrorDomains, __ERROR_DOMAINS, 'XML_FROM_'), - (ErrorTypes, __ERROR_TYPES, 'XML_')]: - prefix_len = len(prefix) + const_defs = ((ErrorLevels, __ERROR_LEVELS), + (ErrorDomains, __ERROR_DOMAINS), + (ErrorTypes, __ERROR_TYPES)) + for cls, constant_tuple in const_defs: reverse_dict = {} cls._names = reverse_dict cls._getName = reverse_dict.get - for name, value in find_constants(constants): - if name[:prefix_len] == prefix and len(name) > prefix_len: - name = name[prefix_len:] - value = int(value) - python.PyObject_SetAttr(cls, name, value) - python.PyDict_SetItem(reverse_dict, value, name) + for constants in constant_tuple: + #print len(constants) + 1 + for name, value in find_constants(constants): + value = python.PyNumber_Int(value) + python.PyObject_SetAttr(cls, name, value) + python.PyDict_SetItem(reverse_dict, value, name) class ErrorLevels: "Libxml2 error levels" @@ -407,824 +408,799 @@ "Libxml2 error types" # --- BEGIN: GENERATED CONSTANTS --- + +# This section is generated by the script 'update-error-constants.py'. + +# Constants are stored in tuples of strings, for which Pyrex generates very +# efficient setup code. To parse them, iterate over the tuples and parse each +# line in each string independently. + cdef object __ERROR_LEVELS -__ERROR_LEVELS = """\ -XML_ERR_NONE = 0 -XML_ERR_WARNING = 1 # A simple warning -XML_ERR_ERROR = 2 # A recoverable error -XML_ERR_FATAL = 3 # A fatal error -""" +__ERROR_LEVELS = ("""\ +NONE=0 +WARNING=1 +ERROR=2 +FATAL=3 +""",) cdef object __ERROR_DOMAINS -__ERROR_DOMAINS = """\ -XML_FROM_NONE = 0 -XML_FROM_PARSER = 1 # The XML parser -XML_FROM_TREE = 2 # The tree module -XML_FROM_NAMESPACE = 3 # The XML Namespace module -XML_FROM_DTD = 4 # The XML DTD validation with parser contex -XML_FROM_HTML = 5 # The HTML parser -XML_FROM_MEMORY = 6 # The memory allocator -XML_FROM_OUTPUT = 7 # The serialization code -XML_FROM_IO = 8 # The Input/Output stack -XML_FROM_FTP = 9 # The FTP module -XML_FROM_HTTP = 10 # The HTTP module -XML_FROM_XINCLUDE = 11 # The XInclude processing -XML_FROM_XPATH = 12 # The XPath module -XML_FROM_XPOINTER = 13 # The XPointer module -XML_FROM_REGEXP = 14 # The regular expressions module -XML_FROM_DATATYPE = 15 # The W3C XML Schemas Datatype module -XML_FROM_SCHEMASP = 16 # The W3C XML Schemas parser module -XML_FROM_SCHEMASV = 17 # The W3C XML Schemas validation module -XML_FROM_RELAXNGP = 18 # The Relax-NG parser module -XML_FROM_RELAXNGV = 19 # The Relax-NG validator module -XML_FROM_CATALOG = 20 # The Catalog module -XML_FROM_C14N = 21 # The Canonicalization module -XML_FROM_XSLT = 22 # The XSLT engine from libxslt -""" + \ -"""\ -XML_FROM_VALID = 23 # The XML DTD validation with valid context -XML_FROM_CHECK = 24 # The error checking module -XML_FROM_WRITER = 25 # The xmlwriter module -XML_FROM_MODULE = 26 # The dynamically loaded module modul -XML_FROM_I18N = 27 # The module handling character conversion -""" +__ERROR_DOMAINS = ("""\ +NONE=0 +PARSER=1 +TREE=2 +NAMESPACE=3 +DTD=4 +HTML=5 +MEMORY=6 +OUTPUT=7 +IO=8 +FTP=9 +HTTP=10 +XINCLUDE=11 +XPATH=12 +XPOINTER=13 +REGEXP=14 +DATATYPE=15 +SCHEMASP=16 +SCHEMASV=17 +RELAXNGP=18 +RELAXNGV=19 +CATALOG=20 +C14N=21 +XSLT=22 +VALID=23 +CHECK=24 +WRITER=25 +MODULE=26 +I18N=27 +""",) cdef object __ERROR_TYPES -__ERROR_TYPES = """\ -XML_ERR_OK = 0 -XML_ERR_INTERNAL_ERROR = 1 # 1 -XML_ERR_NO_MEMORY = 2 # 2 -XML_ERR_DOCUMENT_START = 3 # 3 -XML_ERR_DOCUMENT_EMPTY = 4 # 4 -XML_ERR_DOCUMENT_END = 5 # 5 -XML_ERR_INVALID_HEX_CHARREF = 6 # 6 -XML_ERR_INVALID_DEC_CHARREF = 7 # 7 -XML_ERR_INVALID_CHARREF = 8 # 8 -XML_ERR_INVALID_CHAR = 9 # 9 -XML_ERR_CHARREF_AT_EOF = 10 # 10 -XML_ERR_CHARREF_IN_PROLOG = 11 # 11 -XML_ERR_CHARREF_IN_EPILOG = 12 # 12 -XML_ERR_CHARREF_IN_DTD = 13 # 13 -XML_ERR_ENTITYREF_AT_EOF = 14 # 14 -XML_ERR_ENTITYREF_IN_PROLOG = 15 # 15 -XML_ERR_ENTITYREF_IN_EPILOG = 16 # 16 -XML_ERR_ENTITYREF_IN_DTD = 17 # 17 -XML_ERR_PEREF_AT_EOF = 18 # 18 -XML_ERR_PEREF_IN_PROLOG = 19 # 19 -XML_ERR_PEREF_IN_EPILOG = 20 # 20 -XML_ERR_PEREF_IN_INT_SUBSET = 21 # 21 -XML_ERR_ENTITYREF_NO_NAME = 22 # 22 -XML_ERR_ENTITYREF_SEMICOL_MISSING = 23 # 23 -XML_ERR_PEREF_NO_NAME = 24 # 24 -XML_ERR_PEREF_SEMICOL_MISSING = 25 # 25 -XML_ERR_UNDECLARED_ENTITY = 26 # 26 -XML_WAR_UNDECLARED_ENTITY = 27 # 27 -XML_ERR_UNPARSED_ENTITY = 28 # 28 -XML_ERR_ENTITY_IS_EXTERNAL = 29 # 29 -""" + \ -"""\ -XML_ERR_ENTITY_IS_PARAMETER = 30 # 30 -XML_ERR_UNKNOWN_ENCODING = 31 # 31 -XML_ERR_UNSUPPORTED_ENCODING = 32 # 32 -XML_ERR_STRING_NOT_STARTED = 33 # 33 -XML_ERR_STRING_NOT_CLOSED = 34 # 34 -XML_ERR_NS_DECL_ERROR = 35 # 35 -XML_ERR_ENTITY_NOT_STARTED = 36 # 36 -XML_ERR_ENTITY_NOT_FINISHED = 37 # 37 -XML_ERR_LT_IN_ATTRIBUTE = 38 # 38 -XML_ERR_ATTRIBUTE_NOT_STARTED = 39 # 39 -XML_ERR_ATTRIBUTE_NOT_FINISHED = 40 # 40 -XML_ERR_ATTRIBUTE_WITHOUT_VALUE = 41 # 41 -XML_ERR_ATTRIBUTE_REDEFINED = 42 # 42 -XML_ERR_LITERAL_NOT_STARTED = 43 # 43 -XML_ERR_LITERAL_NOT_FINISHED = 44 # 44 -XML_ERR_COMMENT_NOT_FINISHED = 45 # 45 -XML_ERR_PI_NOT_STARTED = 46 # 46 -XML_ERR_PI_NOT_FINISHED = 47 # 47 -XML_ERR_NOTATION_NOT_STARTED = 48 # 48 -XML_ERR_NOTATION_NOT_FINISHED = 49 # 49 -XML_ERR_ATTLIST_NOT_STARTED = 50 # 50 -XML_ERR_ATTLIST_NOT_FINISHED = 51 # 51 -XML_ERR_MIXED_NOT_STARTED = 52 # 52 -XML_ERR_MIXED_NOT_FINISHED = 53 # 53 -XML_ERR_ELEMCONTENT_NOT_STARTED = 54 # 54 -XML_ERR_ELEMCONTENT_NOT_FINISHED = 55 # 55 -XML_ERR_XMLDECL_NOT_STARTED = 56 # 56 -XML_ERR_XMLDECL_NOT_FINISHED = 57 # 57 -XML_ERR_CONDSEC_NOT_STARTED = 58 # 58 -XML_ERR_CONDSEC_NOT_FINISHED = 59 # 59 -""" + \ -"""\ -XML_ERR_EXT_SUBSET_NOT_FINISHED = 60 # 60 -XML_ERR_DOCTYPE_NOT_FINISHED = 61 # 61 -XML_ERR_MISPLACED_CDATA_END = 62 # 62 -XML_ERR_CDATA_NOT_FINISHED = 63 # 63 -XML_ERR_RESERVED_XML_NAME = 64 # 64 -XML_ERR_SPACE_REQUIRED = 65 # 65 -XML_ERR_SEPARATOR_REQUIRED = 66 # 66 -XML_ERR_NMTOKEN_REQUIRED = 67 # 67 -XML_ERR_NAME_REQUIRED = 68 # 68 -XML_ERR_PCDATA_REQUIRED = 69 # 69 -XML_ERR_URI_REQUIRED = 70 # 70 -XML_ERR_PUBID_REQUIRED = 71 # 71 -XML_ERR_LT_REQUIRED = 72 # 72 -XML_ERR_GT_REQUIRED = 73 # 73 -XML_ERR_LTSLASH_REQUIRED = 74 # 74 -XML_ERR_EQUAL_REQUIRED = 75 # 75 -XML_ERR_TAG_NAME_MISMATCH = 76 # 76 -XML_ERR_TAG_NOT_FINISHED = 77 # 77 -XML_ERR_STANDALONE_VALUE = 78 # 78 -XML_ERR_ENCODING_NAME = 79 # 79 -XML_ERR_HYPHEN_IN_COMMENT = 80 # 80 -XML_ERR_INVALID_ENCODING = 81 # 81 -XML_ERR_EXT_ENTITY_STANDALONE = 82 # 82 -XML_ERR_CONDSEC_INVALID = 83 # 83 -XML_ERR_VALUE_REQUIRED = 84 # 84 -XML_ERR_NOT_WELL_BALANCED = 85 # 85 -XML_ERR_EXTRA_CONTENT = 86 # 86 -XML_ERR_ENTITY_CHAR_ERROR = 87 # 87 -XML_ERR_ENTITY_PE_INTERNAL = 88 # 88 -XML_ERR_ENTITY_LOOP = 89 # 89 -""" + \ -"""\ -XML_ERR_ENTITY_BOUNDARY = 90 # 90 -XML_ERR_INVALID_URI = 91 # 91 -XML_ERR_URI_FRAGMENT = 92 # 92 -XML_WAR_CATALOG_PI = 93 # 93 -XML_ERR_NO_DTD = 94 # 94 -XML_ERR_CONDSEC_INVALID_KEYWORD = 95 # 95 -XML_ERR_VERSION_MISSING = 96 # 96 -XML_WAR_UNKNOWN_VERSION = 97 # 97 -XML_WAR_LANG_VALUE = 98 # 98 -XML_WAR_NS_URI = 99 # 99 -XML_WAR_NS_URI_RELATIVE = 100 # 100 -XML_ERR_MISSING_ENCODING = 101 # 101 -XML_WAR_SPACE_VALUE = 102 # 102 -XML_ERR_NOT_STANDALONE = 103 # 103 -XML_ERR_ENTITY_PROCESSING = 104 # 104 -XML_ERR_NOTATION_PROCESSING = 105 # 105 -XML_WAR_NS_COLUMN = 106 # 106 -XML_WAR_ENTITY_REDEFINED = 107 # 107 -XML_NS_ERR_XML_NAMESPACE = 200 -XML_NS_ERR_UNDEFINED_NAMESPACE = 201 # 201 -XML_NS_ERR_QNAME = 202 # 202 -XML_NS_ERR_ATTRIBUTE_REDEFINED = 203 # 203 -XML_NS_ERR_EMPTY = 204 # 204 -XML_DTD_ATTRIBUTE_DEFAULT = 500 -XML_DTD_ATTRIBUTE_REDEFINED = 501 # 501 -XML_DTD_ATTRIBUTE_VALUE = 502 # 502 -XML_DTD_CONTENT_ERROR = 503 # 503 -XML_DTD_CONTENT_MODEL = 504 # 504 -XML_DTD_CONTENT_NOT_DETERMINIST = 505 # 505 -XML_DTD_DIFFERENT_PREFIX = 506 # 506 -""" + \ -"""\ -XML_DTD_ELEM_DEFAULT_NAMESPACE = 507 # 507 -XML_DTD_ELEM_NAMESPACE = 508 # 508 -XML_DTD_ELEM_REDEFINED = 509 # 509 -XML_DTD_EMPTY_NOTATION = 510 # 510 -XML_DTD_ENTITY_TYPE = 511 # 511 -XML_DTD_ID_FIXED = 512 # 512 -XML_DTD_ID_REDEFINED = 513 # 513 -XML_DTD_ID_SUBSET = 514 # 514 -XML_DTD_INVALID_CHILD = 515 # 515 -XML_DTD_INVALID_DEFAULT = 516 # 516 -XML_DTD_LOAD_ERROR = 517 # 517 -XML_DTD_MISSING_ATTRIBUTE = 518 # 518 -XML_DTD_MIXED_CORRUPT = 519 # 519 -XML_DTD_MULTIPLE_ID = 520 # 520 -XML_DTD_NO_DOC = 521 # 521 -XML_DTD_NO_DTD = 522 # 522 -XML_DTD_NO_ELEM_NAME = 523 # 523 -XML_DTD_NO_PREFIX = 524 # 524 -XML_DTD_NO_ROOT = 525 # 525 -XML_DTD_NOTATION_REDEFINED = 526 # 526 -XML_DTD_NOTATION_VALUE = 527 # 527 -XML_DTD_NOT_EMPTY = 528 # 528 -XML_DTD_NOT_PCDATA = 529 # 529 -XML_DTD_NOT_STANDALONE = 530 # 530 -XML_DTD_ROOT_NAME = 531 # 531 -XML_DTD_STANDALONE_WHITE_SPACE = 532 # 532 -XML_DTD_UNKNOWN_ATTRIBUTE = 533 # 533 -XML_DTD_UNKNOWN_ELEM = 534 # 534 -XML_DTD_UNKNOWN_ENTITY = 535 # 535 -""" + \ -"""\ -XML_DTD_UNKNOWN_ID = 536 # 536 -XML_DTD_UNKNOWN_NOTATION = 537 # 537 -XML_DTD_STANDALONE_DEFAULTED = 538 # 538 -XML_DTD_XMLID_VALUE = 539 # 539 -XML_DTD_XMLID_TYPE = 540 # 540 -XML_HTML_STRUCURE_ERROR = 800 -XML_HTML_UNKNOWN_TAG = 801 # 801 -XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000 -XML_RNGP_ATTR_CONFLICT = 1001 # 1001 -XML_RNGP_ATTRIBUTE_CHILDREN = 1002 # 1002 -XML_RNGP_ATTRIBUTE_CONTENT = 1003 # 1003 -XML_RNGP_ATTRIBUTE_EMPTY = 1004 # 1004 -XML_RNGP_ATTRIBUTE_NOOP = 1005 # 1005 -XML_RNGP_CHOICE_CONTENT = 1006 # 1006 -XML_RNGP_CHOICE_EMPTY = 1007 # 1007 -XML_RNGP_CREATE_FAILURE = 1008 # 1008 -XML_RNGP_DATA_CONTENT = 1009 # 1009 -XML_RNGP_DEF_CHOICE_AND_INTERLEAVE = 1010 # 1010 -XML_RNGP_DEFINE_CREATE_FAILED = 1011 # 1011 -XML_RNGP_DEFINE_EMPTY = 1012 # 1012 -XML_RNGP_DEFINE_MISSING = 1013 # 1013 -XML_RNGP_DEFINE_NAME_MISSING = 1014 # 1014 -XML_RNGP_ELEM_CONTENT_EMPTY = 1015 # 1015 -XML_RNGP_ELEM_CONTENT_ERROR = 1016 # 1016 -XML_RNGP_ELEMENT_EMPTY = 1017 # 1017 -XML_RNGP_ELEMENT_CONTENT = 1018 # 1018 -XML_RNGP_ELEMENT_NAME = 1019 # 1019 -XML_RNGP_ELEMENT_NO_CONTENT = 1020 # 1020 -XML_RNGP_ELEM_TEXT_CONFLICT = 1021 # 1021 -""" + \ -"""\ -XML_RNGP_EMPTY = 1022 # 1022 -XML_RNGP_EMPTY_CONSTRUCT = 1023 # 1023 -XML_RNGP_EMPTY_CONTENT = 1024 # 1024 -XML_RNGP_EMPTY_NOT_EMPTY = 1025 # 1025 -XML_RNGP_ERROR_TYPE_LIB = 1026 # 1026 -XML_RNGP_EXCEPT_EMPTY = 1027 # 1027 -XML_RNGP_EXCEPT_MISSING = 1028 # 1028 -XML_RNGP_EXCEPT_MULTIPLE = 1029 # 1029 -XML_RNGP_EXCEPT_NO_CONTENT = 1030 # 1030 -XML_RNGP_EXTERNALREF_EMTPY = 1031 # 1031 -XML_RNGP_EXTERNAL_REF_FAILURE = 1032 # 1032 -XML_RNGP_EXTERNALREF_RECURSE = 1033 # 1033 -XML_RNGP_FORBIDDEN_ATTRIBUTE = 1034 # 1034 -XML_RNGP_FOREIGN_ELEMENT = 1035 # 1035 -XML_RNGP_GRAMMAR_CONTENT = 1036 # 1036 -XML_RNGP_GRAMMAR_EMPTY = 1037 # 1037 -XML_RNGP_GRAMMAR_MISSING = 1038 # 1038 -XML_RNGP_GRAMMAR_NO_START = 1039 # 1039 -XML_RNGP_GROUP_ATTR_CONFLICT = 1040 # 1040 -XML_RNGP_HREF_ERROR = 1041 # 1041 -XML_RNGP_INCLUDE_EMPTY = 1042 # 1042 -XML_RNGP_INCLUDE_FAILURE = 1043 # 1043 -XML_RNGP_INCLUDE_RECURSE = 1044 # 1044 -XML_RNGP_INTERLEAVE_ADD = 1045 # 1045 -XML_RNGP_INTERLEAVE_CREATE_FAILED = 1046 # 1046 -XML_RNGP_INTERLEAVE_EMPTY = 1047 # 1047 -XML_RNGP_INTERLEAVE_NO_CONTENT = 1048 # 1048 -XML_RNGP_INVALID_DEFINE_NAME = 1049 # 1049 -XML_RNGP_INVALID_URI = 1050 # 1050 -""" + \ -"""\ -XML_RNGP_INVALID_VALUE = 1051 # 1051 -XML_RNGP_MISSING_HREF = 1052 # 1052 -XML_RNGP_NAME_MISSING = 1053 # 1053 -XML_RNGP_NEED_COMBINE = 1054 # 1054 -XML_RNGP_NOTALLOWED_NOT_EMPTY = 1055 # 1055 -XML_RNGP_NSNAME_ATTR_ANCESTOR = 1056 # 1056 -XML_RNGP_NSNAME_NO_NS = 1057 # 1057 -XML_RNGP_PARAM_FORBIDDEN = 1058 # 1058 -XML_RNGP_PARAM_NAME_MISSING = 1059 # 1059 -XML_RNGP_PARENTREF_CREATE_FAILED = 1060 # 1060 -XML_RNGP_PARENTREF_NAME_INVALID = 1061 # 1061 -XML_RNGP_PARENTREF_NO_NAME = 1062 # 1062 -XML_RNGP_PARENTREF_NO_PARENT = 1063 # 1063 -XML_RNGP_PARENTREF_NOT_EMPTY = 1064 # 1064 -XML_RNGP_PARSE_ERROR = 1065 # 1065 -XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME = 1066 # 1066 -XML_RNGP_PAT_ATTR_ATTR = 1067 # 1067 -XML_RNGP_PAT_ATTR_ELEM = 1068 # 1068 -XML_RNGP_PAT_DATA_EXCEPT_ATTR = 1069 # 1069 -XML_RNGP_PAT_DATA_EXCEPT_ELEM = 1070 # 1070 -XML_RNGP_PAT_DATA_EXCEPT_EMPTY = 1071 # 1071 -XML_RNGP_PAT_DATA_EXCEPT_GROUP = 1072 # 1072 -XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE = 1073 # 1073 -XML_RNGP_PAT_DATA_EXCEPT_LIST = 1074 # 1074 -XML_RNGP_PAT_DATA_EXCEPT_ONEMORE = 1075 # 1075 -XML_RNGP_PAT_DATA_EXCEPT_REF = 1076 # 1076 -XML_RNGP_PAT_DATA_EXCEPT_TEXT = 1077 # 1077 -XML_RNGP_PAT_LIST_ATTR = 1078 # 1078 -XML_RNGP_PAT_LIST_ELEM = 1079 # 1079 -""" + \ -"""\ -XML_RNGP_PAT_LIST_INTERLEAVE = 1080 # 1080 -XML_RNGP_PAT_LIST_LIST = 1081 # 1081 -XML_RNGP_PAT_LIST_REF = 1082 # 1082 -XML_RNGP_PAT_LIST_TEXT = 1083 # 1083 -XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME = 1084 # 1084 -XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME = 1085 # 1085 -XML_RNGP_PAT_ONEMORE_GROUP_ATTR = 1086 # 1086 -XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR = 1087 # 1087 -XML_RNGP_PAT_START_ATTR = 1088 # 1088 -XML_RNGP_PAT_START_DATA = 1089 # 1089 -XML_RNGP_PAT_START_EMPTY = 1090 # 1090 -XML_RNGP_PAT_START_GROUP = 1091 # 1091 -XML_RNGP_PAT_START_INTERLEAVE = 1092 # 1092 -XML_RNGP_PAT_START_LIST = 1093 # 1093 -XML_RNGP_PAT_START_ONEMORE = 1094 # 1094 -XML_RNGP_PAT_START_TEXT = 1095 # 1095 -XML_RNGP_PAT_START_VALUE = 1096 # 1096 -XML_RNGP_PREFIX_UNDEFINED = 1097 # 1097 -XML_RNGP_REF_CREATE_FAILED = 1098 # 1098 -XML_RNGP_REF_CYCLE = 1099 # 1099 -XML_RNGP_REF_NAME_INVALID = 1100 # 1100 -XML_RNGP_REF_NO_DEF = 1101 # 1101 -XML_RNGP_REF_NO_NAME = 1102 # 1102 -XML_RNGP_REF_NOT_EMPTY = 1103 # 1103 -XML_RNGP_START_CHOICE_AND_INTERLEAVE = 1104 # 1104 -XML_RNGP_START_CONTENT = 1105 # 1105 -XML_RNGP_START_EMPTY = 1106 # 1106 -XML_RNGP_START_MISSING = 1107 # 1107 -XML_RNGP_TEXT_EXPECTED = 1108 # 1108 -""" + \ -"""\ -XML_RNGP_TEXT_HAS_CHILD = 1109 # 1109 -XML_RNGP_TYPE_MISSING = 1110 # 1110 -XML_RNGP_TYPE_NOT_FOUND = 1111 # 1111 -XML_RNGP_TYPE_VALUE = 1112 # 1112 -XML_RNGP_UNKNOWN_ATTRIBUTE = 1113 # 1113 -XML_RNGP_UNKNOWN_COMBINE = 1114 # 1114 -XML_RNGP_UNKNOWN_CONSTRUCT = 1115 # 1115 -XML_RNGP_UNKNOWN_TYPE_LIB = 1116 # 1116 -XML_RNGP_URI_FRAGMENT = 1117 # 1117 -XML_RNGP_URI_NOT_ABSOLUTE = 1118 # 1118 -XML_RNGP_VALUE_EMPTY = 1119 # 1119 -XML_RNGP_VALUE_NO_CONTENT = 1120 # 1120 -XML_RNGP_XMLNS_NAME = 1121 # 1121 -XML_RNGP_XML_NS = 1122 # 1122 -XML_XPATH_EXPRESSION_OK = 1200 -XML_XPATH_NUMBER_ERROR = 1201 # 1201 -XML_XPATH_UNFINISHED_LITERAL_ERROR = 1202 # 1202 -XML_XPATH_START_LITERAL_ERROR = 1203 # 1203 -XML_XPATH_VARIABLE_REF_ERROR = 1204 # 1204 -XML_XPATH_UNDEF_VARIABLE_ERROR = 1205 # 1205 -XML_XPATH_INVALID_PREDICATE_ERROR = 1206 # 1206 -XML_XPATH_EXPR_ERROR = 1207 # 1207 -XML_XPATH_UNCLOSED_ERROR = 1208 # 1208 -XML_XPATH_UNKNOWN_FUNC_ERROR = 1209 # 1209 -XML_XPATH_INVALID_OPERAND = 1210 # 1210 -XML_XPATH_INVALID_TYPE = 1211 # 1211 -XML_XPATH_INVALID_ARITY = 1212 # 1212 -XML_XPATH_INVALID_CTXT_SIZE = 1213 # 1213 -XML_XPATH_INVALID_CTXT_POSITION = 1214 # 1214 -""" + \ -"""\ -XML_XPATH_MEMORY_ERROR = 1215 # 1215 -XML_XPTR_SYNTAX_ERROR = 1216 # 1216 -XML_XPTR_RESOURCE_ERROR = 1217 # 1217 -XML_XPTR_SUB_RESOURCE_ERROR = 1218 # 1218 -XML_XPATH_UNDEF_PREFIX_ERROR = 1219 # 1219 -XML_XPATH_ENCODING_ERROR = 1220 # 1220 -XML_XPATH_INVALID_CHAR_ERROR = 1221 # 1221 -XML_TREE_INVALID_HEX = 1300 -XML_TREE_INVALID_DEC = 1301 # 1301 -XML_TREE_UNTERMINATED_ENTITY = 1302 # 1302 -XML_SAVE_NOT_UTF8 = 1400 -XML_SAVE_CHAR_INVALID = 1401 # 1401 -XML_SAVE_NO_DOCTYPE = 1402 # 1402 -XML_SAVE_UNKNOWN_ENCODING = 1403 # 1403 -XML_REGEXP_COMPILE_ERROR = 1450 -XML_IO_UNKNOWN = 1500 -XML_IO_EACCES = 1501 # 1501 -XML_IO_EAGAIN = 1502 # 1502 -XML_IO_EBADF = 1503 # 1503 -XML_IO_EBADMSG = 1504 # 1504 -XML_IO_EBUSY = 1505 # 1505 -XML_IO_ECANCELED = 1506 # 1506 -XML_IO_ECHILD = 1507 # 1507 -XML_IO_EDEADLK = 1508 # 1508 -XML_IO_EDOM = 1509 # 1509 -XML_IO_EEXIST = 1510 # 1510 -XML_IO_EFAULT = 1511 # 1511 -XML_IO_EFBIG = 1512 # 1512 -XML_IO_EINPROGRESS = 1513 # 1513 -""" + \ -"""\ -XML_IO_EINTR = 1514 # 1514 -XML_IO_EINVAL = 1515 # 1515 -XML_IO_EIO = 1516 # 1516 -XML_IO_EISDIR = 1517 # 1517 -XML_IO_EMFILE = 1518 # 1518 -XML_IO_EMLINK = 1519 # 1519 -XML_IO_EMSGSIZE = 1520 # 1520 -XML_IO_ENAMETOOLONG = 1521 # 1521 -XML_IO_ENFILE = 1522 # 1522 -XML_IO_ENODEV = 1523 # 1523 -XML_IO_ENOENT = 1524 # 1524 -XML_IO_ENOEXEC = 1525 # 1525 -XML_IO_ENOLCK = 1526 # 1526 -XML_IO_ENOMEM = 1527 # 1527 -XML_IO_ENOSPC = 1528 # 1528 -XML_IO_ENOSYS = 1529 # 1529 -XML_IO_ENOTDIR = 1530 # 1530 -XML_IO_ENOTEMPTY = 1531 # 1531 -XML_IO_ENOTSUP = 1532 # 1532 -XML_IO_ENOTTY = 1533 # 1533 -XML_IO_ENXIO = 1534 # 1534 -XML_IO_EPERM = 1535 # 1535 -XML_IO_EPIPE = 1536 # 1536 -XML_IO_ERANGE = 1537 # 1537 -XML_IO_EROFS = 1538 # 1538 -XML_IO_ESPIPE = 1539 # 1539 -XML_IO_ESRCH = 1540 # 1540 -XML_IO_ETIMEDOUT = 1541 # 1541 -XML_IO_EXDEV = 1542 # 1542 -""" + \ -"""\ -XML_IO_NETWORK_ATTEMPT = 1543 # 1543 -XML_IO_ENCODER = 1544 # 1544 -XML_IO_FLUSH = 1545 # 1545 -XML_IO_WRITE = 1546 # 1546 -XML_IO_NO_INPUT = 1547 # 1547 -XML_IO_BUFFER_FULL = 1548 # 1548 -XML_IO_LOAD_ERROR = 1549 # 1549 -XML_IO_ENOTSOCK = 1550 # 1550 -XML_IO_EISCONN = 1551 # 1551 -XML_IO_ECONNREFUSED = 1552 # 1552 -XML_IO_ENETUNREACH = 1553 # 1553 -XML_IO_EADDRINUSE = 1554 # 1554 -XML_IO_EALREADY = 1555 # 1555 -XML_IO_EAFNOSUPPORT = 1556 # 1556 -XML_XINCLUDE_RECURSION = 1600 -XML_XINCLUDE_PARSE_VALUE = 1601 # 1601 -XML_XINCLUDE_ENTITY_DEF_MISMATCH = 1602 # 1602 -XML_XINCLUDE_NO_HREF = 1603 # 1603 -XML_XINCLUDE_NO_FALLBACK = 1604 # 1604 -XML_XINCLUDE_HREF_URI = 1605 # 1605 -XML_XINCLUDE_TEXT_FRAGMENT = 1606 # 1606 -XML_XINCLUDE_TEXT_DOCUMENT = 1607 # 1607 -XML_XINCLUDE_INVALID_CHAR = 1608 # 1608 -XML_XINCLUDE_BUILD_FAILED = 1609 # 1609 -XML_XINCLUDE_UNKNOWN_ENCODING = 1610 # 1610 -XML_XINCLUDE_MULTIPLE_ROOT = 1611 # 1611 -XML_XINCLUDE_XPTR_FAILED = 1612 # 1612 -XML_XINCLUDE_XPTR_RESULT = 1613 # 1613 -XML_XINCLUDE_INCLUDE_IN_INCLUDE = 1614 # 1614 -""" + \ -"""\ -XML_XINCLUDE_FALLBACKS_IN_INCLUDE = 1615 # 1615 -XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE = 1616 # 1616 -XML_XINCLUDE_DEPRECATED_NS = 1617 # 1617 -XML_XINCLUDE_FRAGMENT_ID = 1618 # 1618 -XML_CATALOG_MISSING_ATTR = 1650 -XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 -XML_CATALOG_PREFER_VALUE = 1652 # 1652 -XML_CATALOG_NOT_CATALOG = 1653 # 1653 -XML_CATALOG_RECURSION = 1654 # 1654 -XML_SCHEMAP_PREFIX_UNDEFINED = 1700 -XML_SCHEMAP_ATTRFORMDEFAULT_VALUE = 1701 # 1701 -XML_SCHEMAP_ATTRGRP_NONAME_NOREF = 1702 # 1702 -XML_SCHEMAP_ATTR_NONAME_NOREF = 1703 # 1703 -XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF = 1704 # 1704 -XML_SCHEMAP_ELEMFORMDEFAULT_VALUE = 1705 # 1705 -XML_SCHEMAP_ELEM_NONAME_NOREF = 1706 # 1706 -XML_SCHEMAP_EXTENSION_NO_BASE = 1707 # 1707 -XML_SCHEMAP_FACET_NO_VALUE = 1708 # 1708 -XML_SCHEMAP_FAILED_BUILD_IMPORT = 1709 # 1709 -XML_SCHEMAP_GROUP_NONAME_NOREF = 1710 # 1710 -XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI = 1711 # 1711 -XML_SCHEMAP_IMPORT_REDEFINE_NSNAME = 1712 # 1712 -XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI = 1713 # 1713 -XML_SCHEMAP_INVALID_BOOLEAN = 1714 # 1714 -XML_SCHEMAP_INVALID_ENUM = 1715 # 1715 -XML_SCHEMAP_INVALID_FACET = 1716 # 1716 -XML_SCHEMAP_INVALID_FACET_VALUE = 1717 # 1717 -XML_SCHEMAP_INVALID_MAXOCCURS = 1718 # 1718 -XML_SCHEMAP_INVALID_MINOCCURS = 1719 # 1719 -""" + \ -"""\ -XML_SCHEMAP_INVALID_REF_AND_SUBTYPE = 1720 # 1720 -XML_SCHEMAP_INVALID_WHITE_SPACE = 1721 # 1721 -XML_SCHEMAP_NOATTR_NOREF = 1722 # 1722 -XML_SCHEMAP_NOTATION_NO_NAME = 1723 # 1723 -XML_SCHEMAP_NOTYPE_NOREF = 1724 # 1724 -XML_SCHEMAP_REF_AND_SUBTYPE = 1725 # 1725 -XML_SCHEMAP_RESTRICTION_NONAME_NOREF = 1726 # 1726 -XML_SCHEMAP_SIMPLETYPE_NONAME = 1727 # 1727 -XML_SCHEMAP_TYPE_AND_SUBTYPE = 1728 # 1728 -XML_SCHEMAP_UNKNOWN_ALL_CHILD = 1729 # 1729 -XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD = 1730 # 1730 -XML_SCHEMAP_UNKNOWN_ATTR_CHILD = 1731 # 1731 -XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD = 1732 # 1732 -XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP = 1733 # 1733 -XML_SCHEMAP_UNKNOWN_BASE_TYPE = 1734 # 1734 -XML_SCHEMAP_UNKNOWN_CHOICE_CHILD = 1735 # 1735 -XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD = 1736 # 1736 -XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD = 1737 # 1737 -XML_SCHEMAP_UNKNOWN_ELEM_CHILD = 1738 # 1738 -XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD = 1739 # 1739 -XML_SCHEMAP_UNKNOWN_FACET_CHILD = 1740 # 1740 -XML_SCHEMAP_UNKNOWN_FACET_TYPE = 1741 # 1741 -XML_SCHEMAP_UNKNOWN_GROUP_CHILD = 1742 # 1742 -XML_SCHEMAP_UNKNOWN_IMPORT_CHILD = 1743 # 1743 -XML_SCHEMAP_UNKNOWN_LIST_CHILD = 1744 # 1744 -XML_SCHEMAP_UNKNOWN_NOTATION_CHILD = 1745 # 1745 -XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD = 1746 # 1746 -XML_SCHEMAP_UNKNOWN_REF = 1747 # 1747 -XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD = 1748 # 1748 -""" + \ -"""\ -XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD = 1749 # 1749 -XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD = 1750 # 1750 -XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD = 1751 # 1751 -XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD = 1752 # 1752 -XML_SCHEMAP_UNKNOWN_TYPE = 1753 # 1753 -XML_SCHEMAP_UNKNOWN_UNION_CHILD = 1754 # 1754 -XML_SCHEMAP_ELEM_DEFAULT_FIXED = 1755 # 1755 -XML_SCHEMAP_REGEXP_INVALID = 1756 # 1756 -XML_SCHEMAP_FAILED_LOAD = 1757 # 1757 -XML_SCHEMAP_NOTHING_TO_PARSE = 1758 # 1758 -XML_SCHEMAP_NOROOT = 1759 # 1759 -XML_SCHEMAP_REDEFINED_GROUP = 1760 # 1760 -XML_SCHEMAP_REDEFINED_TYPE = 1761 # 1761 -XML_SCHEMAP_REDEFINED_ELEMENT = 1762 # 1762 -XML_SCHEMAP_REDEFINED_ATTRGROUP = 1763 # 1763 -XML_SCHEMAP_REDEFINED_ATTR = 1764 # 1764 -XML_SCHEMAP_REDEFINED_NOTATION = 1765 # 1765 -XML_SCHEMAP_FAILED_PARSE = 1766 # 1766 -XML_SCHEMAP_UNKNOWN_PREFIX = 1767 # 1767 -XML_SCHEMAP_DEF_AND_PREFIX = 1768 # 1768 -XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD = 1769 # 1769 -XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI = 1770 # 1770 -XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI = 1771 # 1771 -XML_SCHEMAP_NOT_SCHEMA = 1772 # 1772 -XML_SCHEMAP_UNKNOWN_MEMBER_TYPE = 1773 # 1773 -XML_SCHEMAP_INVALID_ATTR_USE = 1774 # 1774 -XML_SCHEMAP_RECURSIVE = 1775 # 1775 -XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE = 1776 # 1776 -XML_SCHEMAP_INVALID_ATTR_COMBINATION = 1777 # 1777 -""" + \ -"""\ -XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION = 1778 # 1778 -XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD = 1779 # 1779 -XML_SCHEMAP_INVALID_ATTR_NAME = 1780 # 1780 -XML_SCHEMAP_REF_AND_CONTENT = 1781 # 1781 -XML_SCHEMAP_CT_PROPS_CORRECT_1 = 1782 # 1782 -XML_SCHEMAP_CT_PROPS_CORRECT_2 = 1783 # 1783 -XML_SCHEMAP_CT_PROPS_CORRECT_3 = 1784 # 1784 -XML_SCHEMAP_CT_PROPS_CORRECT_4 = 1785 # 1785 -XML_SCHEMAP_CT_PROPS_CORRECT_5 = 1786 # 1786 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 = 1787 # 1787 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1 = 1788 # 1788 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2 = 1789 # 1789 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2 = 1790 # 1790 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3 = 1791 # 1791 -XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER = 1792 # 1792 -XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE = 1793 # 1793 -XML_SCHEMAP_UNION_NOT_EXPRESSIBLE = 1794 # 1794 -XML_SCHEMAP_SRC_IMPORT_3_1 = 1795 # 1795 -XML_SCHEMAP_SRC_IMPORT_3_2 = 1796 # 1796 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1 = 1797 # 1797 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2 = 1798 # 1798 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3 = 1799 # 1799 -XML_SCHEMAP_COS_CT_EXTENDS_1_3 = 1800 # 1800 -XML_SCHEMAV_NOROOT = 1801 -XML_SCHEMAV_UNDECLAREDELEM = 1802 # 1802 -XML_SCHEMAV_NOTTOPLEVEL = 1803 # 1803 -XML_SCHEMAV_MISSING = 1804 # 1804 -XML_SCHEMAV_WRONGELEM = 1805 # 1805 -XML_SCHEMAV_NOTYPE = 1806 # 1806 -""" + \ -"""\ -XML_SCHEMAV_NOROLLBACK = 1807 # 1807 -XML_SCHEMAV_ISABSTRACT = 1808 # 1808 -XML_SCHEMAV_NOTEMPTY = 1809 # 1809 -XML_SCHEMAV_ELEMCONT = 1810 # 1810 -XML_SCHEMAV_HAVEDEFAULT = 1811 # 1811 -XML_SCHEMAV_NOTNILLABLE = 1812 # 1812 -XML_SCHEMAV_EXTRACONTENT = 1813 # 1813 -XML_SCHEMAV_INVALIDATTR = 1814 # 1814 -XML_SCHEMAV_INVALIDELEM = 1815 # 1815 -XML_SCHEMAV_NOTDETERMINIST = 1816 # 1816 -XML_SCHEMAV_CONSTRUCT = 1817 # 1817 -XML_SCHEMAV_INTERNAL = 1818 # 1818 -XML_SCHEMAV_NOTSIMPLE = 1819 # 1819 -XML_SCHEMAV_ATTRUNKNOWN = 1820 # 1820 -XML_SCHEMAV_ATTRINVALID = 1821 # 1821 -XML_SCHEMAV_VALUE = 1822 # 1822 -XML_SCHEMAV_FACET = 1823 # 1823 -XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1 = 1824 # 1824 -XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2 = 1825 # 1825 -XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3 = 1826 # 1826 -XML_SCHEMAV_CVC_TYPE_3_1_1 = 1827 # 1827 -XML_SCHEMAV_CVC_TYPE_3_1_2 = 1828 # 1828 -XML_SCHEMAV_CVC_FACET_VALID = 1829 # 1829 -XML_SCHEMAV_CVC_LENGTH_VALID = 1830 # 1830 -XML_SCHEMAV_CVC_MINLENGTH_VALID = 1831 # 1831 -XML_SCHEMAV_CVC_MAXLENGTH_VALID = 1832 # 1832 -XML_SCHEMAV_CVC_MININCLUSIVE_VALID = 1833 # 1833 -XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID = 1834 # 1834 -XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID = 1835 # 1835 -""" + \ -"""\ -XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID = 1836 # 1836 -XML_SCHEMAV_CVC_TOTALDIGITS_VALID = 1837 # 1837 -XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID = 1838 # 1838 -XML_SCHEMAV_CVC_PATTERN_VALID = 1839 # 1839 -XML_SCHEMAV_CVC_ENUMERATION_VALID = 1840 # 1840 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1 = 1841 # 1841 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2 = 1842 # 1842 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3 = 1843 # 1843 -XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4 = 1844 # 1844 -XML_SCHEMAV_CVC_ELT_1 = 1845 # 1845 -XML_SCHEMAV_CVC_ELT_2 = 1846 # 1846 -XML_SCHEMAV_CVC_ELT_3_1 = 1847 # 1847 -XML_SCHEMAV_CVC_ELT_3_2_1 = 1848 # 1848 -XML_SCHEMAV_CVC_ELT_3_2_2 = 1849 # 1849 -XML_SCHEMAV_CVC_ELT_4_1 = 1850 # 1850 -XML_SCHEMAV_CVC_ELT_4_2 = 1851 # 1851 -XML_SCHEMAV_CVC_ELT_4_3 = 1852 # 1852 -XML_SCHEMAV_CVC_ELT_5_1_1 = 1853 # 1853 -XML_SCHEMAV_CVC_ELT_5_1_2 = 1854 # 1854 -XML_SCHEMAV_CVC_ELT_5_2_1 = 1855 # 1855 -XML_SCHEMAV_CVC_ELT_5_2_2_1 = 1856 # 1856 -XML_SCHEMAV_CVC_ELT_5_2_2_2_1 = 1857 # 1857 -XML_SCHEMAV_CVC_ELT_5_2_2_2_2 = 1858 # 1858 -XML_SCHEMAV_CVC_ELT_6 = 1859 # 1859 -XML_SCHEMAV_CVC_ELT_7 = 1860 # 1860 -XML_SCHEMAV_CVC_ATTRIBUTE_1 = 1861 # 1861 -XML_SCHEMAV_CVC_ATTRIBUTE_2 = 1862 # 1862 -XML_SCHEMAV_CVC_ATTRIBUTE_3 = 1863 # 1863 -XML_SCHEMAV_CVC_ATTRIBUTE_4 = 1864 # 1864 -""" + \ -"""\ -XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1 = 1865 # 1865 -XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1 = 1866 # 1866 -XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2 = 1867 # 1867 -XML_SCHEMAV_CVC_COMPLEX_TYPE_4 = 1868 # 1868 -XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1 = 1869 # 1869 -XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2 = 1870 # 1870 -XML_SCHEMAV_ELEMENT_CONTENT = 1871 # 1871 -XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING = 1872 # 1872 -XML_SCHEMAV_CVC_COMPLEX_TYPE_1 = 1873 # 1873 -XML_SCHEMAV_CVC_AU = 1874 # 1874 -XML_SCHEMAV_CVC_TYPE_1 = 1875 # 1875 -XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 -XML_SCHEMAV_CVC_IDC = 1877 # 1877 -XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 -XML_XPTR_UNKNOWN_SCHEME = 1900 -XML_XPTR_CHILDSEQ_START = 1901 # 1901 -XML_XPTR_EVAL_FAILED = 1902 # 1902 -XML_XPTR_EXTRA_OBJECTS = 1903 # 1903 -XML_C14N_CREATE_CTXT = 1950 -XML_C14N_REQUIRES_UTF8 = 1951 # 1951 -XML_C14N_CREATE_STACK = 1952 # 1952 -XML_C14N_INVALID_NODE = 1953 # 1953 -XML_C14N_UNKNOW_NODE = 1954 # 1954 -XML_C14N_RELATIVE_NAMESPACE = 1955 # 1955 -XML_FTP_PASV_ANSWER = 2000 -XML_FTP_EPSV_ANSWER = 2001 # 2001 -XML_FTP_ACCNT = 2002 # 2002 -XML_FTP_URL_SYNTAX = 2003 # 2003 -XML_HTTP_URL_SYNTAX = 2020 -""" + \ -"""\ -XML_HTTP_USE_IP = 2021 # 2021 -XML_HTTP_UNKNOWN_HOST = 2022 # 2022 -XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000 -XML_SCHEMAP_SRC_SIMPLE_TYPE_2 = 3001 # 3001 -XML_SCHEMAP_SRC_SIMPLE_TYPE_3 = 3002 # 3002 -XML_SCHEMAP_SRC_SIMPLE_TYPE_4 = 3003 # 3003 -XML_SCHEMAP_SRC_RESOLVE = 3004 # 3004 -XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE = 3005 # 3005 -XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE = 3006 # 3006 -XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES = 3007 # 3007 -XML_SCHEMAP_ST_PROPS_CORRECT_1 = 3008 # 3008 -XML_SCHEMAP_ST_PROPS_CORRECT_2 = 3009 # 3009 -XML_SCHEMAP_ST_PROPS_CORRECT_3 = 3010 # 3010 -XML_SCHEMAP_COS_ST_RESTRICTS_1_1 = 3011 # 3011 -XML_SCHEMAP_COS_ST_RESTRICTS_1_2 = 3012 # 3012 -XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1 = 3013 # 3013 -XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2 = 3014 # 3014 -XML_SCHEMAP_COS_ST_RESTRICTS_2_1 = 3015 # 3015 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1 = 3016 # 3016 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2 = 3017 # 3017 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1 = 3018 # 3018 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2 = 3019 # 3019 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3 = 3020 # 3020 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4 = 3021 # 3021 -XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5 = 3022 # 3022 -XML_SCHEMAP_COS_ST_RESTRICTS_3_1 = 3023 # 3023 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1 = 3024 # 3024 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2 = 3025 # 3025 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2 = 3026 # 3026 -""" + \ -"""\ -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1 = 3027 # 3027 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3 = 3028 # 3028 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4 = 3029 # 3029 -XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5 = 3030 # 3030 -XML_SCHEMAP_COS_ST_DERIVED_OK_2_1 = 3031 # 3031 -XML_SCHEMAP_COS_ST_DERIVED_OK_2_2 = 3032 # 3032 -XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED = 3033 # 3033 -XML_SCHEMAP_S4S_ELEM_MISSING = 3034 # 3034 -XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED = 3035 # 3035 -XML_SCHEMAP_S4S_ATTR_MISSING = 3036 # 3036 -XML_SCHEMAP_S4S_ATTR_INVALID_VALUE = 3037 # 3037 -XML_SCHEMAP_SRC_ELEMENT_1 = 3038 # 3038 -XML_SCHEMAP_SRC_ELEMENT_2_1 = 3039 # 3039 -XML_SCHEMAP_SRC_ELEMENT_2_2 = 3040 # 3040 -XML_SCHEMAP_SRC_ELEMENT_3 = 3041 # 3041 -XML_SCHEMAP_P_PROPS_CORRECT_1 = 3042 # 3042 -XML_SCHEMAP_P_PROPS_CORRECT_2_1 = 3043 # 3043 -XML_SCHEMAP_P_PROPS_CORRECT_2_2 = 3044 # 3044 -XML_SCHEMAP_E_PROPS_CORRECT_2 = 3045 # 3045 -XML_SCHEMAP_E_PROPS_CORRECT_3 = 3046 # 3046 -XML_SCHEMAP_E_PROPS_CORRECT_4 = 3047 # 3047 -XML_SCHEMAP_E_PROPS_CORRECT_5 = 3048 # 3048 -XML_SCHEMAP_E_PROPS_CORRECT_6 = 3049 # 3049 -XML_SCHEMAP_SRC_INCLUDE = 3050 # 3050 -XML_SCHEMAP_SRC_ATTRIBUTE_1 = 3051 # 3051 -XML_SCHEMAP_SRC_ATTRIBUTE_2 = 3052 # 3052 -XML_SCHEMAP_SRC_ATTRIBUTE_3_1 = 3053 # 3053 -XML_SCHEMAP_SRC_ATTRIBUTE_3_2 = 3054 # 3054 -XML_SCHEMAP_SRC_ATTRIBUTE_4 = 3055 # 3055 -""" + \ -"""\ -XML_SCHEMAP_NO_XMLNS = 3056 # 3056 -XML_SCHEMAP_NO_XSI = 3057 # 3057 -XML_SCHEMAP_COS_VALID_DEFAULT_1 = 3058 # 3058 -XML_SCHEMAP_COS_VALID_DEFAULT_2_1 = 3059 # 3059 -XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1 = 3060 # 3060 -XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2 = 3061 # 3061 -XML_SCHEMAP_CVC_SIMPLE_TYPE = 3062 # 3062 -XML_SCHEMAP_COS_CT_EXTENDS_1_1 = 3063 # 3063 -XML_SCHEMAP_SRC_IMPORT_1_1 = 3064 # 3064 -XML_SCHEMAP_SRC_IMPORT_1_2 = 3065 # 3065 -XML_SCHEMAP_SRC_IMPORT_2 = 3066 # 3066 -XML_SCHEMAP_SRC_IMPORT_2_1 = 3067 # 3067 -XML_SCHEMAP_SRC_IMPORT_2_2 = 3068 # 3068 -XML_SCHEMAP_INTERNAL = 3069 # 3069 non-W3C -XML_SCHEMAP_NOT_DETERMINISTIC = 3070 # 3070 non-W3C -XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1 = 3071 # 3071 -XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2 = 3072 # 3072 -XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3 = 3073 # 3073 -XML_SCHEMAP_MG_PROPS_CORRECT_1 = 3074 # 3074 -XML_SCHEMAP_MG_PROPS_CORRECT_2 = 3075 # 3075 -XML_SCHEMAP_SRC_CT_1 = 3076 # 3076 -XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3 = 3077 # 3077 -XML_SCHEMAP_AU_PROPS_CORRECT_2 = 3078 # 3078 -XML_SCHEMAP_A_PROPS_CORRECT_2 = 3079 # 3079 -XML_SCHEMAP_C_PROPS_CORRECT = 3080 # 3080 -XML_SCHEMAP_SRC_REDEFINE = 3081 # 3081 -XML_SCHEMAP_SRC_IMPORT = 3082 # 3082 -XML_SCHEMAP_WARN_SKIP_SCHEMA = 3083 # 3083 -XML_SCHEMAP_WARN_UNLOCATED_SCHEMA = 3084 # 3084 -""" + \ -"""\ -XML_SCHEMAP_WARN_ATTR_REDECL_PROH = 3085 # 3085 -XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH = 3086 # 3085 -XML_SCHEMAP_AG_PROPS_CORRECT = 3087 # 3086 -XML_SCHEMAP_COS_CT_EXTENDS_1_2 = 3088 # 3087 -XML_SCHEMAP_AU_PROPS_CORRECT = 3089 # 3088 -XML_SCHEMAP_A_PROPS_CORRECT_3 = 3090 # 3089 -XML_SCHEMAP_COS_ALL_LIMITED = 3091 # 3090 -XML_MODULE_OPEN = 4900 # 4900 -XML_MODULE_CLOSE = 4901 # 4901 -XML_CHECK_FOUND_ELEMENT = 5000 -XML_CHECK_FOUND_ATTRIBUTE = 5001 # 5001 -XML_CHECK_FOUND_TEXT = 5002 # 5002 -XML_CHECK_FOUND_CDATA = 5003 # 5003 -XML_CHECK_FOUND_ENTITYREF = 5004 # 5004 -XML_CHECK_FOUND_ENTITY = 5005 # 5005 -XML_CHECK_FOUND_PI = 5006 # 5006 -XML_CHECK_FOUND_COMMENT = 5007 # 5007 -XML_CHECK_FOUND_DOCTYPE = 5008 # 5008 -XML_CHECK_FOUND_FRAGMENT = 5009 # 5009 -XML_CHECK_FOUND_NOTATION = 5010 # 5010 -XML_CHECK_UNKNOWN_NODE = 5011 # 5011 -XML_CHECK_ENTITY_TYPE = 5012 # 5012 -XML_CHECK_NO_PARENT = 5013 # 5013 -XML_CHECK_NO_DOC = 5014 # 5014 -XML_CHECK_NO_NAME = 5015 # 5015 -XML_CHECK_NO_ELEM = 5016 # 5016 -XML_CHECK_WRONG_DOC = 5017 # 5017 -XML_CHECK_NO_PREV = 5018 # 5018 -XML_CHECK_WRONG_PREV = 5019 # 5019 -""" + \ -"""\ -XML_CHECK_NO_NEXT = 5020 # 5020 -XML_CHECK_WRONG_NEXT = 5021 # 5021 -XML_CHECK_NOT_DTD = 5022 # 5022 -XML_CHECK_NOT_ATTR = 5023 # 5023 -XML_CHECK_NOT_ATTR_DECL = 5024 # 5024 -XML_CHECK_NOT_ELEM_DECL = 5025 # 5025 -XML_CHECK_NOT_ENTITY_DECL = 5026 # 5026 -XML_CHECK_NOT_NS_DECL = 5027 # 5027 -XML_CHECK_NO_HREF = 5028 # 5028 -XML_CHECK_WRONG_PARENT = 5029 # 5029 -XML_CHECK_NS_SCOPE = 5030 # 5030 -XML_CHECK_NS_ANCESTOR = 5031 # 5031 -XML_CHECK_NOT_UTF8 = 5032 # 5032 -XML_CHECK_NO_DICT = 5033 # 5033 -XML_CHECK_NOT_NCNAME = 5034 # 5034 -XML_CHECK_OUTSIDE_DICT = 5035 # 5035 -XML_CHECK_WRONG_NAME = 5036 # 5036 -XML_CHECK_NAME_NOT_NULL = 5037 # 5037 -XML_I18N_NO_NAME = 6000 -XML_I18N_NO_HANDLER = 6001 # 6001 -XML_I18N_EXCESS_HANDLER = 6002 # 6002 -XML_I18N_CONV_FAILED = 6003 # 6003 -XML_I18N_NO_OUTPUT = 6004 # 6004 -XML_CHECK_ = 6005 # 5033 -XML_CHECK_X = 6006 # 503 -""" +__ERROR_TYPES = ("""\ +ERR_OK=0 +ERR_INTERNAL_ERROR=1 +ERR_NO_MEMORY=2 +ERR_DOCUMENT_START=3 +ERR_DOCUMENT_EMPTY=4 +ERR_DOCUMENT_END=5 +ERR_INVALID_HEX_CHARREF=6 +ERR_INVALID_DEC_CHARREF=7 +ERR_INVALID_CHARREF=8 +ERR_INVALID_CHAR=9 +ERR_CHARREF_AT_EOF=10 +ERR_CHARREF_IN_PROLOG=11 +ERR_CHARREF_IN_EPILOG=12 +ERR_CHARREF_IN_DTD=13 +ERR_ENTITYREF_AT_EOF=14 +ERR_ENTITYREF_IN_PROLOG=15 +ERR_ENTITYREF_IN_EPILOG=16 +ERR_ENTITYREF_IN_DTD=17 +ERR_PEREF_AT_EOF=18 +ERR_PEREF_IN_PROLOG=19 +ERR_PEREF_IN_EPILOG=20 +ERR_PEREF_IN_INT_SUBSET=21 +ERR_ENTITYREF_NO_NAME=22 +ERR_ENTITYREF_SEMICOL_MISSING=23 +ERR_PEREF_NO_NAME=24 +ERR_PEREF_SEMICOL_MISSING=25 +ERR_UNDECLARED_ENTITY=26 +WAR_UNDECLARED_ENTITY=27 +ERR_UNPARSED_ENTITY=28 +ERR_ENTITY_IS_EXTERNAL=29 +ERR_ENTITY_IS_PARAMETER=30 +ERR_UNKNOWN_ENCODING=31 +ERR_UNSUPPORTED_ENCODING=32 +ERR_STRING_NOT_STARTED=33 +ERR_STRING_NOT_CLOSED=34 +ERR_NS_DECL_ERROR=35 +ERR_ENTITY_NOT_STARTED=36 +ERR_ENTITY_NOT_FINISHED=37 +ERR_LT_IN_ATTRIBUTE=38 +ERR_ATTRIBUTE_NOT_STARTED=39 +ERR_ATTRIBUTE_NOT_FINISHED=40 +ERR_ATTRIBUTE_WITHOUT_VALUE=41 +ERR_ATTRIBUTE_REDEFINED=42 +ERR_LITERAL_NOT_STARTED=43 +ERR_LITERAL_NOT_FINISHED=44 +ERR_COMMENT_NOT_FINISHED=45 +ERR_PI_NOT_STARTED=46 +ERR_PI_NOT_FINISHED=47 +ERR_NOTATION_NOT_STARTED=48 +ERR_NOTATION_NOT_FINISHED=49 +ERR_ATTLIST_NOT_STARTED=50 +ERR_ATTLIST_NOT_FINISHED=51 +ERR_MIXED_NOT_STARTED=52 +ERR_MIXED_NOT_FINISHED=53 +ERR_ELEMCONTENT_NOT_STARTED=54 +ERR_ELEMCONTENT_NOT_FINISHED=55 +ERR_XMLDECL_NOT_STARTED=56 +ERR_XMLDECL_NOT_FINISHED=57 +ERR_CONDSEC_NOT_STARTED=58 +ERR_CONDSEC_NOT_FINISHED=59 +ERR_EXT_SUBSET_NOT_FINISHED=60 +ERR_DOCTYPE_NOT_FINISHED=61 +ERR_MISPLACED_CDATA_END=62 +ERR_CDATA_NOT_FINISHED=63 +ERR_RESERVED_XML_NAME=64 +ERR_SPACE_REQUIRED=65 +ERR_SEPARATOR_REQUIRED=66 +ERR_NMTOKEN_REQUIRED=67 +ERR_NAME_REQUIRED=68 +ERR_PCDATA_REQUIRED=69 +ERR_URI_REQUIRED=70 +ERR_PUBID_REQUIRED=71 +ERR_LT_REQUIRED=72 +ERR_GT_REQUIRED=73 +ERR_LTSLASH_REQUIRED=74 +ERR_EQUAL_REQUIRED=75 +ERR_TAG_NAME_MISMATCH=76 +ERR_TAG_NOT_FINISHED=77 +ERR_STANDALONE_VALUE=78 +""", +"""\ +ERR_ENCODING_NAME=79 +ERR_HYPHEN_IN_COMMENT=80 +ERR_INVALID_ENCODING=81 +ERR_EXT_ENTITY_STANDALONE=82 +ERR_CONDSEC_INVALID=83 +ERR_VALUE_REQUIRED=84 +ERR_NOT_WELL_BALANCED=85 +ERR_EXTRA_CONTENT=86 +ERR_ENTITY_CHAR_ERROR=87 +ERR_ENTITY_PE_INTERNAL=88 +ERR_ENTITY_LOOP=89 +ERR_ENTITY_BOUNDARY=90 +ERR_INVALID_URI=91 +ERR_URI_FRAGMENT=92 +WAR_CATALOG_PI=93 +ERR_NO_DTD=94 +ERR_CONDSEC_INVALID_KEYWORD=95 +ERR_VERSION_MISSING=96 +WAR_UNKNOWN_VERSION=97 +WAR_LANG_VALUE=98 +WAR_NS_URI=99 +WAR_NS_URI_RELATIVE=100 +ERR_MISSING_ENCODING=101 +WAR_SPACE_VALUE=102 +ERR_NOT_STANDALONE=103 +ERR_ENTITY_PROCESSING=104 +ERR_NOTATION_PROCESSING=105 +WAR_NS_COLUMN=106 +WAR_ENTITY_REDEFINED=107 +NS_ERR_XML_NAMESPACE=200 +NS_ERR_UNDEFINED_NAMESPACE=201 +NS_ERR_QNAME=202 +NS_ERR_ATTRIBUTE_REDEFINED=203 +NS_ERR_EMPTY=204 +DTD_ATTRIBUTE_DEFAULT=500 +DTD_ATTRIBUTE_REDEFINED=501 +DTD_ATTRIBUTE_VALUE=502 +DTD_CONTENT_ERROR=503 +DTD_CONTENT_MODEL=504 +DTD_CONTENT_NOT_DETERMINIST=505 +DTD_DIFFERENT_PREFIX=506 +DTD_ELEM_DEFAULT_NAMESPACE=507 +DTD_ELEM_NAMESPACE=508 +DTD_ELEM_REDEFINED=509 +DTD_EMPTY_NOTATION=510 +DTD_ENTITY_TYPE=511 +DTD_ID_FIXED=512 +DTD_ID_REDEFINED=513 +DTD_ID_SUBSET=514 +DTD_INVALID_CHILD=515 +DTD_INVALID_DEFAULT=516 +DTD_LOAD_ERROR=517 +DTD_MISSING_ATTRIBUTE=518 +DTD_MIXED_CORRUPT=519 +DTD_MULTIPLE_ID=520 +DTD_NO_DOC=521 +DTD_NO_DTD=522 +DTD_NO_ELEM_NAME=523 +DTD_NO_PREFIX=524 +DTD_NO_ROOT=525 +DTD_NOTATION_REDEFINED=526 +DTD_NOTATION_VALUE=527 +DTD_NOT_EMPTY=528 +DTD_NOT_PCDATA=529 +DTD_NOT_STANDALONE=530 +DTD_ROOT_NAME=531 +DTD_STANDALONE_WHITE_SPACE=532 +DTD_UNKNOWN_ATTRIBUTE=533 +DTD_UNKNOWN_ELEM=534 +DTD_UNKNOWN_ENTITY=535 +DTD_UNKNOWN_ID=536 +DTD_UNKNOWN_NOTATION=537 +DTD_STANDALONE_DEFAULTED=538 +DTD_XMLID_VALUE=539 +DTD_XMLID_TYPE=540 +HTML_STRUCURE_ERROR=800 +HTML_UNKNOWN_TAG=801 +RNGP_ANYNAME_ATTR_ANCESTOR=1000 +RNGP_ATTR_CONFLICT=1001 +RNGP_ATTRIBUTE_CHILDREN=1002 +RNGP_ATTRIBUTE_CONTENT=1003 +RNGP_ATTRIBUTE_EMPTY=1004 +RNGP_ATTRIBUTE_NOOP=1005 +RNGP_CHOICE_CONTENT=1006 +RNGP_CHOICE_EMPTY=1007 +""", +"""\ +RNGP_CREATE_FAILURE=1008 +RNGP_DATA_CONTENT=1009 +RNGP_DEF_CHOICE_AND_INTERLEAVE=1010 +RNGP_DEFINE_CREATE_FAILED=1011 +RNGP_DEFINE_EMPTY=1012 +RNGP_DEFINE_MISSING=1013 +RNGP_DEFINE_NAME_MISSING=1014 +RNGP_ELEM_CONTENT_EMPTY=1015 +RNGP_ELEM_CONTENT_ERROR=1016 +RNGP_ELEMENT_EMPTY=1017 +RNGP_ELEMENT_CONTENT=1018 +RNGP_ELEMENT_NAME=1019 +RNGP_ELEMENT_NO_CONTENT=1020 +RNGP_ELEM_TEXT_CONFLICT=1021 +RNGP_EMPTY=1022 +RNGP_EMPTY_CONSTRUCT=1023 +RNGP_EMPTY_CONTENT=1024 +RNGP_EMPTY_NOT_EMPTY=1025 +RNGP_ERROR_TYPE_LIB=1026 +RNGP_EXCEPT_EMPTY=1027 +RNGP_EXCEPT_MISSING=1028 +RNGP_EXCEPT_MULTIPLE=1029 +RNGP_EXCEPT_NO_CONTENT=1030 +RNGP_EXTERNALREF_EMTPY=1031 +RNGP_EXTERNAL_REF_FAILURE=1032 +RNGP_EXTERNALREF_RECURSE=1033 +RNGP_FORBIDDEN_ATTRIBUTE=1034 +RNGP_FOREIGN_ELEMENT=1035 +RNGP_GRAMMAR_CONTENT=1036 +RNGP_GRAMMAR_EMPTY=1037 +RNGP_GRAMMAR_MISSING=1038 +RNGP_GRAMMAR_NO_START=1039 +RNGP_GROUP_ATTR_CONFLICT=1040 +RNGP_HREF_ERROR=1041 +RNGP_INCLUDE_EMPTY=1042 +RNGP_INCLUDE_FAILURE=1043 +RNGP_INCLUDE_RECURSE=1044 +RNGP_INTERLEAVE_ADD=1045 +RNGP_INTERLEAVE_CREATE_FAILED=1046 +RNGP_INTERLEAVE_EMPTY=1047 +RNGP_INTERLEAVE_NO_CONTENT=1048 +RNGP_INVALID_DEFINE_NAME=1049 +RNGP_INVALID_URI=1050 +RNGP_INVALID_VALUE=1051 +RNGP_MISSING_HREF=1052 +RNGP_NAME_MISSING=1053 +RNGP_NEED_COMBINE=1054 +RNGP_NOTALLOWED_NOT_EMPTY=1055 +RNGP_NSNAME_ATTR_ANCESTOR=1056 +RNGP_NSNAME_NO_NS=1057 +RNGP_PARAM_FORBIDDEN=1058 +RNGP_PARAM_NAME_MISSING=1059 +RNGP_PARENTREF_CREATE_FAILED=1060 +RNGP_PARENTREF_NAME_INVALID=1061 +RNGP_PARENTREF_NO_NAME=1062 +RNGP_PARENTREF_NO_PARENT=1063 +RNGP_PARENTREF_NOT_EMPTY=1064 +RNGP_PARSE_ERROR=1065 +RNGP_PAT_ANYNAME_EXCEPT_ANYNAME=1066 +RNGP_PAT_ATTR_ATTR=1067 +RNGP_PAT_ATTR_ELEM=1068 +RNGP_PAT_DATA_EXCEPT_ATTR=1069 +RNGP_PAT_DATA_EXCEPT_ELEM=1070 +RNGP_PAT_DATA_EXCEPT_EMPTY=1071 +RNGP_PAT_DATA_EXCEPT_GROUP=1072 +RNGP_PAT_DATA_EXCEPT_INTERLEAVE=1073 +RNGP_PAT_DATA_EXCEPT_LIST=1074 +RNGP_PAT_DATA_EXCEPT_ONEMORE=1075 +RNGP_PAT_DATA_EXCEPT_REF=1076 +RNGP_PAT_DATA_EXCEPT_TEXT=1077 +RNGP_PAT_LIST_ATTR=1078 +""", +"""\ +RNGP_PAT_LIST_ELEM=1079 +RNGP_PAT_LIST_INTERLEAVE=1080 +RNGP_PAT_LIST_LIST=1081 +RNGP_PAT_LIST_REF=1082 +RNGP_PAT_LIST_TEXT=1083 +RNGP_PAT_NSNAME_EXCEPT_ANYNAME=1084 +RNGP_PAT_NSNAME_EXCEPT_NSNAME=1085 +RNGP_PAT_ONEMORE_GROUP_ATTR=1086 +RNGP_PAT_ONEMORE_INTERLEAVE_ATTR=1087 +RNGP_PAT_START_ATTR=1088 +RNGP_PAT_START_DATA=1089 +RNGP_PAT_START_EMPTY=1090 +RNGP_PAT_START_GROUP=1091 +RNGP_PAT_START_INTERLEAVE=1092 +RNGP_PAT_START_LIST=1093 +RNGP_PAT_START_ONEMORE=1094 +RNGP_PAT_START_TEXT=1095 +RNGP_PAT_START_VALUE=1096 +RNGP_PREFIX_UNDEFINED=1097 +RNGP_REF_CREATE_FAILED=1098 +RNGP_REF_CYCLE=1099 +RNGP_REF_NAME_INVALID=1100 +RNGP_REF_NO_DEF=1101 +RNGP_REF_NO_NAME=1102 +RNGP_REF_NOT_EMPTY=1103 +RNGP_START_CHOICE_AND_INTERLEAVE=1104 +RNGP_START_CONTENT=1105 +RNGP_START_EMPTY=1106 +RNGP_START_MISSING=1107 +RNGP_TEXT_EXPECTED=1108 +RNGP_TEXT_HAS_CHILD=1109 +RNGP_TYPE_MISSING=1110 +RNGP_TYPE_NOT_FOUND=1111 +RNGP_TYPE_VALUE=1112 +RNGP_UNKNOWN_ATTRIBUTE=1113 +RNGP_UNKNOWN_COMBINE=1114 +RNGP_UNKNOWN_CONSTRUCT=1115 +RNGP_UNKNOWN_TYPE_LIB=1116 +RNGP_URI_FRAGMENT=1117 +RNGP_URI_NOT_ABSOLUTE=1118 +RNGP_VALUE_EMPTY=1119 +RNGP_VALUE_NO_CONTENT=1120 +RNGP_XMLNS_NAME=1121 +RNGP_XML_NS=1122 +XPATH_EXPRESSION_OK=1200 +XPATH_NUMBER_ERROR=1201 +XPATH_UNFINISHED_LITERAL_ERROR=1202 +XPATH_START_LITERAL_ERROR=1203 +XPATH_VARIABLE_REF_ERROR=1204 +XPATH_UNDEF_VARIABLE_ERROR=1205 +XPATH_INVALID_PREDICATE_ERROR=1206 +XPATH_EXPR_ERROR=1207 +XPATH_UNCLOSED_ERROR=1208 +XPATH_UNKNOWN_FUNC_ERROR=1209 +XPATH_INVALID_OPERAND=1210 +XPATH_INVALID_TYPE=1211 +XPATH_INVALID_ARITY=1212 +XPATH_INVALID_CTXT_SIZE=1213 +XPATH_INVALID_CTXT_POSITION=1214 +XPATH_MEMORY_ERROR=1215 +XPTR_SYNTAX_ERROR=1216 +XPTR_RESOURCE_ERROR=1217 +XPTR_SUB_RESOURCE_ERROR=1218 +XPATH_UNDEF_PREFIX_ERROR=1219 +XPATH_ENCODING_ERROR=1220 +XPATH_INVALID_CHAR_ERROR=1221 +TREE_INVALID_HEX=1300 +TREE_INVALID_DEC=1301 +TREE_UNTERMINATED_ENTITY=1302 +SAVE_NOT_UTF8=1400 +SAVE_CHAR_INVALID=1401 +SAVE_NO_DOCTYPE=1402 +SAVE_UNKNOWN_ENCODING=1403 +REGEXP_COMPILE_ERROR=1450 +""", +"""\ +IO_UNKNOWN=1500 +IO_EACCES=1501 +IO_EAGAIN=1502 +IO_EBADF=1503 +IO_EBADMSG=1504 +IO_EBUSY=1505 +IO_ECANCELED=1506 +IO_ECHILD=1507 +IO_EDEADLK=1508 +IO_EDOM=1509 +IO_EEXIST=1510 +IO_EFAULT=1511 +IO_EFBIG=1512 +IO_EINPROGRESS=1513 +IO_EINTR=1514 +IO_EINVAL=1515 +IO_EIO=1516 +IO_EISDIR=1517 +IO_EMFILE=1518 +IO_EMLINK=1519 +IO_EMSGSIZE=1520 +IO_ENAMETOOLONG=1521 +IO_ENFILE=1522 +IO_ENODEV=1523 +IO_ENOENT=1524 +IO_ENOEXEC=1525 +IO_ENOLCK=1526 +IO_ENOMEM=1527 +IO_ENOSPC=1528 +IO_ENOSYS=1529 +IO_ENOTDIR=1530 +IO_ENOTEMPTY=1531 +IO_ENOTSUP=1532 +IO_ENOTTY=1533 +IO_ENXIO=1534 +IO_EPERM=1535 +IO_EPIPE=1536 +IO_ERANGE=1537 +IO_EROFS=1538 +IO_ESPIPE=1539 +IO_ESRCH=1540 +IO_ETIMEDOUT=1541 +IO_EXDEV=1542 +IO_NETWORK_ATTEMPT=1543 +IO_ENCODER=1544 +IO_FLUSH=1545 +IO_WRITE=1546 +IO_NO_INPUT=1547 +IO_BUFFER_FULL=1548 +IO_LOAD_ERROR=1549 +IO_ENOTSOCK=1550 +IO_EISCONN=1551 +IO_ECONNREFUSED=1552 +IO_ENETUNREACH=1553 +IO_EADDRINUSE=1554 +IO_EALREADY=1555 +IO_EAFNOSUPPORT=1556 +XINCLUDE_RECURSION=1600 +XINCLUDE_PARSE_VALUE=1601 +XINCLUDE_ENTITY_DEF_MISMATCH=1602 +XINCLUDE_NO_HREF=1603 +XINCLUDE_NO_FALLBACK=1604 +XINCLUDE_HREF_URI=1605 +XINCLUDE_TEXT_FRAGMENT=1606 +XINCLUDE_TEXT_DOCUMENT=1607 +XINCLUDE_INVALID_CHAR=1608 +XINCLUDE_BUILD_FAILED=1609 +XINCLUDE_UNKNOWN_ENCODING=1610 +XINCLUDE_MULTIPLE_ROOT=1611 +XINCLUDE_XPTR_FAILED=1612 +XINCLUDE_XPTR_RESULT=1613 +XINCLUDE_INCLUDE_IN_INCLUDE=1614 +XINCLUDE_FALLBACKS_IN_INCLUDE=1615 +XINCLUDE_FALLBACK_NOT_IN_INCLUDE=1616 +XINCLUDE_DEPRECATED_NS=1617 +XINCLUDE_FRAGMENT_ID=1618 +CATALOG_MISSING_ATTR=1650 +CATALOG_ENTRY_BROKEN=1651 +CATALOG_PREFER_VALUE=1652 +CATALOG_NOT_CATALOG=1653 +CATALOG_RECURSION=1654 +SCHEMAP_PREFIX_UNDEFINED=1700 +SCHEMAP_ATTRFORMDEFAULT_VALUE=1701 +SCHEMAP_ATTRGRP_NONAME_NOREF=1702 +SCHEMAP_ATTR_NONAME_NOREF=1703 +SCHEMAP_COMPLEXTYPE_NONAME_NOREF=1704 +SCHEMAP_ELEMFORMDEFAULT_VALUE=1705 +SCHEMAP_ELEM_NONAME_NOREF=1706 +SCHEMAP_EXTENSION_NO_BASE=1707 +SCHEMAP_FACET_NO_VALUE=1708 +SCHEMAP_FAILED_BUILD_IMPORT=1709 +SCHEMAP_GROUP_NONAME_NOREF=1710 +""", +"""\ +SCHEMAP_IMPORT_NAMESPACE_NOT_URI=1711 +SCHEMAP_IMPORT_REDEFINE_NSNAME=1712 +SCHEMAP_IMPORT_SCHEMA_NOT_URI=1713 +SCHEMAP_INVALID_BOOLEAN=1714 +SCHEMAP_INVALID_ENUM=1715 +SCHEMAP_INVALID_FACET=1716 +SCHEMAP_INVALID_FACET_VALUE=1717 +SCHEMAP_INVALID_MAXOCCURS=1718 +SCHEMAP_INVALID_MINOCCURS=1719 +SCHEMAP_INVALID_REF_AND_SUBTYPE=1720 +SCHEMAP_INVALID_WHITE_SPACE=1721 +SCHEMAP_NOATTR_NOREF=1722 +SCHEMAP_NOTATION_NO_NAME=1723 +SCHEMAP_NOTYPE_NOREF=1724 +SCHEMAP_REF_AND_SUBTYPE=1725 +SCHEMAP_RESTRICTION_NONAME_NOREF=1726 +SCHEMAP_SIMPLETYPE_NONAME=1727 +SCHEMAP_TYPE_AND_SUBTYPE=1728 +SCHEMAP_UNKNOWN_ALL_CHILD=1729 +SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD=1730 +SCHEMAP_UNKNOWN_ATTR_CHILD=1731 +SCHEMAP_UNKNOWN_ATTRGRP_CHILD=1732 +SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP=1733 +SCHEMAP_UNKNOWN_BASE_TYPE=1734 +SCHEMAP_UNKNOWN_CHOICE_CHILD=1735 +SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD=1736 +SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD=1737 +SCHEMAP_UNKNOWN_ELEM_CHILD=1738 +SCHEMAP_UNKNOWN_EXTENSION_CHILD=1739 +SCHEMAP_UNKNOWN_FACET_CHILD=1740 +SCHEMAP_UNKNOWN_FACET_TYPE=1741 +SCHEMAP_UNKNOWN_GROUP_CHILD=1742 +SCHEMAP_UNKNOWN_IMPORT_CHILD=1743 +SCHEMAP_UNKNOWN_LIST_CHILD=1744 +SCHEMAP_UNKNOWN_NOTATION_CHILD=1745 +SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD=1746 +SCHEMAP_UNKNOWN_REF=1747 +SCHEMAP_UNKNOWN_RESTRICTION_CHILD=1748 +SCHEMAP_UNKNOWN_SCHEMAS_CHILD=1749 +SCHEMAP_UNKNOWN_SEQUENCE_CHILD=1750 +SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD=1751 +SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD=1752 +SCHEMAP_UNKNOWN_TYPE=1753 +SCHEMAP_UNKNOWN_UNION_CHILD=1754 +SCHEMAP_ELEM_DEFAULT_FIXED=1755 +SCHEMAP_REGEXP_INVALID=1756 +SCHEMAP_FAILED_LOAD=1757 +SCHEMAP_NOTHING_TO_PARSE=1758 +SCHEMAP_NOROOT=1759 +SCHEMAP_REDEFINED_GROUP=1760 +SCHEMAP_REDEFINED_TYPE=1761 +SCHEMAP_REDEFINED_ELEMENT=1762 +SCHEMAP_REDEFINED_ATTRGROUP=1763 +SCHEMAP_REDEFINED_ATTR=1764 +SCHEMAP_REDEFINED_NOTATION=1765 +SCHEMAP_FAILED_PARSE=1766 +SCHEMAP_UNKNOWN_PREFIX=1767 +SCHEMAP_DEF_AND_PREFIX=1768 +SCHEMAP_UNKNOWN_INCLUDE_CHILD=1769 +SCHEMAP_INCLUDE_SCHEMA_NOT_URI=1770 +SCHEMAP_INCLUDE_SCHEMA_NO_URI=1771 +""", +"""\ +SCHEMAP_NOT_SCHEMA=1772 +SCHEMAP_UNKNOWN_MEMBER_TYPE=1773 +SCHEMAP_INVALID_ATTR_USE=1774 +SCHEMAP_RECURSIVE=1775 +SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE=1776 +SCHEMAP_INVALID_ATTR_COMBINATION=1777 +SCHEMAP_INVALID_ATTR_INLINE_COMBINATION=1778 +SCHEMAP_MISSING_SIMPLETYPE_CHILD=1779 +SCHEMAP_INVALID_ATTR_NAME=1780 +SCHEMAP_REF_AND_CONTENT=1781 +SCHEMAP_CT_PROPS_CORRECT_1=1782 +SCHEMAP_CT_PROPS_CORRECT_2=1783 +SCHEMAP_CT_PROPS_CORRECT_3=1784 +SCHEMAP_CT_PROPS_CORRECT_4=1785 +SCHEMAP_CT_PROPS_CORRECT_5=1786 +SCHEMAP_DERIVATION_OK_RESTRICTION_1=1787 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1=1788 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2=1789 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_2=1790 +SCHEMAP_DERIVATION_OK_RESTRICTION_3=1791 +SCHEMAP_WILDCARD_INVALID_NS_MEMBER=1792 +SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE=1793 +SCHEMAP_UNION_NOT_EXPRESSIBLE=1794 +SCHEMAP_SRC_IMPORT_3_1=1795 +SCHEMAP_SRC_IMPORT_3_2=1796 +SCHEMAP_DERIVATION_OK_RESTRICTION_4_1=1797 +SCHEMAP_DERIVATION_OK_RESTRICTION_4_2=1798 +SCHEMAP_DERIVATION_OK_RESTRICTION_4_3=1799 +SCHEMAP_COS_CT_EXTENDS_1_3=1800 +SCHEMAV_NOROOT=1801 +SCHEMAV_UNDECLAREDELEM=1802 +SCHEMAV_NOTTOPLEVEL=1803 +SCHEMAV_MISSING=1804 +SCHEMAV_WRONGELEM=1805 +SCHEMAV_NOTYPE=1806 +SCHEMAV_NOROLLBACK=1807 +SCHEMAV_ISABSTRACT=1808 +SCHEMAV_NOTEMPTY=1809 +SCHEMAV_ELEMCONT=1810 +SCHEMAV_HAVEDEFAULT=1811 +SCHEMAV_NOTNILLABLE=1812 +SCHEMAV_EXTRACONTENT=1813 +SCHEMAV_INVALIDATTR=1814 +SCHEMAV_INVALIDELEM=1815 +SCHEMAV_NOTDETERMINIST=1816 +SCHEMAV_CONSTRUCT=1817 +SCHEMAV_INTERNAL=1818 +SCHEMAV_NOTSIMPLE=1819 +SCHEMAV_ATTRUNKNOWN=1820 +SCHEMAV_ATTRINVALID=1821 +SCHEMAV_VALUE=1822 +SCHEMAV_FACET=1823 +SCHEMAV_CVC_DATATYPE_VALID_1_2_1=1824 +SCHEMAV_CVC_DATATYPE_VALID_1_2_2=1825 +SCHEMAV_CVC_DATATYPE_VALID_1_2_3=1826 +SCHEMAV_CVC_TYPE_3_1_1=1827 +SCHEMAV_CVC_TYPE_3_1_2=1828 +SCHEMAV_CVC_FACET_VALID=1829 +SCHEMAV_CVC_LENGTH_VALID=1830 +SCHEMAV_CVC_MINLENGTH_VALID=1831 +SCHEMAV_CVC_MAXLENGTH_VALID=1832 +SCHEMAV_CVC_MININCLUSIVE_VALID=1833 +SCHEMAV_CVC_MAXINCLUSIVE_VALID=1834 +""", +"""\ +SCHEMAV_CVC_MINEXCLUSIVE_VALID=1835 +SCHEMAV_CVC_MAXEXCLUSIVE_VALID=1836 +SCHEMAV_CVC_TOTALDIGITS_VALID=1837 +SCHEMAV_CVC_FRACTIONDIGITS_VALID=1838 +SCHEMAV_CVC_PATTERN_VALID=1839 +SCHEMAV_CVC_ENUMERATION_VALID=1840 +SCHEMAV_CVC_COMPLEX_TYPE_2_1=1841 +SCHEMAV_CVC_COMPLEX_TYPE_2_2=1842 +SCHEMAV_CVC_COMPLEX_TYPE_2_3=1843 +SCHEMAV_CVC_COMPLEX_TYPE_2_4=1844 +SCHEMAV_CVC_ELT_1=1845 +SCHEMAV_CVC_ELT_2=1846 +SCHEMAV_CVC_ELT_3_1=1847 +SCHEMAV_CVC_ELT_3_2_1=1848 +SCHEMAV_CVC_ELT_3_2_2=1849 +SCHEMAV_CVC_ELT_4_1=1850 +SCHEMAV_CVC_ELT_4_2=1851 +SCHEMAV_CVC_ELT_4_3=1852 +SCHEMAV_CVC_ELT_5_1_1=1853 +SCHEMAV_CVC_ELT_5_1_2=1854 +SCHEMAV_CVC_ELT_5_2_1=1855 +SCHEMAV_CVC_ELT_5_2_2_1=1856 +SCHEMAV_CVC_ELT_5_2_2_2_1=1857 +SCHEMAV_CVC_ELT_5_2_2_2_2=1858 +SCHEMAV_CVC_ELT_6=1859 +SCHEMAV_CVC_ELT_7=1860 +SCHEMAV_CVC_ATTRIBUTE_1=1861 +SCHEMAV_CVC_ATTRIBUTE_2=1862 +SCHEMAV_CVC_ATTRIBUTE_3=1863 +SCHEMAV_CVC_ATTRIBUTE_4=1864 +SCHEMAV_CVC_COMPLEX_TYPE_3_1=1865 +SCHEMAV_CVC_COMPLEX_TYPE_3_2_1=1866 +SCHEMAV_CVC_COMPLEX_TYPE_3_2_2=1867 +SCHEMAV_CVC_COMPLEX_TYPE_4=1868 +SCHEMAV_CVC_COMPLEX_TYPE_5_1=1869 +SCHEMAV_CVC_COMPLEX_TYPE_5_2=1870 +SCHEMAV_ELEMENT_CONTENT=1871 +SCHEMAV_DOCUMENT_ELEMENT_MISSING=1872 +SCHEMAV_CVC_COMPLEX_TYPE_1=1873 +SCHEMAV_CVC_AU=1874 +SCHEMAV_CVC_TYPE_1=1875 +SCHEMAV_CVC_TYPE_2=1876 +SCHEMAV_CVC_IDC=1877 +SCHEMAV_CVC_WILDCARD=1878 +XPTR_UNKNOWN_SCHEME=1900 +XPTR_CHILDSEQ_START=1901 +XPTR_EVAL_FAILED=1902 +XPTR_EXTRA_OBJECTS=1903 +C14N_CREATE_CTXT=1950 +C14N_REQUIRES_UTF8=1951 +C14N_CREATE_STACK=1952 +C14N_INVALID_NODE=1953 +C14N_UNKNOW_NODE=1954 +C14N_RELATIVE_NAMESPACE=1955 +FTP_PASV_ANSWER=2000 +FTP_EPSV_ANSWER=2001 +FTP_ACCNT=2002 +FTP_URL_SYNTAX=2003 +HTTP_URL_SYNTAX=2020 +HTTP_USE_IP=2021 +HTTP_UNKNOWN_HOST=2022 +SCHEMAP_SRC_SIMPLE_TYPE_1=3000 +SCHEMAP_SRC_SIMPLE_TYPE_2=3001 +SCHEMAP_SRC_SIMPLE_TYPE_3=3002 +SCHEMAP_SRC_SIMPLE_TYPE_4=3003 +SCHEMAP_SRC_RESOLVE=3004 +SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE=3005 +SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE=3006 +SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 +""", +"""\ +SCHEMAP_ST_PROPS_CORRECT_1=3008 +SCHEMAP_ST_PROPS_CORRECT_2=3009 +SCHEMAP_ST_PROPS_CORRECT_3=3010 +SCHEMAP_COS_ST_RESTRICTS_1_1=3011 +SCHEMAP_COS_ST_RESTRICTS_1_2=3012 +SCHEMAP_COS_ST_RESTRICTS_1_3_1=3013 +SCHEMAP_COS_ST_RESTRICTS_1_3_2=3014 +SCHEMAP_COS_ST_RESTRICTS_2_1=3015 +SCHEMAP_COS_ST_RESTRICTS_2_3_1_1=3016 +SCHEMAP_COS_ST_RESTRICTS_2_3_1_2=3017 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_1=3018 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_2=3019 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_3=3020 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_4=3021 +SCHEMAP_COS_ST_RESTRICTS_2_3_2_5=3022 +SCHEMAP_COS_ST_RESTRICTS_3_1=3023 +SCHEMAP_COS_ST_RESTRICTS_3_3_1=3024 +SCHEMAP_COS_ST_RESTRICTS_3_3_1_2=3025 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_2=3026 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_1=3027 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_3=3028 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_4=3029 +SCHEMAP_COS_ST_RESTRICTS_3_3_2_5=3030 +SCHEMAP_COS_ST_DERIVED_OK_2_1=3031 +SCHEMAP_COS_ST_DERIVED_OK_2_2=3032 +SCHEMAP_S4S_ELEM_NOT_ALLOWED=3033 +SCHEMAP_S4S_ELEM_MISSING=3034 +SCHEMAP_S4S_ATTR_NOT_ALLOWED=3035 +SCHEMAP_S4S_ATTR_MISSING=3036 +SCHEMAP_S4S_ATTR_INVALID_VALUE=3037 +SCHEMAP_SRC_ELEMENT_1=3038 +SCHEMAP_SRC_ELEMENT_2_1=3039 +SCHEMAP_SRC_ELEMENT_2_2=3040 +SCHEMAP_SRC_ELEMENT_3=3041 +SCHEMAP_P_PROPS_CORRECT_1=3042 +SCHEMAP_P_PROPS_CORRECT_2_1=3043 +SCHEMAP_P_PROPS_CORRECT_2_2=3044 +SCHEMAP_E_PROPS_CORRECT_2=3045 +SCHEMAP_E_PROPS_CORRECT_3=3046 +SCHEMAP_E_PROPS_CORRECT_4=3047 +SCHEMAP_E_PROPS_CORRECT_5=3048 +SCHEMAP_E_PROPS_CORRECT_6=3049 +SCHEMAP_SRC_INCLUDE=3050 +SCHEMAP_SRC_ATTRIBUTE_1=3051 +SCHEMAP_SRC_ATTRIBUTE_2=3052 +SCHEMAP_SRC_ATTRIBUTE_3_1=3053 +SCHEMAP_SRC_ATTRIBUTE_3_2=3054 +SCHEMAP_SRC_ATTRIBUTE_4=3055 +SCHEMAP_NO_XMLNS=3056 +SCHEMAP_NO_XSI=3057 +SCHEMAP_COS_VALID_DEFAULT_1=3058 +SCHEMAP_COS_VALID_DEFAULT_2_1=3059 +SCHEMAP_COS_VALID_DEFAULT_2_2_1=3060 +SCHEMAP_COS_VALID_DEFAULT_2_2_2=3061 +SCHEMAP_CVC_SIMPLE_TYPE=3062 +SCHEMAP_COS_CT_EXTENDS_1_1=3063 +SCHEMAP_SRC_IMPORT_1_1=3064 +SCHEMAP_SRC_IMPORT_1_2=3065 +SCHEMAP_SRC_IMPORT_2=3066 +SCHEMAP_SRC_IMPORT_2_1=3067 +""", +"""\ +SCHEMAP_SRC_IMPORT_2_2=3068 +SCHEMAP_INTERNAL=3069 +SCHEMAP_NOT_DETERMINISTIC=3070 +SCHEMAP_SRC_ATTRIBUTE_GROUP_1=3071 +SCHEMAP_SRC_ATTRIBUTE_GROUP_2=3072 +SCHEMAP_SRC_ATTRIBUTE_GROUP_3=3073 +SCHEMAP_MG_PROPS_CORRECT_1=3074 +SCHEMAP_MG_PROPS_CORRECT_2=3075 +SCHEMAP_SRC_CT_1=3076 +SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3=3077 +SCHEMAP_AU_PROPS_CORRECT_2=3078 +SCHEMAP_A_PROPS_CORRECT_2=3079 +SCHEMAP_C_PROPS_CORRECT=3080 +SCHEMAP_SRC_REDEFINE=3081 +SCHEMAP_SRC_IMPORT=3082 +SCHEMAP_WARN_SKIP_SCHEMA=3083 +SCHEMAP_WARN_UNLOCATED_SCHEMA=3084 +SCHEMAP_WARN_ATTR_REDECL_PROH=3085 +SCHEMAP_WARN_ATTR_POINTLESS_PROH=3086 +SCHEMAP_AG_PROPS_CORRECT=3087 +SCHEMAP_COS_CT_EXTENDS_1_2=3088 +SCHEMAP_AU_PROPS_CORRECT=3089 +SCHEMAP_A_PROPS_CORRECT_3=3090 +SCHEMAP_COS_ALL_LIMITED=3091 +MODULE_OPEN=4900 +MODULE_CLOSE=4901 +CHECK_FOUND_ELEMENT=5000 +CHECK_FOUND_ATTRIBUTE=5001 +CHECK_FOUND_TEXT=5002 +CHECK_FOUND_CDATA=5003 +CHECK_FOUND_ENTITYREF=5004 +CHECK_FOUND_ENTITY=5005 +CHECK_FOUND_PI=5006 +CHECK_FOUND_COMMENT=5007 +CHECK_FOUND_DOCTYPE=5008 +CHECK_FOUND_FRAGMENT=5009 +CHECK_FOUND_NOTATION=5010 +CHECK_UNKNOWN_NODE=5011 +CHECK_ENTITY_TYPE=5012 +CHECK_NO_PARENT=5013 +CHECK_NO_DOC=5014 +CHECK_NO_NAME=5015 +CHECK_NO_ELEM=5016 +CHECK_WRONG_DOC=5017 +CHECK_NO_PREV=5018 +CHECK_WRONG_PREV=5019 +CHECK_NO_NEXT=5020 +CHECK_WRONG_NEXT=5021 +CHECK_NOT_DTD=5022 +CHECK_NOT_ATTR=5023 +CHECK_NOT_ATTR_DECL=5024 +CHECK_NOT_ELEM_DECL=5025 +CHECK_NOT_ENTITY_DECL=5026 +CHECK_NOT_NS_DECL=5027 +CHECK_NO_HREF=5028 +CHECK_WRONG_PARENT=5029 +CHECK_NS_SCOPE=5030 +CHECK_NS_ANCESTOR=5031 +CHECK_NOT_UTF8=5032 +CHECK_NO_DICT=5033 +CHECK_NOT_NCNAME=5034 +CHECK_OUTSIDE_DICT=5035 +CHECK_WRONG_NAME=5036 +CHECK_NAME_NOT_NULL=5037 +I18N_NO_NAME=6000 +I18N_NO_HANDLER=6001 +I18N_EXCESS_HANDLER=6002 +I18N_CONV_FAILED=6003 +I18N_NO_OUTPUT=6004 +CHECK_=6005 +CHECK_X=6006 +""",) # --- END: GENERATED CONSTANTS --- __initErrorConstants() Modified: lxml/branch/lxml-1.0/src/lxml/xpath.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xpath.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xpath.pxi Sun Jun 4 17:28:35 2006 @@ -47,7 +47,7 @@ cdef void _setupDict(xpath.xmlXPathContext* xpathCtxt): __GLOBAL_PARSER_CONTEXT._initXPathParserDict(xpathCtxt) -cdef class XPathEvaluatorBase: +cdef class _XPathEvaluatorBase: cdef xpath.xmlXPathContext* _xpathCtxt cdef _XPathContext _context @@ -58,6 +58,17 @@ if self._xpathCtxt is not NULL: xpath.xmlXPathFreeContext(self._xpathCtxt) + def evaluate(self, _eval_arg, **_variables): + """Evaluate an XPath expression. + + Instead of calling this method, you can also call the evaluator object + itself. + + Variables may be provided as keyword arguments. Note that namespaces + are currently not supported for variables. + """ + return self(_eval_arg, **_variables) + cdef int _checkAbsolutePath(self, char* path): cdef char c if path is NULL: @@ -97,7 +108,7 @@ return result -cdef class XPathElementEvaluator(XPathEvaluatorBase): +cdef class XPathElementEvaluator(_XPathEvaluatorBase): """Create an XPath evaluator for an element. Absolute XPath expressions (starting with '/') will be evaluated against @@ -117,7 +128,7 @@ raise XPathContextError, "Unable to create new XPath context" _setupDict(xpathCtxt) self._element = element - XPathEvaluatorBase.__init__(self, namespaces, extensions) + _XPathEvaluatorBase.__init__(self, namespaces, extensions) def registerNamespace(self, prefix, uri): """Register a namespace with the XPath context. @@ -131,7 +142,7 @@ for prefix, uri in namespaces.items(): add(prefix, uri) - def evaluate(self, _path, **_variables): + def __call__(self, _path, **_variables): """Evaluate an XPath expression on the document. Variables may be provided as keyword arguments. Note that namespaces @@ -168,7 +179,7 @@ XPathElementEvaluator.__init__( self, etree._context_node, namespaces, extensions) - def evaluate(self, _path, **_variables): + def __call__(self, _path, **_variables): """Evaluate an XPath expression on the document. Variables may be provided as keyword arguments. Note that namespaces @@ -197,7 +208,10 @@ def XPathEvaluator(etree_or_element, namespaces=None, extensions=None): - """Creates and XPath evaluator for an ElementTree or an Element. + """Creates an XPath evaluator for an ElementTree or an Element. + + The resulting object can be called with an XPath expression as argument + and XPath variables provided as keyword arguments. XPath evaluators must not be shared between threads. """ @@ -207,20 +221,25 @@ return XPathElementEvaluator(etree_or_element, namespaces, extensions) -cdef class XPath(XPathEvaluatorBase): +cdef class XPath(_XPathEvaluatorBase): + """A compiled XPath expression that can be called on Elements and + ElementTrees. + + Besides the XPath expression, you can pass namespace mappings and + extensions to the constructor through the keyword arguments ``namespaces`` + and ``extensions``. + """ cdef xpath.xmlXPathCompExpr* _xpath cdef readonly object path def __init__(self, path, namespaces=None, extensions=None): - cdef char* c_path - XPathEvaluatorBase.__init__(self, namespaces, extensions, None) + _XPathEvaluatorBase.__init__(self, namespaces, extensions) self._xpath = NULL self.path = path path = _utf8(path) - c_path = _cstr(path) self._xpathCtxt = xpath.xmlXPathNewContext(NULL) _setupDict(self._xpathCtxt) - self._xpath = xpath.xmlXPathCtxtCompile(self._xpathCtxt, c_path) + self._xpath = xpath.xmlXPathCtxtCompile(self._xpathCtxt, _cstr(path)) if self._xpath is NULL: self._raise_parse_error() @@ -235,7 +254,7 @@ element = _rootNodeOrRaise(_etree_or_element) xpathCtxt = self._xpathCtxt - xpathCtxt.doc = document._c_doc + xpathCtxt.doc = document._c_doc xpathCtxt.node = element._c_node context = self._context @@ -247,9 +266,6 @@ context.unregister_context() return self._handle_result(xpathObj, document) - def evaluate(self, _tree, **_variables): - return self(_tree, **_variables) - def __dealloc__(self): if self._xpath is not NULL: xpath.xmlXPathFreeCompExpr(self._xpath) Modified: lxml/branch/lxml-1.0/src/lxml/xslt.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xslt.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xslt.pxi Sun Jun 4 17:28:35 2006 @@ -453,7 +453,7 @@ self._compile_map = {} cdef _make_string(self, value): - if python.PyString_Check(value) or python.PyUnicode_Check(value): + if _isString(value): return value else: raise TypeError, "Invalid argument type %s" % type(value) Modified: lxml/branch/lxml-1.0/update-error-constants.py ============================================================================== --- lxml/branch/lxml-1.0/update-error-constants.py (original) +++ lxml/branch/lxml-1.0/update-error-constants.py Sun Jun 4 17:28:35 2006 @@ -17,14 +17,20 @@ sys.path.insert(0, 'src') from lxml import etree +# map enum name to Python variable name and alignment for constant name ENUM_MAP = { - 'xmlErrorLevel' : '__ERROR_LEVELS', - 'xmlErrorDomain' : '__ERROR_DOMAINS', - 'xmlParserErrors' : '__ERROR_TYPES' + 'xmlErrorLevel' : ('__ERROR_LEVELS', 'XML_ERR_'), + 'xmlErrorDomain' : ('__ERROR_DOMAINS', 'XML_FROM_'), + 'xmlParserErrors' : ('__ERROR_TYPES', 'XML_') } ENUM_ORDER = ('xmlErrorLevel', 'xmlErrorDomain', 'xmlParserErrors') +COMMENT = """ +# This section is generated by the script '%s'. + +""" % os.path.basename(sys.argv[0]) + def split(lines): lines = iter(lines) pre = [] @@ -50,6 +56,7 @@ # write .pxi source file f = open(filename, 'w') f.write(''.join(pre)) + f.write(COMMENT) f.write('\n'.join(result)) f.write(''.join(post)) f.close() @@ -81,37 +88,52 @@ pxd_result = [] append_pxd = pxd_result.append +append_pxd('cdef extern from "libxml/xmlerror.h":') +append_pxi('''\ +# Constants are stored in tuples of strings, for which Pyrex generates very +# efficient setup code. To parse them, iterate over the tuples and parse each +# line in each string independently. +''') + ctypedef_indent = ' '*4 -constant_indent = ' '*8 +constant_indent = ctypedef_indent*2 -append_pxd('cdef extern from "libxml/xmlerror.h":') for enum_name in ENUM_ORDER: constants = enum_dict[enum_name] - pxi_name = ENUM_MAP[enum_name] + pxi_name, prefix = ENUM_MAP[enum_name] append_pxd(ctypedef_indent + 'ctypedef enum %s:' % enum_name) append_pxi('cdef object %s' % pxi_name) - append_pxi('%s = """\\' % pxi_name) - length = 0 + append_pxi('%s = ("""\\' % pxi_name) + + prefix_len = len(prefix) + length = 2 # each string ends with '\n\0' for name, val, descr in constants: if descr: - line = "%-50s = %7d # %s" % (name, val, descr) + line = '%-50s = %7d # %s' % (name, val, descr) else: - line = "%-50s = %7d" % (name, val) - + line = '%-50s = %7d' % (name, val) append_pxd(constant_indent + line) - if length + len(line) > 2000: # max string length in MSVC - append_pxi('""" + \\') + if name[:prefix_len] == prefix and len(name) > prefix_len: + name = name[prefix_len:] + line = '%s=%d' % (name, val) + if length + len(line) >= 2040: # max string length in MSVC is 2048 + append_pxi('""",') append_pxi('"""\\') - length = 0 + length = 2 # each string ends with '\n\0' append_pxi(line) - length += len(line) + 1 + length += len(line) + 2 # + '\n\0' append_pxd('') - append_pxi('"""') + append_pxi('""",)') append_pxi('') # write source files +print "Updating file", BUILD_SOURCE_FILE regenerate_file(BUILD_SOURCE_FILE, pxi_result) + +print "Updating file", BUILD_DEF_FILE regenerate_file(BUILD_DEF_FILE, pxd_result) + +print "Done" Modified: lxml/branch/lxml-1.0/version.txt ============================================================================== --- lxml/branch/lxml-1.0/version.txt (original) +++ lxml/branch/lxml-1.0/version.txt Sun Jun 4 17:28:35 2006 @@ -1 +1 @@ -1.0 +1.0.1 From scoder at codespeak.net Sun Jun 4 18:03:05 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 18:03:05 +0200 (CEST) Subject: [Lxml-checkins] r28281 - lxml/trunk/src/lxml Message-ID: <20060604160305.66B2F10070@code0.codespeak.net> Author: scoder Date: Sun Jun 4 18:03:04 2006 New Revision: 28281 Modified: lxml/trunk/src/lxml/etree.pyx Log: made Python imports local to the module to reduce namespace polution in etree module Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sun Jun 4 18:03:04 2006 @@ -6,18 +6,23 @@ cimport xinclude cimport c14n cimport cstd -import re import __builtin__ cdef object True cdef object False True = __builtin__.True False = __builtin__.False +del __builtin__ +cdef object _elementpath import _elementpath -from StringIO import StringIO + +cdef object sys import sys +cdef object re +import re + # the rules # any libxml C argument/variable is prefixed with c_ # any non-public function/class is prefixed with an underscore @@ -47,7 +52,11 @@ def initThread(): """Must be called by each newly created thread before calling any API - functions.""" + functions. + + Note that lxml.etree does not currently release the GIL, so there are no + performance gains to be expected from using threads. + """ #_initThreadLogging() pass From scoder at codespeak.net Sun Jun 4 21:18:55 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 21:18:55 +0200 (CEST) Subject: [Lxml-checkins] r28290 - lxml/trunk/src/lxml Message-ID: <20060604191855.DE9E51006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 21:18:54 2006 New Revision: 28290 Modified: lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/python.pxd Log: initial threading support in the parser Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sun Jun 4 21:18:54 2006 @@ -185,12 +185,15 @@ cdef _InputDocument doc_ref cdef _FileParserContext file_context cdef xmlparser.xmlParserInput* c_input + cdef python.PyGILState_STATE gil_state if c_context._private is NULL or \ not isinstance(c_context._private, _ResolverContext): if __DEFAULT_ENTITY_LOADER is NULL: return NULL return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) + gil_state = python.PyGILState_Ensure() + print "LOADING" try: if c_url is NULL: url = None @@ -205,7 +208,10 @@ doc_ref = context._resolvers.resolve(url, pubid, context) except Exception: context._store_raised() + python.PyGILState_Release(gil_state) return NULL + print "LOADED" + python.PyGILState_Release(gil_state) if doc_ref is None: if __DEFAULT_ENTITY_LOADER is NULL: @@ -344,16 +350,21 @@ cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover + cdef python.PyThreadState* state self._error_log.connect() pctxt = self._parser_ctxt __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + print ">>START" + state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: result = htmlparser.htmlCtxtReadFile( pctxt, c_filename, NULL, self._parse_options) else: result = xmlparser.xmlCtxtReadFile( pctxt, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) + print ">>DONE" self._error_log.disconnect() recover = self._parse_options & xmlparser.XML_PARSE_RECOVER Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sun Jun 4 21:18:54 2006 @@ -2,6 +2,7 @@ cdef extern from "Python.h": ctypedef struct PyObject + ctypedef struct PyThreadState ctypedef int size_t ctypedef int Py_ssize_t cdef int INT_MAX @@ -56,6 +57,15 @@ cdef void* PyMem_Malloc(size_t size) cdef void PyMem_Free(void* p) + ctypedef enum PyGILState_STATE: + PyGILState_LOCKED + PyGILState_UNLOCKED + + cdef PyGILState_STATE PyGILState_Ensure() + cdef void PyGILState_Release(PyGILState_STATE state) + cdef PyThreadState* PyEval_SaveThread() + cdef void PyEval_RestoreThread(PyThreadState* state) + cdef extern from "etree.h": # redefines some functions as macros cdef int _isString(object obj) cdef int isinstance(object instance, object classes) From scoder at codespeak.net Sun Jun 4 21:49:37 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 21:49:37 +0200 (CEST) Subject: [Lxml-checkins] r28291 - lxml/trunk/src/lxml Message-ID: <20060604194937.39C271006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 21:49:36 2006 New Revision: 28291 Modified: lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/python.pxd Log: reverted to start new branch instead (too experimental) Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sun Jun 4 21:49:36 2006 @@ -185,15 +185,12 @@ cdef _InputDocument doc_ref cdef _FileParserContext file_context cdef xmlparser.xmlParserInput* c_input - cdef python.PyGILState_STATE gil_state if c_context._private is NULL or \ not isinstance(c_context._private, _ResolverContext): if __DEFAULT_ENTITY_LOADER is NULL: return NULL return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) - gil_state = python.PyGILState_Ensure() - print "LOADING" try: if c_url is NULL: url = None @@ -208,10 +205,7 @@ doc_ref = context._resolvers.resolve(url, pubid, context) except Exception: context._store_raised() - python.PyGILState_Release(gil_state) return NULL - print "LOADED" - python.PyGILState_Release(gil_state) if doc_ref is None: if __DEFAULT_ENTITY_LOADER is NULL: @@ -350,21 +344,16 @@ cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover - cdef python.PyThreadState* state self._error_log.connect() pctxt = self._parser_ctxt __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - print ">>START" - state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: result = htmlparser.htmlCtxtReadFile( pctxt, c_filename, NULL, self._parse_options) else: result = xmlparser.xmlCtxtReadFile( pctxt, c_filename, NULL, self._parse_options) - python.PyEval_RestoreThread(state) - print ">>DONE" self._error_log.disconnect() recover = self._parse_options & xmlparser.XML_PARSE_RECOVER Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sun Jun 4 21:49:36 2006 @@ -2,7 +2,6 @@ cdef extern from "Python.h": ctypedef struct PyObject - ctypedef struct PyThreadState ctypedef int size_t ctypedef int Py_ssize_t cdef int INT_MAX @@ -57,15 +56,6 @@ cdef void* PyMem_Malloc(size_t size) cdef void PyMem_Free(void* p) - ctypedef enum PyGILState_STATE: - PyGILState_LOCKED - PyGILState_UNLOCKED - - cdef PyGILState_STATE PyGILState_Ensure() - cdef void PyGILState_Release(PyGILState_STATE state) - cdef PyThreadState* PyEval_SaveThread() - cdef void PyEval_RestoreThread(PyThreadState* state) - cdef extern from "etree.h": # redefines some functions as macros cdef int _isString(object obj) cdef int isinstance(object instance, object classes) From scoder at codespeak.net Sun Jun 4 21:50:09 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 21:50:09 +0200 (CEST) Subject: [Lxml-checkins] r28292 - lxml/branch/threading Message-ID: <20060604195009.82CBA1006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 21:50:08 2006 New Revision: 28292 Added: lxml/branch/threading/ - copied from r28291, lxml/trunk/ Log: branch for threading experiments From scoder at codespeak.net Sun Jun 4 22:19:11 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 4 Jun 2006 22:19:11 +0200 (CEST) Subject: [Lxml-checkins] r28293 - lxml/branch/threading/src/lxml Message-ID: <20060604201911.5FC451006F@code0.codespeak.net> Author: scoder Date: Sun Jun 4 22:19:09 2006 New Revision: 28293 Modified: lxml/branch/threading/src/lxml/parser.pxi lxml/branch/threading/src/lxml/python.pxd lxml/branch/threading/src/lxml/xslt.pxi Log: initial implementation (buggy) Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Sun Jun 4 22:19:09 2006 @@ -138,6 +138,8 @@ cdef xmlDoc* _readDoc(self, xmlParserCtxt* ctxt, int options, LxmlParserType parser_type): + cdef python.PyThreadState* state + state = python.PyEval_SaveThread() if parser_type == LXML_XML_PARSER: return xmlparser.xmlCtxtReadIO( ctxt, _readFilelikeParser, NULL, self, @@ -146,12 +148,15 @@ return htmlparser.htmlCtxtReadIO( ctxt, _readFilelikeParser, NULL, self, self._c_url, NULL, options) + python.PyEval_RestoreThread(state) cdef int copyToBuffer(self, char* c_buffer, int c_size): cdef char* c_start cdef Py_ssize_t byte_count, remaining + cdef python.PyGILState_STATE gil_state if self._bytes_read < 0: return 0 + gil_state = python.PyGILState_Ensure() try: byte_count = python.PyString_GET_SIZE(self._bytes_utf) remaining = byte_count - self._bytes_read @@ -165,11 +170,13 @@ if c_size > remaining: c_size = remaining c_start = _cstr(self._bytes_utf) + self._bytes_read + python.PyGILState_Release(gil_state) self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size except Exception: self._exc_context._store_raised() + python.PyGILState_Release(gil_state) return -1 cdef int _readFilelikeParser(void* ctxt, char* c_buffer, int c_size): @@ -185,12 +192,14 @@ cdef _InputDocument doc_ref cdef _FileParserContext file_context cdef xmlparser.xmlParserInput* c_input + cdef python.PyGILState_STATE gil_state if c_context._private is NULL or \ not isinstance(c_context._private, _ResolverContext): if __DEFAULT_ENTITY_LOADER is NULL: return NULL return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) + gil_state = python.PyGILState_Ensure() try: if c_url is NULL: url = None @@ -205,7 +214,9 @@ doc_ref = context._resolvers.resolve(url, pubid, context) except Exception: context._store_raised() + python.PyGILState_Release(gil_state) return NULL + python.PyGILState_Release(gil_state) if doc_ref is None: if __DEFAULT_ENTITY_LOADER is NULL: @@ -290,6 +301,7 @@ cdef Py_ssize_t py_buffer_len cdef int buffer_len cdef char* c_text + cdef python.PyThreadState* state py_buffer_len = python.PyUnicode_GET_DATA_SIZE(utext) if py_buffer_len > python.INT_MAX: text_utf = _utf8(utext) @@ -302,6 +314,7 @@ __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) c_text = python.PyUnicode_AS_DATA(utext) + state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: result = htmlparser.htmlCtxtReadMemory( pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, @@ -310,6 +323,7 @@ result = xmlparser.xmlCtxtReadMemory( pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, self._parse_options) + python.PyEval_RestoreThread(state) self._error_log.disconnect() recover = self._parse_options & xmlparser.XML_PARSE_RECOVER @@ -321,6 +335,7 @@ """ cdef xmlDoc* result cdef xmlParserCtxt* pctxt + cdef python.PyThreadState* state cdef int recover if c_len > python.INT_MAX: raise ParserError, "string is too long to parse it with libxml2" @@ -329,12 +344,14 @@ pctxt = self._parser_ctxt __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: result = htmlparser.htmlCtxtReadMemory( pctxt, c_text, c_len, c_filename, NULL, self._parse_options) else: result = xmlparser.xmlCtxtReadMemory( pctxt, c_text, c_len, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) self._error_log.disconnect() recover = self._parse_options & xmlparser.XML_PARSE_RECOVER @@ -344,16 +361,19 @@ cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover + cdef python.PyThreadState* state self._error_log.connect() pctxt = self._parser_ctxt __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: result = htmlparser.htmlCtxtReadFile( pctxt, c_filename, NULL, self._parse_options) else: result = xmlparser.xmlCtxtReadFile( pctxt, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) self._error_log.disconnect() recover = self._parse_options & xmlparser.XML_PARSE_RECOVER Modified: lxml/branch/threading/src/lxml/python.pxd ============================================================================== --- lxml/branch/threading/src/lxml/python.pxd (original) +++ lxml/branch/threading/src/lxml/python.pxd Sun Jun 4 22:19:09 2006 @@ -2,6 +2,7 @@ cdef extern from "Python.h": ctypedef struct PyObject + ctypedef struct PyThreadState ctypedef int size_t ctypedef int Py_ssize_t cdef int INT_MAX @@ -56,6 +57,15 @@ cdef void* PyMem_Malloc(size_t size) cdef void PyMem_Free(void* p) + ctypedef enum PyGILState_STATE: + PyGILState_LOCKED + PyGILState_UNLOCKED + + cdef PyGILState_STATE PyGILState_Ensure() + cdef void PyGILState_Release(PyGILState_STATE state) + cdef PyThreadState* PyEval_SaveThread() + cdef void PyEval_RestoreThread(PyThreadState* state) + cdef extern from "etree.h": # redefines some functions as macros cdef int _isString(object obj) cdef int isinstance(object instance, object classes) Modified: lxml/branch/threading/src/lxml/xslt.pxi ============================================================================== --- lxml/branch/threading/src/lxml/xslt.pxi (original) +++ lxml/branch/threading/src/lxml/xslt.pxi Sun Jun 4 22:19:09 2006 @@ -57,6 +57,7 @@ cdef _XSLTResolverContext doc_resolver_context cdef _XSLTResolverContext resolver_context cdef XMLParser parser + cdef python.PyGILState_STATE gil_state # find resolver contexts of stylesheet and transformed doc c_doc = NULL doc_resolver_context = None @@ -84,6 +85,7 @@ return _copyDoc(c_doc, 1) # call the Python document loaders + gil_state = python.PyGILState_Ensure() c_doc = NULL resolver_context = xslt_resolver_context # currently use only XSLT resolvers resolvers = resolver_context._resolvers @@ -112,6 +114,7 @@ except Exception, e: xslt_resolver_context._store_raised() + python.PyGILState_Release(gil_state) return NULL if c_doc is NULL: @@ -124,7 +127,9 @@ else: exception = XSLTParseError(message) xslt_resolver_context._store_exception(exception) + python.PyGILState_Release(gil_state) return NULL + python.PyGILState_Release(gil_state) if c_doc is not NULL and c_doc._private is NULL: c_doc._private = xslt_resolver_context return c_doc From scoder at codespeak.net Mon Jun 5 08:53:02 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 08:53:02 +0200 (CEST) Subject: [Lxml-checkins] r28296 - lxml/trunk/doc Message-ID: <20060605065302.AD91510063@code0.codespeak.net> Author: scoder Date: Mon Jun 5 08:53:01 2006 New Revision: 28296 Modified: lxml/trunk/doc/build.txt Log: doc updates Modified: lxml/trunk/doc/build.txt ============================================================================== --- lxml/trunk/doc/build.txt (original) +++ lxml/trunk/doc/build.txt Mon Jun 5 08:53:01 2006 @@ -56,6 +56,10 @@ If you then place lxml's ``src`` directory on your PYTHONPATH somehow, you can import ``lxml.etree`` and play with it. +To recompile after changes, note that you may have to run ``make clean`` or +delete the file ``src/lxml/etree.c``. Distutils do not automatically pick up +changes that affect files other than the main file ``src/lxml/etree.pyx``. + Running the tests and reporting errors -------------------------------------- From scoder at codespeak.net Mon Jun 5 09:05:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 09:05:31 +0200 (CEST) Subject: [Lxml-checkins] r28297 - lxml/trunk/src/lxml Message-ID: <20060605070531.194E710063@code0.codespeak.net> Author: scoder Date: Mon Jun 5 09:05:30 2006 New Revision: 28297 Modified: lxml/trunk/src/lxml/parser.pxi Log: be more conservative in storing temporary references for the parser Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Mon Jun 5 09:05:30 2006 @@ -217,13 +217,14 @@ if doc_ref._type == PARSER_DATA_STRING: data = doc_ref._data_utf c_input = xmlparser.xmlNewStringInputStream( - c_context, _cstr(doc_ref._data_utf)) + c_context, _cstr(data)) elif doc_ref._type == PARSER_DATA_FILENAME: c_input = xmlparser.xmlNewInputFromFile( c_context, _cstr(doc_ref._data_utf)) elif doc_ref._type == PARSER_DATA_FILE: file_context = _FileParserContext(doc_ref._file, context) c_input = file_context._createParserInput(c_context) + data = file_context if data is not None: context._storage.add(data) From scoder at codespeak.net Mon Jun 5 09:08:20 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 09:08:20 +0200 (CEST) Subject: [Lxml-checkins] r28298 - lxml/branch/threading/src/lxml Message-ID: <20060605070820.3CFDC10063@code0.codespeak.net> Author: scoder Date: Mon Jun 5 09:08:18 2006 New Revision: 28298 Modified: lxml/branch/threading/src/lxml/parser.pxi lxml/branch/threading/src/lxml/python.pxd Log: use per-thread parser dictionaries Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Mon Jun 5 09:08:18 2006 @@ -25,38 +25,59 @@ if self._c_dict is not NULL: xmlparser.xmlDictFree(self._c_dict) + cdef _ParserContext _findThreadParserContext(self): + "Find the _ParserContext for the current thread" + cdef python.PyObject* thread_dict + cdef python.PyObject* result + thread_dict = python.PyThreadState_GetDict() + if thread_dict is NULL: + return self + result = python.PyDict_GetItem(thread_dict, "_ParserContext") + if result is not NULL: + context = result + else: + context = _ParserContext() + python.PyDict_SetItem(thread_dict, "_ParserContext", context) + return context + cdef void _initParserDict(self, xmlParserCtxt* pctxt): "Assure we always use the same string dictionary." - if self._c_dict is NULL or self._c_dict is pctxt.dict: + cdef _ParserContext context + context = self._findThreadParserContext() + if context._c_dict is NULL or context._c_dict is pctxt.dict: return if pctxt.dict is not NULL: xmlparser.xmlDictFree(pctxt.dict) - pctxt.dict = self._c_dict + pctxt.dict = context._c_dict xmlparser.xmlDictReference(pctxt.dict) cdef void _initXPathParserDict(self, xpath.xmlXPathContext* pctxt): "Assure we always use the same string dictionary." - if self._c_dict is NULL or self._c_dict is pctxt.dict: + cdef _ParserContext context + context = self._findThreadParserContext() + if context._c_dict is NULL or context._c_dict is pctxt.dict: return if pctxt.dict is not NULL: xmlparser.xmlDictFree(pctxt.dict) - pctxt.dict = self._c_dict + pctxt.dict = context._c_dict xmlparser.xmlDictReference(pctxt.dict) cdef void _initDocDict(self, xmlDoc* result): "Store dict of last object parsed if no shared dict yet" + cdef _ParserContext context if result is NULL: return - if self._c_dict is NULL: + context = self._findThreadParserContext() + if context._c_dict is NULL: #print "storing shared dict" if result.dict is NULL: result.dict = xmlparser.xmlDictCreate() self._c_dict = result.dict - xmlparser.xmlDictReference(self._c_dict) - elif result.dict != self._c_dict: + xmlparser.xmlDictReference(context._c_dict) + elif result.dict != context._c_dict: if result.dict is not NULL: xmlparser.xmlDictFree(result.dict) - result.dict = self._c_dict + result.dict = context._c_dict xmlparser.xmlDictReference(result.dict) cdef _ParserContext __GLOBAL_PARSER_CONTEXT Modified: lxml/branch/threading/src/lxml/python.pxd ============================================================================== --- lxml/branch/threading/src/lxml/python.pxd (original) +++ lxml/branch/threading/src/lxml/python.pxd Mon Jun 5 09:08:18 2006 @@ -65,6 +65,7 @@ cdef void PyGILState_Release(PyGILState_STATE state) cdef PyThreadState* PyEval_SaveThread() cdef void PyEval_RestoreThread(PyThreadState* state) + cdef PyObject* PyThreadState_GetDict() cdef extern from "etree.h": # redefines some functions as macros cdef int _isString(object obj) From scoder at codespeak.net Mon Jun 5 09:13:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 09:13:10 +0200 (CEST) Subject: [Lxml-checkins] r28299 - lxml/branch/threading/src/lxml Message-ID: <20060605071310.2A0BC1006F@code0.codespeak.net> Author: scoder Date: Mon Jun 5 09:13:09 2006 New Revision: 28299 Modified: lxml/branch/threading/src/lxml/xmlerror.pxi Log: serialize concurrent error logging Modified: lxml/branch/threading/src/lxml/xmlerror.pxi ============================================================================== --- lxml/branch/threading/src/lxml/xmlerror.pxi (original) +++ lxml/branch/threading/src/lxml/xmlerror.pxi Mon Jun 5 09:13:09 2006 @@ -298,14 +298,18 @@ # local log function: forward error to logger object cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error): cdef _ErrorLog log_handler + cdef python.PyGILState_STATE gil_state if __DEBUG != 0: + gil_state = python.PyGILState_Ensure() if c_log_handler is not NULL: log_handler = <_ErrorLog>c_log_handler else: log_handler = __GLOBAL_ERROR_LOG log_handler._receive(error) + python.PyGILState_Release(gil_state) cdef void _receiveGenericError(void* c_log_handler, char* msg, ...): + cdef python.PyGILState_STATE gil_state cdef cstd.va_list args cdef _ErrorLog log_handler cdef char* c_text @@ -314,11 +318,6 @@ cdef int c_line if __DEBUG == 0 or msg == NULL or cstd.strlen(msg) < 10: return - if c_log_handler is not NULL: - log_handler = <_ErrorLog>c_log_handler - else: - log_handler = __GLOBAL_ERROR_LOG - cstd.va_start(args, msg) if cstd.strncmp(msg, '%s:', 3) == 0: c_text = cstd.va_charptr(args) @@ -338,6 +337,7 @@ c_element = NULL cstd.va_end(args) + gil_state = python.PyGILState_Ensure() try: if c_text is NULL: message = None @@ -360,10 +360,16 @@ except UnicodeDecodeError: filename = "" + if c_log_handler is not NULL: + log_handler = <_ErrorLog>c_log_handler + else: + log_handler = __GLOBAL_ERROR_LOG + log_handler._receiveGeneric(xmlerror.XML_FROM_XSLT, xmlerror.XML_ERR_OK, xmlerror.XML_ERR_ERROR, c_line, message, filename) + python.PyGILState_Release(gil_state) # dummy function: no debug output at all cdef void _nullGenericErrorFunc(void* ctxt, char* msg, ...): From scoder at codespeak.net Mon Jun 5 09:19:05 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 09:19:05 +0200 (CEST) Subject: [Lxml-checkins] r28300 - lxml/branch/threading/src/lxml Message-ID: <20060605071905.4AB1A1006F@code0.codespeak.net> Author: scoder Date: Mon Jun 5 09:19:04 2006 New Revision: 28300 Modified: lxml/branch/threading/src/lxml/xslt.pxi Log: avoid calling Python in XSLT before locking the GIL Modified: lxml/branch/threading/src/lxml/xslt.pxi ============================================================================== --- lxml/branch/threading/src/lxml/xslt.pxi (original) +++ lxml/branch/threading/src/lxml/xslt.pxi Mon Jun 5 09:19:04 2006 @@ -64,14 +64,14 @@ if c_type == xslt.XSLT_LOAD_DOCUMENT: c_doc = (c_ctxt).document.doc if c_doc is not NULL and c_doc._private is not NULL: - if isinstance(c_doc._private, _XSLTResolverContext): - doc_resolver_context = <_XSLTResolverContext>c_doc._private + #if isinstance(c_doc._private, _XSLTResolverContext): + doc_resolver_context = <_XSLTResolverContext>c_doc._private c_doc = (c_ctxt).style.doc elif c_type == xslt.XSLT_LOAD_STYLESHEET: c_doc = (c_ctxt).doc - if c_doc is NULL or c_doc._private is NULL or \ - not isinstance(c_doc._private, _XSLTResolverContext): + if c_doc is NULL or c_doc._private is NULL: + #or not isinstance(c_doc._private, _XSLTResolverContext): # can't call Python without context, fall back to default loader return XSLT_DOC_DEFAULT_LOADER( c_uri, c_dict, parse_options, c_ctxt, c_type) From scoder at codespeak.net Mon Jun 5 09:54:39 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 09:54:39 +0200 (CEST) Subject: [Lxml-checkins] r28302 - lxml/branch/threading/src/lxml Message-ID: <20060605075439.14BE81006F@code0.codespeak.net> Author: scoder Date: Mon Jun 5 09:54:37 2006 New Revision: 28302 Modified: lxml/branch/threading/src/lxml/etree.pyx lxml/branch/threading/src/lxml/parser.pxi Log: per-thread default parsers Modified: lxml/branch/threading/src/lxml/etree.pyx ============================================================================== --- lxml/branch/threading/src/lxml/etree.pyx (original) +++ lxml/branch/threading/src/lxml/etree.pyx Mon Jun 5 09:54:37 2006 @@ -299,7 +299,7 @@ result._c_doc = c_doc result._ns_counter = 0 if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() result._parser = parser.copy() return result Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Mon Jun 5 09:54:37 2006 @@ -18,6 +18,7 @@ """Global parser context to share the string dictionary. """ cdef xmlDict* _c_dict + cdef _BaseParser _default_parser def __init__(self): self._c_dict = NULL @@ -40,6 +41,20 @@ python.PyDict_SetItem(thread_dict, "_ParserContext", context) return context + cdef void _setDefaultParser(self, _BaseParser parser): + cdef _ParserContext context + context = self._findThreadParserContext() + context._default_parser = parser + + cdef _BaseParser _getDefaultParser(self): + cdef _ParserContext context + context = self._findThreadParserContext() + if context._default_parser is not None: + return context._default_parser + else: + context._default_parser = self._default_parser.copy() + return context._default_parser + cdef void _initParserDict(self, xmlParserCtxt* pctxt): "Assure we always use the same string dictionary." cdef _ParserContext context @@ -567,27 +582,24 @@ cdef XMLParser __DEFAULT_XML_PARSER __DEFAULT_XML_PARSER = XMLParser() -cdef _BaseParser __DEFAULT_PARSER -__DEFAULT_PARSER = __DEFAULT_XML_PARSER +__GLOBAL_PARSER_CONTEXT._setDefaultParser(__DEFAULT_XML_PARSER) def set_default_parser(_BaseParser parser=None): - """Set a default parser. This parser is used globally whenever no parser - is supplied to the various parse functions of the lxml API. If this - function is called without a parser (or if it is None), the default parser - is reset to the original configuration. - - Note that the default parser is not thread-safe. Avoid the default parser - in multi-threaded environments. You can create a separate parser for each - thread explicitly or use a parser pool. + """Set a default parser for the current thread. This parser is used + globally whenever no parser is supplied to the various parse functions of + the lxml API. If this function is called without a parser (or if it is + None), the default parser is reset to the original configuration. + + Note that the pre-installed default parser is not thread-safe. Avoid the + default parser in multi-threaded environments. You can create a separate + parser for each thread explicitly or use a parser pool. """ - global __DEFAULT_PARSER if parser is None: - __DEFAULT_PARSER = __DEFAULT_XML_PARSER - else: - __DEFAULT_PARSER = parser + parser = __DEFAULT_XML_PARSER + __GLOBAL_PARSER_CONTEXT._setDefaultParser(parser) def get_default_parser(): - return __DEFAULT_PARSER + return __GLOBAL_PARSER_CONTEXT._getDefaultParser() ############################################################ ## HTML parser @@ -636,7 +648,7 @@ cdef char* c_text cdef Py_ssize_t c_len if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() if not filename: c_filename = NULL else: @@ -650,14 +662,14 @@ cdef xmlDoc* _parseDocFromFile(filename, _BaseParser parser) except NULL: if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() return (<_BaseParser>parser)._parseDocFromFile(_cstr(filename)) cdef xmlDoc* _parseDocFromFilelike(source, filename, _BaseParser parser) except NULL: cdef char* c_filename if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() if not filename: c_filename = NULL else: From scoder at codespeak.net Mon Jun 5 12:04:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 12:04:10 +0200 (CEST) Subject: [Lxml-checkins] r28313 - lxml/branch/threading/src/lxml Message-ID: <20060605100410.5377610053@code0.codespeak.net> Author: scoder Date: Mon Jun 5 12:04:08 2006 New Revision: 28313 Modified: lxml/branch/threading/src/lxml/etree.pyx lxml/branch/threading/src/lxml/parser.pxi lxml/branch/threading/src/lxml/xmlparser.pxd Log: lock each parser Modified: lxml/branch/threading/src/lxml/etree.pyx ============================================================================== --- lxml/branch/threading/src/lxml/etree.pyx (original) +++ lxml/branch/threading/src/lxml/etree.pyx Mon Jun 5 12:04:08 2006 @@ -23,6 +23,9 @@ cdef object re import re +cdef object thread +import thread + # the rules # any libxml C argument/variable is prefixed with c_ # any non-public function/class is prefixed with an underscore @@ -151,13 +154,14 @@ cdef _raise_if_stored(self): _exc_info = self._exc_info - if _exc_info is not None: - self._exc_info = None - type, value, traceback = _exc_info - if traceback is None and value is None: - raise type - else: - raise type, value, traceback + if _exc_info is None: + return + self._exc_info = None + type, value, traceback = _exc_info + if value is None and traceback is None: + raise type + else: + raise type, value, traceback cdef class _BaseParser # forward declaration Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Mon Jun 5 12:04:08 2006 @@ -33,12 +33,12 @@ thread_dict = python.PyThreadState_GetDict() if thread_dict is NULL: return self - result = python.PyDict_GetItem(thread_dict, "_ParserContext") + d = thread_dict + result = python.PyDict_GetItem(d, "_ParserContext") if result is not NULL: - context = result - else: - context = _ParserContext() - python.PyDict_SetItem(thread_dict, "_ParserContext", context) + return result + context = _ParserContext() + python.PyDict_SetItem(d, "_ParserContext", context) return context cdef void _setDefaultParser(self, _BaseParser parser): @@ -49,11 +49,11 @@ cdef _BaseParser _getDefaultParser(self): cdef _ParserContext context context = self._findThreadParserContext() - if context._default_parser is not None: - return context._default_parser - else: + if context._default_parser is None: + if self._default_parser is None: + self._default_parser = __DEFAULT_XML_PARSER.copy() context._default_parser = self._default_parser.copy() - return context._default_parser + return context._default_parser cdef void _initParserDict(self, xmlParserCtxt* pctxt): "Assure we always use the same string dictionary." @@ -86,8 +86,11 @@ if context._c_dict is NULL: #print "storing shared dict" if result.dict is NULL: - result.dict = xmlparser.xmlDictCreate() - self._c_dict = result.dict + if self._c_dict is NULL: + result.dict = xmlparser.xmlDictCreate() + else: + result.dict = xmlparser.xmlDictCreateSub(self._c_dict) + context._c_dict = result.dict xmlparser.xmlDictReference(context._c_dict) elif result.dict != context._c_dict: if result.dict is not NULL: @@ -210,8 +213,8 @@ self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size - except Exception: - self._exc_context._store_raised() + except Exception, e: + self._exc_context._store_exception(e) python.PyGILState_Release(gil_state) return -1 @@ -248,8 +251,8 @@ context = <_ResolverContext>c_context._private doc_ref = context._resolvers.resolve(url, pubid, context) - except Exception: - context._store_raised() + except Exception, e: + context._store_exception(e) python.PyGILState_Release(gil_state) return NULL python.PyGILState_Release(gil_state) @@ -269,8 +272,10 @@ c_input = xmlparser.xmlNewInputFromFile( c_context, _cstr(doc_ref._data_utf)) elif doc_ref._type == PARSER_DATA_FILE: + gil_state = python.PyGILState_Ensure() file_context = _FileParserContext(doc_ref._file, context) c_input = file_context._createParserInput(c_context) + python.PyGILState_Release(gil_state) if data is not None: context._storage.add(data) @@ -292,6 +297,8 @@ cdef _ResolverContext _context cdef LxmlParserType _parser_type cdef xmlParserCtxt* _parser_ctxt + cdef object _lockParser + cdef object _unlockParser def __init__(self): cdef xmlParserCtxt* pctxt @@ -306,6 +313,9 @@ self._parser_ctxt = pctxt if pctxt is NULL: raise ParserError, "Failed to create parser context" + lock = thread.allocate_lock() + self._lockParser = lock.acquire + self._unlockParser = lock.release self._error_log = _ErrorLog() self.resolvers = _ResolverRegistry() self._context = _ResolverContext(self.resolvers) @@ -331,13 +341,13 @@ cdef xmlDoc* _parseUnicodeDoc(self, utext, char* c_filename) except NULL: """Parse unicode document, share dictionary if possible. """ + cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover cdef Py_ssize_t py_buffer_len cdef int buffer_len cdef char* c_text - cdef python.PyThreadState* state py_buffer_len = python.PyUnicode_GET_DATA_SIZE(utext) if py_buffer_len > python.INT_MAX: text_utf = _utf8(utext) @@ -345,94 +355,109 @@ return self._parseDoc(_cstr(text_utf), py_buffer_len, c_filename) buffer_len = py_buffer_len - self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - c_text = python.PyUnicode_AS_DATA(utext) - state = python.PyEval_SaveThread() - if self._parser_type == LXML_HTML_PARSER: - result = htmlparser.htmlCtxtReadMemory( - pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, - self._parse_options) - else: - result = xmlparser.xmlCtxtReadMemory( - pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, - self._parse_options) - python.PyEval_RestoreThread(state) - - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, NULL, recover) + self._lockParser() + try: + self._error_log.connect() + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + + c_text = python.PyUnicode_AS_DATA(utext) + state = python.PyEval_SaveThread() + if self._parser_type == LXML_HTML_PARSER: + result = htmlparser.htmlCtxtReadMemory( + pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, + self._parse_options) + else: + result = xmlparser.xmlCtxtReadMemory( + pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, + self._parse_options) + python.PyEval_RestoreThread(state) + + self._error_log.disconnect() + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, NULL, recover) + finally: + self._unlockParser() cdef xmlDoc* _parseDoc(self, char* c_text, Py_ssize_t c_len, char* c_filename) except NULL: """Parse document, share dictionary if possible. """ + cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlParserCtxt* pctxt - cdef python.PyThreadState* state cdef int recover if c_len > python.INT_MAX: raise ParserError, "string is too long to parse it with libxml2" - self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - state = python.PyEval_SaveThread() - if self._parser_type == LXML_HTML_PARSER: - result = htmlparser.htmlCtxtReadMemory( - pctxt, c_text, c_len, c_filename, NULL, self._parse_options) - else: - result = xmlparser.xmlCtxtReadMemory( - pctxt, c_text, c_len, c_filename, NULL, self._parse_options) - python.PyEval_RestoreThread(state) - - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, NULL, recover) + self._lockParser() + try: + self._error_log.connect() + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + + state = python.PyEval_SaveThread() + if self._parser_type == LXML_HTML_PARSER: + result = htmlparser.htmlCtxtReadMemory( + pctxt, c_text, c_len, c_filename, NULL, self._parse_options) + else: + result = xmlparser.xmlCtxtReadMemory( + pctxt, c_text, c_len, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) + + self._error_log.disconnect() + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, NULL, recover) + finally: + self._unlockParser() cdef xmlDoc* _parseDocFromFile(self, char* c_filename) except NULL: + cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover - cdef python.PyThreadState* state - self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - state = python.PyEval_SaveThread() - if self._parser_type == LXML_HTML_PARSER: - result = htmlparser.htmlCtxtReadFile( - pctxt, c_filename, NULL, self._parse_options) - else: - result = xmlparser.xmlCtxtReadFile( - pctxt, c_filename, NULL, self._parse_options) - python.PyEval_RestoreThread(state) - - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, c_filename, recover) + self._lockParser() + try: + self._error_log.connect() + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + + state = python.PyEval_SaveThread() + if self._parser_type == LXML_HTML_PARSER: + result = htmlparser.htmlCtxtReadFile( + pctxt, c_filename, NULL, self._parse_options) + else: + result = xmlparser.xmlCtxtReadFile( + pctxt, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) + + self._error_log.disconnect() + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, c_filename, recover) + finally: + self._unlockParser() cdef xmlDoc* _parseDocFromFilelike(self, filelike, char* c_filename) except NULL: - # we read Python string, so we must convert to UTF-8 cdef _FileParserContext file_context cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover - self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - file_context = _FileParserContext(filelike, self._context) - result = file_context._readDoc( - pctxt, self._parse_options, self._parser_type) - - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, c_filename, recover) + self._lockParser() + try: + self._error_log.connect() + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + + file_context = _FileParserContext(filelike, self._context) + result = file_context._readDoc( + pctxt, self._parse_options, self._parser_type) + + self._error_log.disconnect() + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, c_filename, recover) + finally: + self._unlockParser() cdef _raiseParseError(xmlParserCtxt* ctxt, char* c_filename): if c_filename is not NULL and \ Modified: lxml/branch/threading/src/lxml/xmlparser.pxd ============================================================================== --- lxml/branch/threading/src/lxml/xmlparser.pxd (original) +++ lxml/branch/threading/src/lxml/xmlparser.pxd Mon Jun 5 12:04:08 2006 @@ -15,6 +15,7 @@ cdef extern from "libxml/parser.h": cdef xmlDict* xmlDictCreate() + cdef xmlDict* xmlDictCreateSub(xmlDict* subdict) cdef void xmlDictFree(xmlDict* sub) cdef int xmlDictReference(xmlDict* dict) From scoder at codespeak.net Mon Jun 5 12:13:46 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 12:13:46 +0200 (CEST) Subject: [Lxml-checkins] r28317 - lxml/branch/threading/src/lxml Message-ID: <20060605101346.2920710053@code0.codespeak.net> Author: scoder Date: Mon Jun 5 12:13:44 2006 New Revision: 28317 Modified: lxml/branch/threading/src/lxml/etree.pyx lxml/branch/threading/src/lxml/parser.pxi Log: allow 'import thread' to fail Modified: lxml/branch/threading/src/lxml/etree.pyx ============================================================================== --- lxml/branch/threading/src/lxml/etree.pyx (original) +++ lxml/branch/threading/src/lxml/etree.pyx Mon Jun 5 12:13:44 2006 @@ -24,7 +24,10 @@ import re cdef object thread -import thread +try: + import thread +except ImportError: + pass # the rules # any libxml C argument/variable is prefixed with c_ Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Mon Jun 5 12:13:44 2006 @@ -313,9 +313,13 @@ self._parser_ctxt = pctxt if pctxt is NULL: raise ParserError, "Failed to create parser context" - lock = thread.allocate_lock() - self._lockParser = lock.acquire - self._unlockParser = lock.release + if thread is None: + self._lockParser = self.__dummy + self._unlockParser = self.__dummy + else: + lock = thread.allocate_lock() + self._lockParser = lock.acquire + self._unlockParser = lock.release self._error_log = _ErrorLog() self.resolvers = _ResolverRegistry() self._context = _ResolverContext(self.resolvers) @@ -329,6 +333,9 @@ def __get__(self): return self._error_log.copy() + def __dummy(self): + pass + def copy(self): "Create a new parser with the same configuration." cdef _BaseParser parser From scoder at codespeak.net Mon Jun 5 12:20:32 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 12:20:32 +0200 (CEST) Subject: [Lxml-checkins] r28320 - lxml/branch/threading/src/lxml Message-ID: <20060605102032.4252010053@code0.codespeak.net> Author: scoder Date: Mon Jun 5 12:20:31 2006 New Revision: 28320 Modified: lxml/branch/threading/src/lxml/serializer.pxi Log: allow threads during string serialization Modified: lxml/branch/threading/src/lxml/serializer.pxi ============================================================================== --- lxml/branch/threading/src/lxml/serializer.pxi (original) +++ lxml/branch/threading/src/lxml/serializer.pxi Mon Jun 5 12:20:31 2006 @@ -3,6 +3,7 @@ cdef _tostring(_NodeBase element, encoding, int write_xml_declaration, int pretty_print): "Serialize an element to an encoded string representation of its XML tree." + cdef python.PyThreadState* state cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlBuffer* c_result_buffer cdef tree.xmlCharEncodingHandler* enchandler @@ -26,9 +27,11 @@ raise LxmlError, "Failed to create output buffer" try: + state = python.PyEval_SaveThread() _writeNodeToBuffer(c_buffer, element._c_node, c_enc, write_xml_declaration, pretty_print) tree.xmlOutputBufferFlush(c_buffer) + python.PyEval_RestoreThread(state) if c_buffer.conv is not NULL: c_result_buffer = c_buffer.conv else: @@ -42,6 +45,7 @@ cdef _tounicode(_NodeBase element, int pretty_print): "Serialize an element to the Python unicode representation of its XML tree." + cdef python.PyThreadState* state cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlBuffer* c_result_buffer if element is None: @@ -50,8 +54,10 @@ if c_buffer is NULL: raise LxmlError, "Failed to create output buffer" try: + state = python.PyEval_SaveThread() _writeNodeToBuffer(c_buffer, element._c_node, NULL, 0, pretty_print) tree.xmlOutputBufferFlush(c_buffer) + python.PyEval_RestoreThread(state) if c_buffer.conv is not NULL: c_result_buffer = c_buffer.conv else: From scoder at codespeak.net Mon Jun 5 16:17:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 16:17:13 +0200 (CEST) Subject: [Lxml-checkins] r28332 - lxml/branch/threading/src/lxml Message-ID: <20060605141713.DBAF710068@code0.codespeak.net> Author: scoder Date: Mon Jun 5 16:17:12 2006 New Revision: 28332 Modified: lxml/branch/threading/src/lxml/etree.pyx lxml/branch/threading/src/lxml/parser.pxi lxml/branch/threading/src/lxml/python.pxd Log: fix crash in file-like reading: did not restore thread state Modified: lxml/branch/threading/src/lxml/etree.pyx ============================================================================== --- lxml/branch/threading/src/lxml/etree.pyx (original) +++ lxml/branch/threading/src/lxml/etree.pyx Mon Jun 5 16:17:12 2006 @@ -152,15 +152,14 @@ cdef void _store_exception(self, exception): self._exc_info = (exception, None, None) - cdef _has_raised(self): + cdef int _has_raised(self): return self._exc_info is not None cdef _raise_if_stored(self): - _exc_info = self._exc_info - if _exc_info is None: + if self._exc_info is None: return + type, value, traceback = self._exc_info self._exc_info = None - type, value, traceback = _exc_info if value is None and traceback is None: raise type else: Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Mon Jun 5 16:17:12 2006 @@ -178,16 +178,18 @@ cdef xmlDoc* _readDoc(self, xmlParserCtxt* ctxt, int options, LxmlParserType parser_type): cdef python.PyThreadState* state + cdef xmlDoc* result state = python.PyEval_SaveThread() if parser_type == LXML_XML_PARSER: - return xmlparser.xmlCtxtReadIO( + result = xmlparser.xmlCtxtReadIO( ctxt, _readFilelikeParser, NULL, self, self._c_url, NULL, options) else: - return htmlparser.htmlCtxtReadIO( + result = htmlparser.htmlCtxtReadIO( ctxt, _readFilelikeParser, NULL, self, self._c_url, NULL, options) python.PyEval_RestoreThread(state) + return result cdef int copyToBuffer(self, char* c_buffer, int c_size): cdef char* c_start @@ -205,6 +207,7 @@ remaining = python.PyString_GET_SIZE(self._bytes_utf) if remaining == 0: self._bytes_read = -1 + python.PyGILState_Release(gil_state) return 0 if c_size > remaining: c_size = remaining Modified: lxml/branch/threading/src/lxml/python.pxd ============================================================================== --- lxml/branch/threading/src/lxml/python.pxd (original) +++ lxml/branch/threading/src/lxml/python.pxd Mon Jun 5 16:17:12 2006 @@ -56,6 +56,7 @@ cdef void* PyMem_Malloc(size_t size) cdef void PyMem_Free(void* p) + cdef PyObject* PyErr_Occurred() ctypedef enum PyGILState_STATE: PyGILState_LOCKED From scoder at codespeak.net Mon Jun 5 16:45:18 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 16:45:18 +0200 (CEST) Subject: [Lxml-checkins] r28333 - lxml/branch/threading/src/lxml Message-ID: <20060605144518.9A48610068@code0.codespeak.net> Author: scoder Date: Mon Jun 5 16:45:17 2006 New Revision: 28333 Modified: lxml/branch/threading/src/lxml/parser.pxi Log: fix _ParserContext init for main thread Modified: lxml/branch/threading/src/lxml/parser.pxi ============================================================================== --- lxml/branch/threading/src/lxml/parser.pxi (original) +++ lxml/branch/threading/src/lxml/parser.pxi Mon Jun 5 16:45:17 2006 @@ -19,13 +19,17 @@ """ cdef xmlDict* _c_dict cdef _BaseParser _default_parser - def __init__(self): - self._c_dict = NULL - def __dealloc__(self): if self._c_dict is not NULL: xmlparser.xmlDictFree(self._c_dict) + cdef void _initMainParserContext(self): + cdef python.PyObject* thread_dict + cdef python.PyObject* result + thread_dict = python.PyThreadState_GetDict() + if thread_dict is not NULL: + python.PyDict_SetItem(thread_dict, "_ParserContext", self) + cdef _ParserContext _findThreadParserContext(self): "Find the _ParserContext for the current thread" cdef python.PyObject* thread_dict @@ -100,6 +104,7 @@ cdef _ParserContext __GLOBAL_PARSER_CONTEXT __GLOBAL_PARSER_CONTEXT = _ParserContext() +__GLOBAL_PARSER_CONTEXT._initMainParserContext() ############################################################ ## support for Python unicode I/O @@ -317,6 +322,7 @@ if pctxt is NULL: raise ParserError, "Failed to create parser context" if thread is None: + # no threading self._lockParser = self.__dummy self._unlockParser = self.__dummy else: From scoder at codespeak.net Mon Jun 5 16:56:00 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 5 Jun 2006 16:56:00 +0200 (CEST) Subject: [Lxml-checkins] r28334 - lxml/branch/threading/src/lxml Message-ID: <20060605145600.6BFAC1006F@code0.codespeak.net> Author: scoder Date: Mon Jun 5 16:55:59 2006 New Revision: 28334 Modified: lxml/branch/threading/src/lxml/serializer.pxi Log: allow threads in serialization to (real) files Modified: lxml/branch/threading/src/lxml/serializer.pxi ============================================================================== --- lxml/branch/threading/src/lxml/serializer.pxi (original) +++ lxml/branch/threading/src/lxml/serializer.pxi Mon Jun 5 16:55:59 2006 @@ -148,6 +148,7 @@ cdef _tofilelike(f, _NodeBase element, encoding, int write_xml_declaration, int pretty_print): + cdef python.PyThreadState* state cdef _FilelikeWriter writer cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlCharEncodingHandler* enchandler @@ -165,6 +166,7 @@ filename = _utf8(f) c_buffer = tree.xmlOutputBufferCreateFilename( _cstr(filename), enchandler, 0) + state = python.PyEval_SaveThread() elif hasattr(f, 'write'): writer = _FilelikeWriter(f) c_buffer = writer._createOutputBuffer(enchandler) @@ -174,15 +176,18 @@ _writeNodeToBuffer(c_buffer, element._c_node, c_enc, write_xml_declaration, pretty_print) - tree.xmlOutputBufferClose(c_buffer) tree.xmlCharEncCloseFunc(enchandler) - if writer is not None: + if writer is None: + python.PyEval_RestoreThread(state) + else: writer._exc_context._raise_if_stored() cdef _tofilelikeC14N(f, _NodeBase element): + cdef python.PyThreadState* state cdef _FilelikeWriter writer cdef tree.xmlOutputBuffer* c_buffer + cdef char* c_filename cdef xmlDoc* c_base_doc cdef xmlDoc* c_doc cdef int bytes @@ -192,8 +197,10 @@ try: if _isString(f): filename = _utf8(f) - bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, - _cstr(filename), 0) + c_filename = _cstr(filename) + state = python.PyEval_SaveThread() + bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, c_filename, 0) + python.PyEval_RestoreThread(state) elif hasattr(f, 'write'): writer = _FilelikeWriter(f) c_buffer = writer._createOutputBuffer(NULL) From scoder at codespeak.net Tue Jun 6 09:19:53 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 09:19:53 +0200 (CEST) Subject: [Lxml-checkins] r28341 - lxml/trunk Message-ID: <20060606071953.3AB421006F@code0.codespeak.net> Author: scoder Date: Tue Jun 6 09:19:51 2006 New Revision: 28341 Modified: lxml/trunk/Makefile Log: also run ET selftests on make test Modified: lxml/trunk/Makefile ============================================================================== --- lxml/trunk/Makefile (original) +++ lxml/trunk/Makefile Tue Jun 6 09:19:51 2006 @@ -17,6 +17,8 @@ test_inplace: inplace $(PYTHON) test.py $(TESTFLAGS) $(TESTOPTS) + PYTHONPATH=src $(PYTHON) selftest.py + PYTHONPATH=src $(PYTHON) selftest2.py bench_inplace: inplace $(PYTHON) bench.py -i From scoder at codespeak.net Tue Jun 6 10:02:06 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 10:02:06 +0200 (CEST) Subject: [Lxml-checkins] r28344 - lxml/trunk Message-ID: <20060606080206.D4E2A1006F@code0.codespeak.net> Author: scoder Date: Tue Jun 6 10:02:05 2006 New Revision: 28344 Modified: lxml/trunk/setup.py Log: allow passing --without-assert to setup.py to compile without assertions (requires patched Pyrex) Modified: lxml/trunk/setup.py ============================================================================== --- lxml/trunk/setup.py (original) +++ lxml/trunk/setup.py Tue Jun 6 10:02:05 2006 @@ -84,11 +84,19 @@ # use the static setup as configured in setupStaticBuild cflags, xslt_libs = setupStaticBuild() +DEFINES = [] +try: + sys.argv.remove('--without-assert') + DEFINES.append( ('PYREX_WITHOUT_ASSERTIONS', None) ) +except ValueError: + pass + ext_modules = [ Extension( "lxml.etree", sources = sources, extra_compile_args = ['-w'] + cflags, - extra_link_args = xslt_libs + extra_link_args = xslt_libs, + define_macros = DEFINES )] From scoder at codespeak.net Tue Jun 6 10:29:36 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 10:29:36 +0200 (CEST) Subject: [Lxml-checkins] r28345 - lxml/trunk/src/lxml Message-ID: <20060606082936.18A8E1006F@code0.codespeak.net> Author: scoder Date: Tue Jun 6 10:29:34 2006 New Revision: 28345 Modified: lxml/trunk/src/lxml/etree.h lxml/trunk/src/lxml/extensions.pxi Log: cleanup in tree walker macros to make them more readable Modified: lxml/trunk/src/lxml/etree.h ============================================================================== --- lxml/trunk/src/lxml/etree.h (original) +++ lxml/trunk/src/lxml/etree.h Tue Jun 6 10:29:34 2006 @@ -61,47 +61,52 @@ * should not segfault ! */ -#define ADVANCE_TO_NEXT_ELEMENT(c_node) \ +#define _ADVANCE_TO_NEXT_ELEMENT(c_node) \ while ((c_node != 0) && (!_isElement(c_node))) \ c_node = c_node->next; +#define _TRAVERSE_TO_NEXT_NODE(c_stop_node, c_node) \ +{ \ + /* walk through children first */ \ + xmlNode* ___next = c_node->children; \ + _ADVANCE_TO_NEXT_ELEMENT(___next) \ + if ((___next == 0) && (c_node != c_stop_node)) { \ + /* try siblings */ \ + ___next = c_node->next; \ + _ADVANCE_TO_NEXT_ELEMENT(___next) \ + /* back off through parents */ \ + while (___next == 0) { \ + c_node = c_node->parent; \ + if (c_node == 0) \ + break; \ + if (c_node == c_stop_node) \ + break; \ + if (!_isElement(c_node)) \ + break; \ + /* we already traversed the parents -> siblings */ \ + ___next = c_node->next; \ + _ADVANCE_TO_NEXT_ELEMENT(___next) \ + } \ + } \ + c_node = ___next; \ +} + #define BEGIN_FOR_EACH_ELEMENT_FROM(c_tree_top, c_node, inclusive) \ { \ - xmlNode* ___next; \ - const xmlNode* ___tree_top = (c_tree_top); \ - /* make sure we have an element or NULL */ \ if (c_node != 0) { \ + const xmlNode* ___tree_top = (c_tree_top); \ + /* make sure we start at an element */ \ if (!_isElement(c_node)) { \ /* we skip the node, so 'inclusive' is irrelevant */ \ if (c_node == ___tree_top) \ c_node = 0; /* nothing to traverse */ \ else { \ c_node = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(c_node) \ + _ADVANCE_TO_NEXT_ELEMENT(c_node) \ } \ } else if (! (inclusive)) { \ - /* duplicated for speed: find the second node */ \ - /* walk through children */ \ - ___next = c_node->children; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - if ((___next == 0) && (c_node != ___tree_top)) { \ - /* try siblings */ \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - /* back off through parents */ \ - while (___next == 0) { \ - c_node = c_node->parent; \ - if (c_node == 0) \ - break; \ - if (c_node == ___tree_top) \ - break; \ - if (!_isElement(c_node)) \ - break; \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - } \ - } \ - c_node = ___next; \ + /* skip the first node */ \ + _TRAVERSE_TO_NEXT_NODE(___tree_top, c_node) \ } \ \ /* now run the user code on the elements we find */ \ @@ -109,27 +114,7 @@ /* here goes the code to be run for each element */ #define END_FOR_EACH_ELEMENT_FROM(c_node) \ - /* walk through children */ \ - ___next = c_node->children; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - if ((___next == 0) && (c_node != ___tree_top)) { \ - /* try siblings */ \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - /* back off through parents */ \ - while (___next == 0) { \ - c_node = c_node->parent; \ - if (c_node == 0) \ - break; \ - if (c_node == ___tree_top) \ - break; \ - if (!_isElement(c_node)) \ - break; \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - } \ - } \ - c_node = ___next; \ + _TRAVERSE_TO_NEXT_NODE(___tree_top, c_node) \ } \ } \ } Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Tue Jun 6 10:29:34 2006 @@ -268,6 +268,7 @@ cdef object _createNodeSetResult(xpath.xmlXPathObject* xpathObj, _Document doc): cdef xmlNode* c_node + cdef xmlNode* c_save_node cdef char* s cdef int i result = [] @@ -281,7 +282,9 @@ # XPath: only runs when extensions create or copy trees # -> we store Python refs to these, so that is OK # XSLT: can it leak when merging trees from multiple sources? + c_save_node = c_node c_node = tree.xmlDocCopyNode(c_node, doc._c_doc, 1) + attemptDeallocation(c_save_node) value = _elementFactory(doc, c_node) elif c_node.type == tree.XML_TEXT_NODE: value = funicode(c_node.content) From scoder at codespeak.net Tue Jun 6 10:33:32 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 10:33:32 +0200 (CEST) Subject: [Lxml-checkins] r28346 - lxml/trunk/src/lxml Message-ID: <20060606083332.C3FED1006F@code0.codespeak.net> Author: scoder Date: Tue Jun 6 10:33:31 2006 New Revision: 28346 Modified: lxml/trunk/src/lxml/etree.h Log: renamed private macro Modified: lxml/trunk/src/lxml/etree.h ============================================================================== --- lxml/trunk/src/lxml/etree.h (original) +++ lxml/trunk/src/lxml/etree.h Tue Jun 6 10:33:31 2006 @@ -65,7 +65,7 @@ while ((c_node != 0) && (!_isElement(c_node))) \ c_node = c_node->next; -#define _TRAVERSE_TO_NEXT_NODE(c_stop_node, c_node) \ +#define _TRAVERSE_TO_NEXT_ELEMENT(c_stop_node, c_node) \ { \ /* walk through children first */ \ xmlNode* ___next = c_node->children; \ @@ -106,7 +106,7 @@ } \ } else if (! (inclusive)) { \ /* skip the first node */ \ - _TRAVERSE_TO_NEXT_NODE(___tree_top, c_node) \ + _TRAVERSE_TO_NEXT_ELEMENT(___tree_top, c_node) \ } \ \ /* now run the user code on the elements we find */ \ @@ -114,7 +114,7 @@ /* here goes the code to be run for each element */ #define END_FOR_EACH_ELEMENT_FROM(c_node) \ - _TRAVERSE_TO_NEXT_NODE(___tree_top, c_node) \ + _TRAVERSE_TO_NEXT_ELEMENT(___tree_top, c_node) \ } \ } \ } From scoder at codespeak.net Tue Jun 6 10:40:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 10:40:41 +0200 (CEST) Subject: [Lxml-checkins] r28348 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060606084041.11B2410060@code0.codespeak.net> Author: scoder Date: Tue Jun 6 10:40:39 2006 New Revision: 28348 Modified: lxml/branch/lxml-1.0/Makefile lxml/branch/lxml-1.0/setup.py lxml/branch/lxml-1.0/src/lxml/etree.h lxml/branch/lxml-1.0/src/lxml/etree.pyx lxml/branch/lxml-1.0/src/lxml/extensions.pxi lxml/branch/lxml-1.0/src/lxml/parser.pxi Log: fixes and cleanups from trunk Modified: lxml/branch/lxml-1.0/Makefile ============================================================================== --- lxml/branch/lxml-1.0/Makefile (original) +++ lxml/branch/lxml-1.0/Makefile Tue Jun 6 10:40:39 2006 @@ -17,6 +17,8 @@ test_inplace: inplace $(PYTHON) test.py $(TESTFLAGS) $(TESTOPTS) + PYTHONPATH=src $(PYTHON) selftest.py + PYTHONPATH=src $(PYTHON) selftest2.py bench_inplace: inplace $(PYTHON) bench.py -i Modified: lxml/branch/lxml-1.0/setup.py ============================================================================== --- lxml/branch/lxml-1.0/setup.py (original) +++ lxml/branch/lxml-1.0/setup.py Tue Jun 6 10:40:39 2006 @@ -84,11 +84,19 @@ # use the static setup as configured in setupStaticBuild cflags, xslt_libs = setupStaticBuild() +DEFINES = [] +try: + sys.argv.remove('--without-assert') + DEFINES.append( ('PYREX_WITHOUT_ASSERTIONS', None) ) +except ValueError: + pass + ext_modules = [ Extension( "lxml.etree", sources = sources, extra_compile_args = ['-w'] + cflags, - extra_link_args = xslt_libs + extra_link_args = xslt_libs, + define_macros = DEFINES )] Modified: lxml/branch/lxml-1.0/src/lxml/etree.h ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.h (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.h Tue Jun 6 10:40:39 2006 @@ -61,47 +61,52 @@ * should not segfault ! */ -#define ADVANCE_TO_NEXT_ELEMENT(c_node) \ +#define _ADVANCE_TO_NEXT_ELEMENT(c_node) \ while ((c_node != 0) && (!_isElement(c_node))) \ c_node = c_node->next; +#define _TRAVERSE_TO_NEXT_ELEMENT(c_stop_node, c_node) \ +{ \ + /* walk through children first */ \ + xmlNode* ___next = c_node->children; \ + _ADVANCE_TO_NEXT_ELEMENT(___next) \ + if ((___next == 0) && (c_node != c_stop_node)) { \ + /* try siblings */ \ + ___next = c_node->next; \ + _ADVANCE_TO_NEXT_ELEMENT(___next) \ + /* back off through parents */ \ + while (___next == 0) { \ + c_node = c_node->parent; \ + if (c_node == 0) \ + break; \ + if (c_node == c_stop_node) \ + break; \ + if (!_isElement(c_node)) \ + break; \ + /* we already traversed the parents -> siblings */ \ + ___next = c_node->next; \ + _ADVANCE_TO_NEXT_ELEMENT(___next) \ + } \ + } \ + c_node = ___next; \ +} + #define BEGIN_FOR_EACH_ELEMENT_FROM(c_tree_top, c_node, inclusive) \ { \ - xmlNode* ___next; \ - const xmlNode* ___tree_top = (c_tree_top); \ - /* make sure we have an element or NULL */ \ if (c_node != 0) { \ + const xmlNode* ___tree_top = (c_tree_top); \ + /* make sure we start at an element */ \ if (!_isElement(c_node)) { \ /* we skip the node, so 'inclusive' is irrelevant */ \ if (c_node == ___tree_top) \ c_node = 0; /* nothing to traverse */ \ else { \ c_node = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(c_node) \ + _ADVANCE_TO_NEXT_ELEMENT(c_node) \ } \ } else if (! (inclusive)) { \ - /* duplicated for speed: find the second node */ \ - /* walk through children */ \ - ___next = c_node->children; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - if ((___next == 0) && (c_node != ___tree_top)) { \ - /* try siblings */ \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - /* back off through parents */ \ - while (___next == 0) { \ - c_node = c_node->parent; \ - if (c_node == 0) \ - break; \ - if (c_node == ___tree_top) \ - break; \ - if (!_isElement(c_node)) \ - break; \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - } \ - } \ - c_node = ___next; \ + /* skip the first node */ \ + _TRAVERSE_TO_NEXT_ELEMENT(___tree_top, c_node) \ } \ \ /* now run the user code on the elements we find */ \ @@ -109,27 +114,7 @@ /* here goes the code to be run for each element */ #define END_FOR_EACH_ELEMENT_FROM(c_node) \ - /* walk through children */ \ - ___next = c_node->children; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - if ((___next == 0) && (c_node != ___tree_top)) { \ - /* try siblings */ \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - /* back off through parents */ \ - while (___next == 0) { \ - c_node = c_node->parent; \ - if (c_node == 0) \ - break; \ - if (c_node == ___tree_top) \ - break; \ - if (!_isElement(c_node)) \ - break; \ - ___next = c_node->next; \ - ADVANCE_TO_NEXT_ELEMENT(___next) \ - } \ - } \ - c_node = ___next; \ + _TRAVERSE_TO_NEXT_ELEMENT(___tree_top, c_node) \ } \ } \ } Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Tue Jun 6 10:40:39 2006 @@ -6,18 +6,23 @@ cimport xinclude cimport c14n cimport cstd -import re import __builtin__ cdef object True cdef object False True = __builtin__.True False = __builtin__.False +del __builtin__ +cdef object _elementpath import _elementpath -from StringIO import StringIO + +cdef object sys import sys +cdef object re +import re + # the rules # any libxml C argument/variable is prefixed with c_ # any non-public function/class is prefixed with an underscore @@ -47,7 +52,11 @@ def initThread(): """Must be called by each newly created thread before calling any API - functions.""" + functions. + + Note that lxml.etree does not currently release the GIL, so there are no + performance gains to be expected from using threads. + """ #_initThreadLogging() pass Modified: lxml/branch/lxml-1.0/src/lxml/extensions.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/extensions.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/extensions.pxi Tue Jun 6 10:40:39 2006 @@ -268,6 +268,7 @@ cdef object _createNodeSetResult(xpath.xmlXPathObject* xpathObj, _Document doc): cdef xmlNode* c_node + cdef xmlNode* c_save_node cdef char* s cdef int i result = [] @@ -281,7 +282,9 @@ # XPath: only runs when extensions create or copy trees # -> we store Python refs to these, so that is OK # XSLT: can it leak when merging trees from multiple sources? + c_save_node = c_node c_node = tree.xmlDocCopyNode(c_node, doc._c_doc, 1) + attemptDeallocation(c_save_node) value = _elementFactory(doc, c_node) elif c_node.type == tree.XML_TEXT_NODE: value = funicode(c_node.content) Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Tue Jun 6 10:40:39 2006 @@ -217,13 +217,14 @@ if doc_ref._type == PARSER_DATA_STRING: data = doc_ref._data_utf c_input = xmlparser.xmlNewStringInputStream( - c_context, _cstr(doc_ref._data_utf)) + c_context, _cstr(data)) elif doc_ref._type == PARSER_DATA_FILENAME: c_input = xmlparser.xmlNewInputFromFile( c_context, _cstr(doc_ref._data_utf)) elif doc_ref._type == PARSER_DATA_FILE: file_context = _FileParserContext(doc_ref._file, context) c_input = file_context._createParserInput(c_context) + data = file_context if data is not None: context._storage.add(data) From scoder at codespeak.net Tue Jun 6 10:41:32 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 10:41:32 +0200 (CEST) Subject: [Lxml-checkins] r28349 - lxml/branch/lxml-1.0/doc Message-ID: <20060606084132.6497110060@code0.codespeak.net> Author: scoder Date: Tue Jun 6 10:41:31 2006 New Revision: 28349 Modified: lxml/branch/lxml-1.0/doc/build.txt Log: doc updates from trunk Modified: lxml/branch/lxml-1.0/doc/build.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/build.txt (original) +++ lxml/branch/lxml-1.0/doc/build.txt Tue Jun 6 10:41:31 2006 @@ -56,6 +56,10 @@ If you then place lxml's ``src`` directory on your PYTHONPATH somehow, you can import ``lxml.etree`` and play with it. +To recompile after changes, note that you may have to run ``make clean`` or +delete the file ``src/lxml/etree.c``. Distutils do not automatically pick up +changes that affect files other than the main file ``src/lxml/etree.pyx``. + Running the tests and reporting errors -------------------------------------- From scoder at codespeak.net Tue Jun 6 10:57:55 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 10:57:55 +0200 (CEST) Subject: [Lxml-checkins] r28350 - lxml/trunk/src/lxml Message-ID: <20060606085755.C735E1006F@code0.codespeak.net> Author: scoder Date: Tue Jun 6 10:57:54 2006 New Revision: 28350 Modified: lxml/trunk/src/lxml/extensions.pxi Log: reverted changes in extensions.pxi that were accidentally committed Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Tue Jun 6 10:57:54 2006 @@ -268,7 +268,6 @@ cdef object _createNodeSetResult(xpath.xmlXPathObject* xpathObj, _Document doc): cdef xmlNode* c_node - cdef xmlNode* c_save_node cdef char* s cdef int i result = [] @@ -282,9 +281,7 @@ # XPath: only runs when extensions create or copy trees # -> we store Python refs to these, so that is OK # XSLT: can it leak when merging trees from multiple sources? - c_save_node = c_node c_node = tree.xmlDocCopyNode(c_node, doc._c_doc, 1) - attemptDeallocation(c_save_node) value = _elementFactory(doc, c_node) elif c_node.type == tree.XML_TEXT_NODE: value = funicode(c_node.content) From scoder at codespeak.net Tue Jun 6 12:12:39 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 12:12:39 +0200 (CEST) Subject: [Lxml-checkins] r28355 - lxml/trunk/src/lxml/tests Message-ID: <20060606101239.33B6D10060@code0.codespeak.net> Author: scoder Date: Tue Jun 6 12:12:38 2006 New Revision: 28355 Modified: lxml/trunk/src/lxml/tests/test_xpathevaluator.py Log: new test cases for node modification in XPath functions Modified: lxml/trunk/src/lxml/tests/test_xpathevaluator.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_xpathevaluator.py (original) +++ lxml/trunk/src/lxml/tests/test_xpathevaluator.py Tue Jun 6 12:12:38 2006 @@ -192,6 +192,40 @@ self.assertEquals('Hoi', r[0].text) self.assertEquals('Dag', r[1].text) + def test_xpath_extensions_nodes_append(self): + def f(evaluator, nodes): + r = etree.SubElement(nodes[0], 'results') + b = etree.SubElement(r, 'result') + b.text = 'Hoi' + b = etree.SubElement(r, 'result') + b.text = 'Dag' + return r + + x = self.parse('') + e = etree.XPathEvaluator(x, None, [{(None, 'foo'): f}]) + r = e.evaluate("foo(/*)/result") + self.assertEquals(2, len(r)) + self.assertEquals('Hoi', r[0].text) + self.assertEquals('Dag', r[1].text) + + def test_xpath_extensions_nodes_append2(self): + def f(evaluator, nodes): + r = etree.Element('results') + b = etree.SubElement(r, 'result') + b.text = 'Hoi' + b = etree.SubElement(r, 'result') + b.text = 'Dag' + r.append(nodes[0]) + return r + + x = self.parse('Honk') + e = etree.XPathEvaluator(x, None, [{(None, 'foo'): f}]) + r = e.evaluate("foo(/*)/result") + self.assertEquals(3, len(r)) + self.assertEquals('Hoi', r[0].text) + self.assertEquals('Dag', r[1].text) + self.assertEquals('Honk', r[2].text) + def test_xpath_variables(self): x = self.parse('') e = etree.XPathEvaluator(x) From scoder at codespeak.net Tue Jun 6 12:13:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 6 Jun 2006 12:13:50 +0200 (CEST) Subject: [Lxml-checkins] r28356 - lxml/trunk/src/lxml Message-ID: <20060606101350.2108210053@code0.codespeak.net> Author: scoder Date: Tue Jun 6 12:13:48 2006 New Revision: 28356 Modified: lxml/trunk/src/lxml/extensions.pxi Log: cleanup in XPath _hold() Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Tue Jun 6 12:13:48 2006 @@ -169,8 +169,10 @@ """ cdef _NodeBase element if isinstance(obj, _NodeBase): - obj = (obj,) - elif not python.PySequence_Check(obj): + self._temp_refs.add(obj) + self._temp_refs.add((<_NodeBase>obj)._doc) + return + elif _isString(obj) or not python.PySequence_Check(obj): return for o in obj: if isinstance(o, _NodeBase): From scoder at codespeak.net Wed Jun 7 13:39:49 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 13:39:49 +0200 (CEST) Subject: [Lxml-checkins] r28438 - in lxml/trunk/src/lxml: . tests Message-ID: <20060607113949.C163210069@code0.codespeak.net> Author: scoder Date: Wed Jun 7 13:39:47 2006 New Revision: 28438 Added: lxml/trunk/src/lxml/tests/test-string.xml Modified: lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/tests/test_elementtree.py lxml/trunk/src/lxml/tests/test_htmlparser.py lxml/trunk/src/lxml/tests/test_unicode.py Log: fix: parsing encoded strings from file(-like) objects raised an exception, now it passes the encoded data directly into libxml2 without conversion or encoding checks Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 7 13:39:47 2006 @@ -114,7 +114,7 @@ cdef class _FileParserContext: cdef object _filelike cdef object _url - cdef object _bytes_utf + cdef object _bytes cdef _ExceptionContext _exc_context cdef cstd.size_t _bytes_read cdef char* _c_url @@ -126,7 +126,7 @@ self._c_url = NULL else: self._c_url = _cstr(url) - self._bytes_utf = '' + self._bytes = '' self._bytes_read = 0 cdef xmlparser.xmlParserInput* _createParserInput(self, xmlParserCtxt* ctxt): @@ -153,18 +153,20 @@ if self._bytes_read < 0: return 0 try: - byte_count = python.PyString_GET_SIZE(self._bytes_utf) + byte_count = python.PyString_GET_SIZE(self._bytes) remaining = byte_count - self._bytes_read if remaining <= 0: - self._bytes_utf = _utf8( self._filelike.read(c_size) ) + self._bytes = self._filelike.read(c_size) + if not python.PyString_Check(self._bytes): + raise TypeError, "reading file objects must return plain strings" + remaining = python.PyString_GET_SIZE(self._bytes) self._bytes_read = 0 - remaining = python.PyString_GET_SIZE(self._bytes_utf) if remaining == 0: self._bytes_read = -1 return 0 if c_size > remaining: c_size = remaining - c_start = _cstr(self._bytes_utf) + self._bytes_read + c_start = _cstr(self._bytes) + self._bytes_read self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size Added: lxml/trunk/src/lxml/tests/test-string.xml ============================================================================== --- (empty file) +++ lxml/trunk/src/lxml/tests/test-string.xml Wed Jun 7 13:39:47 2006 @@ -0,0 +1,2 @@ + +S?k p? nettet Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Wed Jun 7 13:39:47 2006 @@ -1817,6 +1817,24 @@ self.assertEquals(u'S?k p? nettet'.encode('UTF-8'), f.getvalue()) + def test_parse_file_encoding(self): + parse = self.etree.parse + # from file + tree = parse(fileInTestDir('test-string.xml')) + self.assertXML( + u'S?k p? nettet'.encode('UTF-8'), + tree.getroot(), 'UTF-8') + + def test_parse_file_object_encoding(self): + parse = self.etree.parse + # from file object + f = open(fileInTestDir('test-string.xml'), 'r') + tree = parse(f) + f.close() + self.assertXML( + u'S?k p? nettet'.encode('UTF-8'), + tree.getroot(), 'UTF-8') + def test_encoding_latin1(self): ElementTree = self.etree.ElementTree Element = self.etree.Element Modified: lxml/trunk/src/lxml/tests/test_htmlparser.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_htmlparser.py (original) +++ lxml/trunk/src/lxml/tests/test_htmlparser.py Wed Jun 7 13:39:47 2006 @@ -74,12 +74,12 @@ html = self.etree.tostring(tree.getroot(), 'UTF-8') self.assertEqual(html, self.html_str) - def test_module_parse_html_filelike_unicode(self): - parser = self.etree.HTMLParser() - f = SillyFileLike(self.uhtml_str) - tree = self.etree.parse(f, parser) - html = self.etree.tostring(tree.getroot(), 'UTF-8') - self.assertEqual(unicode(html, 'UTF-8'), self.uhtml_str) +## def test_module_parse_html_filelike_unicode(self): +## parser = self.etree.HTMLParser() +## f = SillyFileLike(self.uhtml_str) +## tree = self.etree.parse(f, parser) +## html = self.etree.tostring(tree.getroot(), 'UTF-8') +## self.assertEqual(unicode(html, 'UTF-8'), self.uhtml_str) def test_html_file_error(self): parser = self.etree.HTMLParser() Modified: lxml/trunk/src/lxml/tests/test_unicode.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_unicode.py (original) +++ lxml/trunk/src/lxml/tests/test_unicode.py Wed Jun 7 13:39:47 2006 @@ -41,12 +41,12 @@ el = etree.parse(StringIO(u'

%s

' % uni)).getroot() self.assertEquals(uni, el.text) - def test_parse_fileobject_unicode(self): - # parse unicode from unamed file object (not support by ElementTree) - f = SillyFileLike(uxml) - root = etree.parse(f).getroot() - self.assertEquals(unicode(etree.tostring(root, 'UTF-8'), 'UTF-8'), - uxml) +## def test_parse_fileobject_unicode(self): +## # parse unicode from unamed file object (not support by ElementTree) +## f = SillyFileLike(uxml) +## root = etree.parse(f).getroot() +## self.assertEquals(unicode(etree.tostring(root, 'UTF-8'), 'UTF-8'), +## uxml) def test_suite(): suite = unittest.TestSuite() From scoder at codespeak.net Wed Jun 7 13:44:54 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 13:44:54 +0200 (CEST) Subject: [Lxml-checkins] r28439 - in lxml/branch/lxml-1.0/src/lxml: . tests Message-ID: <20060607114454.0A01410069@code0.codespeak.net> Author: scoder Date: Wed Jun 7 13:44:52 2006 New Revision: 28439 Added: lxml/branch/lxml-1.0/src/lxml/tests/test-string.xml - copied unchanged from r28438, lxml/trunk/src/lxml/tests/test-string.xml Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py lxml/branch/lxml-1.0/src/lxml/tests/test_htmlparser.py lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py Log: merged in fix for file-object reading bug from trunk Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 7 13:44:52 2006 @@ -114,7 +114,7 @@ cdef class _FileParserContext: cdef object _filelike cdef object _url - cdef object _bytes_utf + cdef object _bytes cdef _ExceptionContext _exc_context cdef cstd.size_t _bytes_read cdef char* _c_url @@ -126,7 +126,7 @@ self._c_url = NULL else: self._c_url = _cstr(url) - self._bytes_utf = '' + self._bytes = '' self._bytes_read = 0 cdef xmlparser.xmlParserInput* _createParserInput(self, xmlParserCtxt* ctxt): @@ -153,18 +153,20 @@ if self._bytes_read < 0: return 0 try: - byte_count = python.PyString_GET_SIZE(self._bytes_utf) + byte_count = python.PyString_GET_SIZE(self._bytes) remaining = byte_count - self._bytes_read if remaining <= 0: - self._bytes_utf = _utf8( self._filelike.read(c_size) ) + self._bytes = self._filelike.read(c_size) + if not python.PyString_Check(self._bytes): + raise TypeError, "reading file objects must return plain strings" + remaining = python.PyString_GET_SIZE(self._bytes) self._bytes_read = 0 - remaining = python.PyString_GET_SIZE(self._bytes_utf) if remaining == 0: self._bytes_read = -1 return 0 if c_size > remaining: c_size = remaining - c_start = _cstr(self._bytes_utf) + self._bytes_read + c_start = _cstr(self._bytes) + self._bytes_read self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py Wed Jun 7 13:44:52 2006 @@ -1797,6 +1797,24 @@ self.assertEquals(u'S?k p? nettet'.encode('UTF-8'), f.getvalue()) + def test_parse_file_encoding(self): + parse = self.etree.parse + # from file + tree = parse(fileInTestDir('test-string.xml')) + self.assertXML( + u'S?k p? nettet'.encode('UTF-8'), + tree.getroot(), 'UTF-8') + + def test_parse_file_object_encoding(self): + parse = self.etree.parse + # from file object + f = open(fileInTestDir('test-string.xml'), 'r') + tree = parse(f) + f.close() + self.assertXML( + u'S?k p? nettet'.encode('UTF-8'), + tree.getroot(), 'UTF-8') + def test_encoding_latin1(self): ElementTree = self.etree.ElementTree Element = self.etree.Element Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_htmlparser.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_htmlparser.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_htmlparser.py Wed Jun 7 13:44:52 2006 @@ -74,12 +74,12 @@ html = self.etree.tostring(tree.getroot(), 'UTF-8') self.assertEqual(html, self.html_str) - def test_module_parse_html_filelike_unicode(self): - parser = self.etree.HTMLParser() - f = SillyFileLike(self.uhtml_str) - tree = self.etree.parse(f, parser) - html = self.etree.tostring(tree.getroot(), 'UTF-8') - self.assertEqual(unicode(html, 'UTF-8'), self.uhtml_str) +## def test_module_parse_html_filelike_unicode(self): +## parser = self.etree.HTMLParser() +## f = SillyFileLike(self.uhtml_str) +## tree = self.etree.parse(f, parser) +## html = self.etree.tostring(tree.getroot(), 'UTF-8') +## self.assertEqual(unicode(html, 'UTF-8'), self.uhtml_str) def test_html_file_error(self): parser = self.etree.HTMLParser() Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py Wed Jun 7 13:44:52 2006 @@ -41,12 +41,12 @@ el = etree.parse(StringIO(u'

%s

' % uni)).getroot() self.assertEquals(uni, el.text) - def test_parse_fileobject_unicode(self): - # parse unicode from unamed file object (not support by ElementTree) - f = SillyFileLike(uxml) - root = etree.parse(f).getroot() - self.assertEquals(unicode(etree.tostring(root, 'UTF-8'), 'UTF-8'), - uxml) +## def test_parse_fileobject_unicode(self): +## # parse unicode from unamed file object (not support by ElementTree) +## f = SillyFileLike(uxml) +## root = etree.parse(f).getroot() +## self.assertEquals(unicode(etree.tostring(root, 'UTF-8'), 'UTF-8'), +## uxml) def test_suite(): suite = unittest.TestSuite() From scoder at codespeak.net Wed Jun 7 13:57:29 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 13:57:29 +0200 (CEST) Subject: [Lxml-checkins] r28440 - lxml/trunk/src/lxml Message-ID: <20060607115729.0C51F10063@code0.codespeak.net> Author: scoder Date: Wed Jun 7 13:57:27 2006 New Revision: 28440 Modified: lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/serializer.pxi lxml/trunk/src/lxml/xslt.pxi Log: catch all exceptions in C functions, independent of their type Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 7 13:57:27 2006 @@ -170,7 +170,7 @@ self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size - except Exception: + except: self._exc_context._store_raised() return -1 @@ -205,7 +205,7 @@ context = <_ResolverContext>c_context._private doc_ref = context._resolvers.resolve(url, pubid, context) - except Exception: + except: context._store_raised() return NULL Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Wed Jun 7 13:57:27 2006 @@ -125,7 +125,7 @@ py_buffer = python.PyString_FromStringAndSize(c_buffer, size) self._filelike.write(py_buffer) return size - except Exception: + except: self._exc_context._store_raised() return -1 Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Wed Jun 7 13:57:27 2006 @@ -110,7 +110,7 @@ if c_doc is not NULL and c_doc.URL is NULL: c_doc.URL = tree.xmlStrdup(c_uri) - except Exception, e: + except: xslt_resolver_context._store_raised() return NULL From scoder at codespeak.net Wed Jun 7 13:59:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 13:59:31 +0200 (CEST) Subject: [Lxml-checkins] r28441 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060607115931.3DF6110063@code0.codespeak.net> Author: scoder Date: Wed Jun 7 13:59:29 2006 New Revision: 28441 Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/serializer.pxi lxml/branch/lxml-1.0/src/lxml/xslt.pxi Log: catch all exceptions in C functions, independent of their type Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 7 13:59:29 2006 @@ -170,7 +170,7 @@ self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size - except Exception: + except: self._exc_context._store_raised() return -1 @@ -205,7 +205,7 @@ context = <_ResolverContext>c_context._private doc_ref = context._resolvers.resolve(url, pubid, context) - except Exception: + except: context._store_raised() return NULL Modified: lxml/branch/lxml-1.0/src/lxml/serializer.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/serializer.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/serializer.pxi Wed Jun 7 13:59:29 2006 @@ -125,7 +125,7 @@ py_buffer = python.PyString_FromStringAndSize(c_buffer, size) self._filelike.write(py_buffer) return size - except Exception: + except: self._exc_context._store_raised() return -1 Modified: lxml/branch/lxml-1.0/src/lxml/xslt.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xslt.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xslt.pxi Wed Jun 7 13:59:29 2006 @@ -110,7 +110,7 @@ if c_doc is not NULL and c_doc.URL is NULL: c_doc.URL = tree.xmlStrdup(c_uri) - except Exception, e: + except: xslt_resolver_context._store_raised() return NULL From scoder at codespeak.net Wed Jun 7 14:01:30 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 14:01:30 +0200 (CEST) Subject: [Lxml-checkins] r28442 - lxml/trunk Message-ID: <20060607120130.3156410064@code0.codespeak.net> Author: scoder Date: Wed Jun 7 14:01:29 2006 New Revision: 28442 Modified: lxml/trunk/CHANGES.txt Log: marked file-object parsing bug fixed Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Wed Jun 7 14:01:29 2006 @@ -23,6 +23,8 @@ Bugs fixed ---------- +* Parsing 8-bit strings from file(-like) objects raised an exception + * xsl:include failed when the stylesheet was parsed from a file-like object * lxml.sax.ElementTreeProducer did not call startDocument() / endDocument() From scoder at codespeak.net Wed Jun 7 14:02:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 14:02:08 +0200 (CEST) Subject: [Lxml-checkins] r28443 - lxml/branch/lxml-1.0 Message-ID: <20060607120208.B593810075@code0.codespeak.net> Author: scoder Date: Wed Jun 7 14:02:07 2006 New Revision: 28443 Modified: lxml/branch/lxml-1.0/CHANGES.txt Log: marked file-object parsing bug fixed Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Wed Jun 7 14:02:07 2006 @@ -10,6 +10,8 @@ Bugs fixed ---------- +* Parsing 8-bit strings from file(-like) objects raised an exception + * xsl:include failed when the stylesheet was parsed from a file-like object * lxml.sax.ElementTreeProducer did not call startDocument() / endDocument() From scoder at codespeak.net Wed Jun 7 14:25:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 14:25:10 +0200 (CEST) Subject: [Lxml-checkins] r28444 - lxml/trunk/src/lxml Message-ID: <20060607122510.368B110060@code0.codespeak.net> Author: scoder Date: Wed Jun 7 14:25:09 2006 New Revision: 28444 Modified: lxml/trunk/src/lxml/parser.pxi Log: fix: pass filename to _FileParserContext, needed to refer to external entities (DTD etc.) Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 7 14:25:09 2006 @@ -224,7 +224,7 @@ c_input = xmlparser.xmlNewInputFromFile( c_context, _cstr(doc_ref._data_utf)) elif doc_ref._type == PARSER_DATA_FILE: - file_context = _FileParserContext(doc_ref._file, context) + file_context = _FileParserContext(doc_ref._file, context, url) c_input = file_context._createParserInput(c_context) data = file_context @@ -362,18 +362,22 @@ recover = self._parse_options & xmlparser.XML_PARSE_RECOVER return _handleParseResult(pctxt, result, c_filename, recover) - cdef xmlDoc* _parseDocFromFilelike(self, filelike, - char* c_filename) except NULL: + cdef xmlDoc* _parseDocFromFilelike(self, filelike, filename) except NULL: # we read Python string, so we must convert to UTF-8 cdef _FileParserContext file_context cdef xmlDoc* result cdef xmlParserCtxt* pctxt + cdef char* c_filename cdef int recover + if not filename: + c_filename = NULL + else: + c_filename = filename self._error_log.connect() pctxt = self._parser_ctxt __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - file_context = _FileParserContext(filelike, self._context) + file_context = _FileParserContext(filelike, self._context, filename) result = file_context._readDoc( pctxt, self._parse_options, self._parser_type) @@ -620,11 +624,7 @@ cdef char* c_filename if parser is None: parser = __DEFAULT_PARSER - if not filename: - c_filename = NULL - else: - c_filename = _cstr(filename) - return (<_BaseParser>parser)._parseDocFromFilelike(source, c_filename) + return (<_BaseParser>parser)._parseDocFromFilelike(source, filename) cdef xmlDoc* _newDoc(): cdef xmlDoc* result From scoder at codespeak.net Wed Jun 7 14:27:21 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 14:27:21 +0200 (CEST) Subject: [Lxml-checkins] r28445 - lxml/trunk Message-ID: <20060607122721.E2F4210060@code0.codespeak.net> Author: scoder Date: Wed Jun 7 14:27:20 2006 New Revision: 28445 Modified: lxml/trunk/CHANGES.txt Log: mark fixed: reading DTDs while parsing file-like objects Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Wed Jun 7 14:27:20 2006 @@ -23,6 +23,8 @@ Bugs fixed ---------- +* Parsing file(-like) objects failed to load external entities + * Parsing 8-bit strings from file(-like) objects raised an exception * xsl:include failed when the stylesheet was parsed from a file-like object From scoder at codespeak.net Wed Jun 7 14:27:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 14:27:50 +0200 (CEST) Subject: [Lxml-checkins] r28446 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060607122750.4784110060@code0.codespeak.net> Author: scoder Date: Wed Jun 7 14:27:48 2006 New Revision: 28446 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/src/lxml/parser.pxi Log: fix from trunk: pass filename to _FileParserContext, needed to refer to external entities (DTD etc.) Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Wed Jun 7 14:27:48 2006 @@ -10,6 +10,8 @@ Bugs fixed ---------- +* Parsing file(-like) objects failed to load external entities + * Parsing 8-bit strings from file(-like) objects raised an exception * xsl:include failed when the stylesheet was parsed from a file-like object Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 7 14:27:48 2006 @@ -224,7 +224,7 @@ c_input = xmlparser.xmlNewInputFromFile( c_context, _cstr(doc_ref._data_utf)) elif doc_ref._type == PARSER_DATA_FILE: - file_context = _FileParserContext(doc_ref._file, context) + file_context = _FileParserContext(doc_ref._file, context, url) c_input = file_context._createParserInput(c_context) data = file_context @@ -362,18 +362,22 @@ recover = self._parse_options & xmlparser.XML_PARSE_RECOVER return _handleParseResult(pctxt, result, c_filename, recover) - cdef xmlDoc* _parseDocFromFilelike(self, filelike, - char* c_filename) except NULL: + cdef xmlDoc* _parseDocFromFilelike(self, filelike, filename) except NULL: # we read Python string, so we must convert to UTF-8 cdef _FileParserContext file_context cdef xmlDoc* result cdef xmlParserCtxt* pctxt + cdef char* c_filename cdef int recover + if not filename: + c_filename = NULL + else: + c_filename = filename self._error_log.connect() pctxt = self._parser_ctxt __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - file_context = _FileParserContext(filelike, self._context) + file_context = _FileParserContext(filelike, self._context, filename) result = file_context._readDoc( pctxt, self._parse_options, self._parser_type) @@ -620,11 +624,7 @@ cdef char* c_filename if parser is None: parser = __DEFAULT_PARSER - if not filename: - c_filename = NULL - else: - c_filename = _cstr(filename) - return (<_BaseParser>parser)._parseDocFromFilelike(source, c_filename) + return (<_BaseParser>parser)._parseDocFromFilelike(source, filename) cdef xmlDoc* _newDoc(): cdef xmlDoc* result From scoder at codespeak.net Wed Jun 7 15:44:00 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 15:44:00 +0200 (CEST) Subject: [Lxml-checkins] r28451 - lxml/trunk/src/lxml Message-ID: <20060607134400.5419F10079@code0.codespeak.net> Author: scoder Date: Wed Jun 7 15:43:59 2006 New Revision: 28451 Modified: lxml/trunk/src/lxml/etree.pyx Log: cleanup in _ElementTree: only store _Document reference if we do not have a context node (e.g. XSLT result) Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Wed Jun 7 15:43:59 2006 @@ -358,7 +358,7 @@ # Note that _doc is only used to store the original document if we do not # have a _context_node. All methods should prefer self._context_node._doc - # to honour tree restructuring + # to honour tree restructuring. _doc can happily be None! cdef _assertHasRoot(self): """We have to take care here: the document may not have a root node! @@ -375,6 +375,10 @@ cdef _Document doc doc = _parseDocument(source, parser) self._context_node = doc.getroot() + if self._context_node is None: + self._doc = doc + else: + self._doc = None return self._context_node def getroot(self): @@ -553,9 +557,10 @@ object baseclass): cdef _ElementTree result result = baseclass() - result._doc = doc if context_node is None and doc is not None: - context_node = doc.getroot() + context_node = doc.getroot() + if context_node is None: + result._doc = doc result._context_node = context_node return result From scoder at codespeak.net Wed Jun 7 15:47:37 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 15:47:37 +0200 (CEST) Subject: [Lxml-checkins] r28453 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060607134737.49CC110079@code0.codespeak.net> Author: scoder Date: Wed Jun 7 15:47:36 2006 New Revision: 28453 Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx Log: cleanup in _ElementTree: only store _Document reference if we do not have a context node (e.g. XSLT result) Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Wed Jun 7 15:47:36 2006 @@ -358,7 +358,7 @@ # Note that _doc is only used to store the original document if we do not # have a _context_node. All methods should prefer self._context_node._doc - # to honour tree restructuring + # to honour tree restructuring. _doc can happily be None! cdef _assertHasRoot(self): """We have to take care here: the document may not have a root node! @@ -375,6 +375,10 @@ cdef _Document doc doc = _parseDocument(source, parser) self._context_node = doc.getroot() + if self._context_node is None: + self._doc = doc + else: + self._doc = None return self._context_node def getroot(self): @@ -553,9 +557,10 @@ object baseclass): cdef _ElementTree result result = baseclass() - result._doc = doc if context_node is None and doc is not None: - context_node = doc.getroot() + context_node = doc.getroot() + if context_node is None: + result._doc = doc result._context_node = context_node return result From scoder at codespeak.net Wed Jun 7 23:19:45 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 7 Jun 2006 23:19:45 +0200 (CEST) Subject: [Lxml-checkins] r28486 - lxml/trunk/src/lxml Message-ID: <20060607211945.A0BB110070@code0.codespeak.net> Author: scoder Date: Wed Jun 7 23:19:44 2006 New Revision: 28486 Modified: lxml/trunk/src/lxml/xslt.pxi Log: simplified error extracting using recent API updates Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Wed Jun 7 23:19:44 2006 @@ -354,11 +354,9 @@ if c_result is NULL: message = "Error applying stylesheet" - errors = self._error_log.filter_from_errors() - if errors: - error = errors[-1] - if error.message: - message = error.message + error = self._error_log.last_error + if error is not None and error.message: + message = error.message raise XSLTApplyError, message result_doc = _documentFactory(c_result, input_doc._parser) From scoder at codespeak.net Thu Jun 8 00:19:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 00:19:38 +0200 (CEST) Subject: [Lxml-checkins] r28487 - lxml/trunk/src/lxml/tests Message-ID: <20060607221938.07B5F10070@code0.codespeak.net> Author: scoder Date: Thu Jun 8 00:19:37 2006 New Revision: 28487 Modified: lxml/trunk/src/lxml/tests/test_elementtree.py Log: new test cases for deep copying: tails, subelements, namespaces Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Thu Jun 8 00:19:37 2006 @@ -1955,6 +1955,60 @@ self.assertEquals('Bar', b.text) self.assertEquals('Foo', a.text) + del a + self.assertEquals('Bar', b.text) + + def test_deepcopy_tail(self): + Element = self.etree.Element + + a = Element('a') + a.tail = 'Foo' + + b = copy.deepcopy(a) + self.assertEquals('Foo', b.tail) + + b.tail = 'Bar' + self.assertEquals('Bar', b.tail) + self.assertEquals('Foo', a.tail) + + del a + self.assertEquals('Bar', b.tail) + + def test_deepcopy_subelement(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + root = Element('root') + a = SubElement(root, 'a') + a.text = 'FooText' + a.tail = 'FooTail' + + b = copy.deepcopy(a) + self.assertEquals('FooText', b.text) + self.assertEquals('FooTail', b.tail) + + b.text = 'BarText' + b.tail = 'BarTail' + self.assertEquals('BarTail', b.tail) + self.assertEquals('FooTail', a.tail) + self.assertEquals('BarText', b.text) + self.assertEquals('FooText', a.text) + + del a + self.assertEquals('BarTail', b.tail) + self.assertEquals('BarText', b.text) + + def test_deepcopy_namespaces(self): + root = self.etree.XML(''' + + ''') + self.assertEquals( + root[0][0].get('{tns}foo'), + copy.deepcopy(root[0])[0].get('{tns}foo') ) + self.assertEquals( + root[0][0].get('{tns}foo'), + copy.deepcopy(root[0][0]).get('{tns}foo') ) + def test_shallowcopy(self): Element = self.etree.Element From scoder at codespeak.net Thu Jun 8 00:21:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 00:21:13 +0200 (CEST) Subject: [Lxml-checkins] r28488 - lxml/trunk/src/lxml Message-ID: <20060607222113.5AC1510070@code0.codespeak.net> Author: scoder Date: Thu Jun 8 00:21:12 2006 New Revision: 28488 Modified: lxml/trunk/src/lxml/apihelpers.pxi lxml/trunk/src/lxml/parser.pxi Log: fix deep copying elements to copy tails and namespaces correctly Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Thu Jun 8 00:21:12 2006 @@ -289,6 +289,19 @@ c_target = c_tail c_tail = c_next +cdef void _copyTail(xmlNode* c_tail, xmlNode* c_target): + cdef xmlNode* c_new_tail + # tail copying support: look for any text nodes trailing this node and + # copy it to the target node + while c_tail is not NULL and c_tail.type == tree.XML_TEXT_NODE: + if c_target.doc is not c_tail.doc: + c_new_tail = tree.xmlDocCopyNode(c_tail, c_target.doc, 0) + else: + c_new_tail = tree.xmlCopyNode(c_tail, 0) + tree.xmlAddNextSibling(c_target, c_new_tail) + c_target = c_new_tail + c_tail = c_tail.next + cdef xmlNode* _deleteSlice(xmlNode* c_node, Py_ssize_t start, Py_ssize_t stop): """Delete slice, starting with c_node, start counting at start, end at stop. """ Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Thu Jun 8 00:21:12 2006 @@ -646,16 +646,21 @@ cdef xmlDoc* _copyDocRoot(xmlDoc* c_doc, xmlNode* c_new_root): "Recursively copy the document and make c_new_root the new root node." cdef xmlDoc* result - cdef xmlDoc* fake_c_doc - fake_c_doc = _fakeRootDoc(c_doc, c_new_root) - result = tree.xmlCopyDoc(fake_c_doc, 1) - _destroyFakeDoc(c_doc, fake_c_doc) + cdef xmlNode* c_node + if c_new_root.parent is c_doc: + result = tree.xmlCopyDoc(c_doc, 1) # recursive doc copy + __GLOBAL_PARSER_CONTEXT._initDocDict(result) + else: + result = tree.xmlCopyDoc(c_doc, 2) # non recursive, but with ns + __GLOBAL_PARSER_CONTEXT._initDocDict(result) + c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive + tree.xmlDocSetRootElement(result, c_node) + _copyTail(c_new_root.next, c_node) if c_doc.URL is not NULL: # handle a bug in older libxml2 versions if result.URL is not NULL: tree.xmlFree(result.URL) result.URL = tree.xmlStrdup(c_doc.URL) - __GLOBAL_PARSER_CONTEXT._initDocDict(result) return result ############################################################ From scoder at codespeak.net Thu Jun 8 00:26:16 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 00:26:16 +0200 (CEST) Subject: [Lxml-checkins] r28489 - lxml/trunk/src/lxml Message-ID: <20060607222616.ACE6410070@code0.codespeak.net> Author: scoder Date: Thu Jun 8 00:26:15 2006 New Revision: 28489 Modified: lxml/trunk/src/lxml/etree.pyx Log: let deepcopy(element) also make an independent copy of the document parser Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 8 00:26:15 2006 @@ -638,7 +638,7 @@ cdef _Document new_doc doc = self._doc c_doc = _copyDocRoot(doc._c_doc, self._c_node) # recursive - new_doc = _documentFactory(c_doc, doc._parser) + new_doc = _documentFactory(c_doc, doc._parser.copy()) return new_doc.getroot() def set(self, key, value): From scoder at codespeak.net Thu Jun 8 00:53:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 00:53:41 +0200 (CEST) Subject: [Lxml-checkins] r28491 - lxml/trunk/src/lxml Message-ID: <20060607225341.68E6D10070@code0.codespeak.net> Author: scoder Date: Thu Jun 8 00:53:40 2006 New Revision: 28491 Modified: lxml/trunk/src/lxml/parser.pxi Log: always use xmlDocCopyNode in deep copying to reuse dictionary Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Thu Jun 8 00:53:40 2006 @@ -647,14 +647,12 @@ "Recursively copy the document and make c_new_root the new root node." cdef xmlDoc* result cdef xmlNode* c_node - if c_new_root.parent is c_doc: - result = tree.xmlCopyDoc(c_doc, 1) # recursive doc copy - __GLOBAL_PARSER_CONTEXT._initDocDict(result) - else: - result = tree.xmlCopyDoc(c_doc, 2) # non recursive, but with ns - __GLOBAL_PARSER_CONTEXT._initDocDict(result) - c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive - tree.xmlDocSetRootElement(result, c_node) + result = tree.xmlCopyDoc(c_doc, 2) # non recursive, but with ns + __GLOBAL_PARSER_CONTEXT._initDocDict(result) + c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive + tree.xmlDocSetRootElement(result, c_node) + if c_new_root.parent is not c_doc: + # do not copy the tail for the root node - done automatically _copyTail(c_new_root.next, c_node) if c_doc.URL is not NULL: # handle a bug in older libxml2 versions From scoder at codespeak.net Thu Jun 8 00:57:40 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 00:57:40 +0200 (CEST) Subject: [Lxml-checkins] r28492 - in lxml/branch/lxml-1.0/src/lxml: . tests Message-ID: <20060607225740.3125410070@code0.codespeak.net> Author: scoder Date: Thu Jun 8 00:57:38 2006 New Revision: 28492 Modified: lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi lxml/branch/lxml-1.0/src/lxml/etree.pyx lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py Log: merged in deep copy fixes from trunk Modified: lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi Thu Jun 8 00:57:38 2006 @@ -280,6 +280,19 @@ c_target = c_tail c_tail = c_next +cdef void _copyTail(xmlNode* c_tail, xmlNode* c_target): + cdef xmlNode* c_new_tail + # tail copying support: look for any text nodes trailing this node and + # copy it to the target node + while c_tail is not NULL and c_tail.type == tree.XML_TEXT_NODE: + if c_target.doc is not c_tail.doc: + c_new_tail = tree.xmlDocCopyNode(c_tail, c_target.doc, 0) + else: + c_new_tail = tree.xmlCopyNode(c_tail, 0) + tree.xmlAddNextSibling(c_target, c_new_tail) + c_target = c_new_tail + c_tail = c_tail.next + cdef xmlNode* _deleteSlice(xmlNode* c_node, Py_ssize_t start, Py_ssize_t stop): """Delete slice, starting with c_node, start counting at start, end at stop. """ Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Thu Jun 8 00:57:38 2006 @@ -638,7 +638,7 @@ cdef _Document new_doc doc = self._doc c_doc = _copyDocRoot(doc._c_doc, self._c_node) # recursive - new_doc = _documentFactory(c_doc, doc._parser) + new_doc = _documentFactory(c_doc, doc._parser.copy()) return new_doc.getroot() def set(self, key, value): Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Thu Jun 8 00:57:38 2006 @@ -646,16 +646,19 @@ cdef xmlDoc* _copyDocRoot(xmlDoc* c_doc, xmlNode* c_new_root): "Recursively copy the document and make c_new_root the new root node." cdef xmlDoc* result - cdef xmlDoc* fake_c_doc - fake_c_doc = _fakeRootDoc(c_doc, c_new_root) - result = tree.xmlCopyDoc(fake_c_doc, 1) - _destroyFakeDoc(c_doc, fake_c_doc) + cdef xmlNode* c_node + result = tree.xmlCopyDoc(c_doc, 2) # non recursive, but with ns + __GLOBAL_PARSER_CONTEXT._initDocDict(result) + c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive + tree.xmlDocSetRootElement(result, c_node) + if c_new_root.parent is not c_doc: + # do not copy the tail for the root node - done automatically + _copyTail(c_new_root.next, c_node) if c_doc.URL is not NULL: # handle a bug in older libxml2 versions if result.URL is not NULL: tree.xmlFree(result.URL) result.URL = tree.xmlStrdup(c_doc.URL) - __GLOBAL_PARSER_CONTEXT._initDocDict(result) return result ############################################################ Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py Thu Jun 8 00:57:38 2006 @@ -1935,6 +1935,60 @@ self.assertEquals('Bar', b.text) self.assertEquals('Foo', a.text) + del a + self.assertEquals('Bar', b.text) + + def test_deepcopy_tail(self): + Element = self.etree.Element + + a = Element('a') + a.tail = 'Foo' + + b = copy.deepcopy(a) + self.assertEquals('Foo', b.tail) + + b.tail = 'Bar' + self.assertEquals('Bar', b.tail) + self.assertEquals('Foo', a.tail) + + del a + self.assertEquals('Bar', b.tail) + + def test_deepcopy_subelement(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + root = Element('root') + a = SubElement(root, 'a') + a.text = 'FooText' + a.tail = 'FooTail' + + b = copy.deepcopy(a) + self.assertEquals('FooText', b.text) + self.assertEquals('FooTail', b.tail) + + b.text = 'BarText' + b.tail = 'BarTail' + self.assertEquals('BarTail', b.tail) + self.assertEquals('FooTail', a.tail) + self.assertEquals('BarText', b.text) + self.assertEquals('FooText', a.text) + + del a + self.assertEquals('BarTail', b.tail) + self.assertEquals('BarText', b.text) + + def test_deepcopy_namespaces(self): + root = self.etree.XML(''' + + ''') + self.assertEquals( + root[0][0].get('{tns}foo'), + copy.deepcopy(root[0])[0].get('{tns}foo') ) + self.assertEquals( + root[0][0].get('{tns}foo'), + copy.deepcopy(root[0][0]).get('{tns}foo') ) + def test_shallowcopy(self): Element = self.etree.Element From scoder at codespeak.net Thu Jun 8 01:17:03 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 01:17:03 +0200 (CEST) Subject: [Lxml-checkins] r28493 - lxml/trunk/src/lxml Message-ID: <20060607231703.2CEDE10070@code0.codespeak.net> Author: scoder Date: Thu Jun 8 01:17:01 2006 New Revision: 28493 Modified: lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/python.pxd Log: create Python list of correct size if we know it Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Thu Jun 8 01:17:01 2006 @@ -337,7 +337,7 @@ cdef int i doc = context._doc try: - args = [] + args = python.PyList_New(nargs) for i from 0 <= i < nargs: obj = xpath.valuePop(ctxt) o = _unwrapXPathObject(obj, doc) Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Thu Jun 8 01:17:01 2006 @@ -28,6 +28,7 @@ cdef object PyBool_FromLong(long value) cdef object PyNumber_Int(object value) + cdef object PyList_New(int size) cdef Py_ssize_t PyList_GET_SIZE(object l) cdef int PyList_Append(object l, object obj) cdef int PyList_Reverse(object l) From scoder at codespeak.net Thu Jun 8 09:25:02 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 09:25:02 +0200 (CEST) Subject: [Lxml-checkins] r28494 - lxml/trunk/src/lxml Message-ID: <20060608072502.740F710050@code0.codespeak.net> Author: scoder Date: Thu Jun 8 09:25:00 2006 New Revision: 28494 Modified: lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/python.pxd Log: reverted last patch, can crash Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Thu Jun 8 09:25:00 2006 @@ -337,7 +337,7 @@ cdef int i doc = context._doc try: - args = python.PyList_New(nargs) + args = [] for i from 0 <= i < nargs: obj = xpath.valuePop(ctxt) o = _unwrapXPathObject(obj, doc) Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Thu Jun 8 09:25:00 2006 @@ -28,7 +28,6 @@ cdef object PyBool_FromLong(long value) cdef object PyNumber_Int(object value) - cdef object PyList_New(int size) cdef Py_ssize_t PyList_GET_SIZE(object l) cdef int PyList_Append(object l, object obj) cdef int PyList_Reverse(object l) From scoder at codespeak.net Thu Jun 8 09:50:12 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 09:50:12 +0200 (CEST) Subject: [Lxml-checkins] r28495 - lxml/trunk Message-ID: <20060608075012.4992B10050@code0.codespeak.net> Author: scoder Date: Thu Jun 8 09:50:11 2006 New Revision: 28495 Modified: lxml/trunk/bench.py Log: new benchmark for plain deep copy of root Modified: lxml/trunk/bench.py ============================================================================== --- lxml/trunk/bench.py (original) +++ lxml/trunk/bench.py Thu Jun 8 09:50:11 2006 @@ -407,6 +407,9 @@ for child in root: copy.deepcopy(child) + def bench_deepcopy_all(self, root): + copy.deepcopy(root) + def bench_tag(self, root): for child in root: child.tag From scoder at codespeak.net Thu Jun 8 09:51:25 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 09:51:25 +0200 (CEST) Subject: [Lxml-checkins] r28496 - in lxml/trunk: . src/lxml Message-ID: <20060608075125.31B3910050@code0.codespeak.net> Author: scoder Date: Thu Jun 8 09:51:23 2006 New Revision: 28496 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/tree.pxd Log: fix: last fix for deepcopy introduced memory leak, deep copying is now cleaner and faster Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 8 09:51:23 2006 @@ -23,6 +23,10 @@ Bugs fixed ---------- +* Deep copying Elements could loose namespaces declared in parents + +* Deep copying Elements did not copy tail + * Parsing file(-like) objects failed to load external entities * Parsing 8-bit strings from file(-like) objects raised an exception Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 8 09:51:23 2006 @@ -632,7 +632,6 @@ return self.__copy__() def __copy__(self): - cdef xmlNode* c_node cdef xmlDoc* c_doc cdef _Document doc cdef _Document new_doc Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Thu Jun 8 09:51:23 2006 @@ -647,13 +647,11 @@ "Recursively copy the document and make c_new_root the new root node." cdef xmlDoc* result cdef xmlNode* c_node - result = tree.xmlCopyDoc(c_doc, 2) # non recursive, but with ns + result = tree.xmlCopyDoc(c_doc, 0) # non recursive __GLOBAL_PARSER_CONTEXT._initDocDict(result) c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive tree.xmlDocSetRootElement(result, c_node) - if c_new_root.parent is not c_doc: - # do not copy the tail for the root node - done automatically - _copyTail(c_new_root.next, c_node) + _copyTail(c_new_root.next, c_node) if c_doc.URL is not NULL: # handle a bug in older libxml2 versions if result.URL is not NULL: Modified: lxml/trunk/src/lxml/tree.pxd ============================================================================== --- lxml/trunk/src/lxml/tree.pxd (original) +++ lxml/trunk/src/lxml/tree.pxd Thu Jun 8 09:51:23 2006 @@ -186,7 +186,6 @@ cdef xmlNode* xmlDocSetRootElement(xmlDoc* doc, xmlNode* root) cdef xmlNode* xmlDocGetRootElement(xmlDoc* doc) cdef void xmlSetTreeDoc(xmlNode* tree, xmlDoc* doc) - cdef xmlNode* xmlDocCopyNode(xmlNode* node, xmlDoc* doc, int extended) cdef xmlAttr* xmlHasProp(xmlNode* node, char* name) cdef xmlAttr* xmlHasNsProp(xmlNode* node, char* name, char* nameSpace) cdef char* xmlNodeGetContent(xmlNode* cur) @@ -201,6 +200,7 @@ cdef void xmlNodeSetContent(xmlNode* cur, char* content) cdef xmlDoc* xmlCopyDoc(xmlDoc* doc, int recursive) cdef xmlNode* xmlCopyNode(xmlNode* node, int extended) + cdef xmlNode* xmlDocCopyNode(xmlNode* node, xmlDoc* doc, int extended) cdef int xmlReconciliateNs(xmlDoc* doc, xmlNode* tree) cdef xmlBuffer* xmlBufferCreate() cdef char* xmlBufferContent(xmlBuffer* buf) From scoder at codespeak.net Thu Jun 8 09:54:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 09:54:31 +0200 (CEST) Subject: [Lxml-checkins] r28497 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060608075431.B252910050@code0.codespeak.net> Author: scoder Date: Thu Jun 8 09:54:29 2006 New Revision: 28497 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/bench.py lxml/branch/lxml-1.0/src/lxml/etree.pyx lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/tree.pxd Log: merged in deep copy fixes from trunk Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Thu Jun 8 09:54:29 2006 @@ -10,6 +10,10 @@ Bugs fixed ---------- +* Deep copying Elements could loose namespaces declared in parents + +* Deep copying Elements did not copy tail + * Parsing file(-like) objects failed to load external entities * Parsing 8-bit strings from file(-like) objects raised an exception Modified: lxml/branch/lxml-1.0/bench.py ============================================================================== --- lxml/branch/lxml-1.0/bench.py (original) +++ lxml/branch/lxml-1.0/bench.py Thu Jun 8 09:54:29 2006 @@ -407,6 +407,9 @@ for child in root: copy.deepcopy(child) + def bench_deepcopy_all(self, root): + copy.deepcopy(root) + def bench_tag(self, root): for child in root: child.tag Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Thu Jun 8 09:54:29 2006 @@ -632,7 +632,6 @@ return self.__copy__() def __copy__(self): - cdef xmlNode* c_node cdef xmlDoc* c_doc cdef _Document doc cdef _Document new_doc Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Thu Jun 8 09:54:29 2006 @@ -647,13 +647,11 @@ "Recursively copy the document and make c_new_root the new root node." cdef xmlDoc* result cdef xmlNode* c_node - result = tree.xmlCopyDoc(c_doc, 2) # non recursive, but with ns + result = tree.xmlCopyDoc(c_doc, 0) # non recursive __GLOBAL_PARSER_CONTEXT._initDocDict(result) c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive tree.xmlDocSetRootElement(result, c_node) - if c_new_root.parent is not c_doc: - # do not copy the tail for the root node - done automatically - _copyTail(c_new_root.next, c_node) + _copyTail(c_new_root.next, c_node) if c_doc.URL is not NULL: # handle a bug in older libxml2 versions if result.URL is not NULL: Modified: lxml/branch/lxml-1.0/src/lxml/tree.pxd ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tree.pxd (original) +++ lxml/branch/lxml-1.0/src/lxml/tree.pxd Thu Jun 8 09:54:29 2006 @@ -186,7 +186,6 @@ cdef xmlNode* xmlDocSetRootElement(xmlDoc* doc, xmlNode* root) cdef xmlNode* xmlDocGetRootElement(xmlDoc* doc) cdef void xmlSetTreeDoc(xmlNode* tree, xmlDoc* doc) - cdef xmlNode* xmlDocCopyNode(xmlNode* node, xmlDoc* doc, int extended) cdef xmlAttr* xmlHasProp(xmlNode* node, char* name) cdef xmlAttr* xmlHasNsProp(xmlNode* node, char* name, char* nameSpace) cdef char* xmlNodeGetContent(xmlNode* cur) @@ -201,6 +200,7 @@ cdef void xmlNodeSetContent(xmlNode* cur, char* content) cdef xmlDoc* xmlCopyDoc(xmlDoc* doc, int recursive) cdef xmlNode* xmlCopyNode(xmlNode* node, int extended) + cdef xmlNode* xmlDocCopyNode(xmlNode* node, xmlDoc* doc, int extended) cdef int xmlReconciliateNs(xmlDoc* doc, xmlNode* tree) cdef xmlBuffer* xmlBufferCreate() cdef char* xmlBufferContent(xmlBuffer* buf) From scoder at codespeak.net Thu Jun 8 10:15:19 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 10:15:19 +0200 (CEST) Subject: [Lxml-checkins] r28499 - lxml/trunk/src/lxml Message-ID: <20060608081519.761BC1006F@code0.codespeak.net> Author: scoder Date: Thu Jun 8 10:15:18 2006 New Revision: 28499 Modified: lxml/trunk/src/lxml/parser.pxi Log: implemented xmlDocCopy URL bug fix in a clean way, only needed for libxml2 <= 2.6.17 Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Thu Jun 8 10:15:18 2006 @@ -635,11 +635,7 @@ cdef xmlDoc* _copyDoc(xmlDoc* c_doc, int recursive): cdef xmlDoc* result result = tree.xmlCopyDoc(c_doc, recursive) - if c_doc.URL is not NULL: - # handle a bug in older libxml2 versions - if result.URL is not NULL: - tree.xmlFree(result.URL) - result.URL = tree.xmlStrdup(c_doc.URL) + _bugFixURL(c_doc, result) __GLOBAL_PARSER_CONTEXT._initDocDict(result) return result @@ -648,17 +644,21 @@ cdef xmlDoc* result cdef xmlNode* c_node result = tree.xmlCopyDoc(c_doc, 0) # non recursive + _bugFixURL(c_doc, result) __GLOBAL_PARSER_CONTEXT._initDocDict(result) c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive tree.xmlDocSetRootElement(result, c_node) _copyTail(c_new_root.next, c_node) - if c_doc.URL is not NULL: - # handle a bug in older libxml2 versions - if result.URL is not NULL: - tree.xmlFree(result.URL) - result.URL = tree.xmlStrdup(c_doc.URL) return result +cdef void _bugFixURL(xmlDoc* c_source_doc, xmlDoc* c_target_doc): + """libxml2 <= 2.6.17 had a bug that prevented them from copying the + document URL in xmlDocCopy()""" + if c_source_doc.URL is not NULL and _LIBXML_VERSION_INT < 20618: + if c_target_doc.URL is not NULL: + tree.xmlFree(c_target_doc.URL) + c_target_doc.URL = tree.xmlStrdup(c_source_doc.URL) + ############################################################ ## API level helper functions for _Document creation ## (here we convert to UTF-8) From scoder at codespeak.net Thu Jun 8 10:15:58 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 10:15:58 +0200 (CEST) Subject: [Lxml-checkins] r28500 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060608081558.E6B5D1006F@code0.codespeak.net> Author: scoder Date: Thu Jun 8 10:15:57 2006 New Revision: 28500 Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi Log: implemented xmlDocCopy URL bug fix in a clean way, only needed for libxml2 <= 2.6.17 Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Thu Jun 8 10:15:57 2006 @@ -635,11 +635,7 @@ cdef xmlDoc* _copyDoc(xmlDoc* c_doc, int recursive): cdef xmlDoc* result result = tree.xmlCopyDoc(c_doc, recursive) - if c_doc.URL is not NULL: - # handle a bug in older libxml2 versions - if result.URL is not NULL: - tree.xmlFree(result.URL) - result.URL = tree.xmlStrdup(c_doc.URL) + _bugFixURL(c_doc, result) __GLOBAL_PARSER_CONTEXT._initDocDict(result) return result @@ -648,17 +644,21 @@ cdef xmlDoc* result cdef xmlNode* c_node result = tree.xmlCopyDoc(c_doc, 0) # non recursive + _bugFixURL(c_doc, result) __GLOBAL_PARSER_CONTEXT._initDocDict(result) c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive tree.xmlDocSetRootElement(result, c_node) _copyTail(c_new_root.next, c_node) - if c_doc.URL is not NULL: - # handle a bug in older libxml2 versions - if result.URL is not NULL: - tree.xmlFree(result.URL) - result.URL = tree.xmlStrdup(c_doc.URL) return result +cdef void _bugFixURL(xmlDoc* c_source_doc, xmlDoc* c_target_doc): + """libxml2 <= 2.6.17 had a bug that prevented them from copying the + document URL in xmlDocCopy()""" + if c_source_doc.URL is not NULL and _LIBXML_VERSION_INT < 20618: + if c_target_doc.URL is not NULL: + tree.xmlFree(c_target_doc.URL) + c_target_doc.URL = tree.xmlStrdup(c_source_doc.URL) + ############################################################ ## API level helper functions for _Document creation ## (here we convert to UTF-8) From scoder at codespeak.net Thu Jun 8 12:27:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 12:27:08 +0200 (CEST) Subject: [Lxml-checkins] r28505 - lxml/trunk/src/lxml Message-ID: <20060608102708.9EEE01007A@code0.codespeak.net> Author: scoder Date: Thu Jun 8 12:27:06 2006 New Revision: 28505 Modified: lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/nsclasses.pxi lxml/trunk/src/lxml/xpath.pxi lxml/trunk/src/lxml/xslt.pxi Log: fix for XSLT+extension+include bug: reverting to pre-registration of functions fixes it, cleanup in nsclasses.pxi taken from xsltext branch, no test case yet Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Thu Jun 8 12:27:06 2006 @@ -14,7 +14,6 @@ cdef class _BaseContext: cdef xpath.xmlXPathContext* _xpathCtxt - cdef xpath.xmlXPathFuncLookupFunc _ext_lookup_function cdef _Document _doc cdef object _extensions cdef object _namespaces @@ -41,6 +40,9 @@ new_extensions = {} for extension in extensions: for (ns_uri, name), function in extension.items(): + if name is None: + raise ValueError, \ + "extensions must have non empty names and namespaces" ns_utf = self._to_utf(ns_uri) name_utf = self._to_utf(name) python.PyDict_SetItem( @@ -77,8 +79,6 @@ namespaces = self._namespaces if namespaces is not None: self.registerNamespaces(namespaces) - xpath.xmlXPathRegisterFuncLookup( - self._xpathCtxt, self._ext_lookup_function, self) cdef _unregister_context(self): xpath.xmlXPathRegisteredNsCleanup(self._xpathCtxt) @@ -318,6 +318,7 @@ fref = "{%s}%s" % (rctxt.functionURI, rctxt.function) else: fref = rctxt.function + print "FAILED", fref xpath.xmlXPathErr(ctxt, xpath.XPATH_EXPR_ERROR) exception = XPathFunctionError("XPath function '%s' not found" % fref) context._exc._store_exception(exception) Modified: lxml/trunk/src/lxml/nsclasses.pxi ============================================================================== --- lxml/trunk/src/lxml/nsclasses.pxi (original) +++ lxml/trunk/src/lxml/nsclasses.pxi Thu Jun 8 12:27:06 2006 @@ -30,7 +30,7 @@ return __NAMESPACE_REGISTRIES[ns_utf] except KeyError: registry = __NAMESPACE_REGISTRIES[ns_utf] = \ - _NamespaceRegistry(ns_uri) + _ClassNamespaceRegistry(ns_uri) return registry def FunctionNamespace(ns_uri): @@ -45,16 +45,15 @@ return __FUNCTION_NAMESPACE_REGISTRIES[ns_utf] except KeyError: registry = __FUNCTION_NAMESPACE_REGISTRIES[ns_utf] = \ - _FunctionNamespaceRegistry(ns_uri) + _XPathFunctionNamespaceRegistry(ns_uri) return registry cdef class _NamespaceRegistry: - "Dictionary-like registry for namespace implementations" + "Dictionary-like namespace registry" cdef object _ns_uri cdef object _ns_uri_utf - cdef object _classes - cdef object _extensions + cdef object _entries cdef char* _c_ns_uri_utf def __init__(self, ns_uri): self._ns_uri = ns_uri @@ -64,57 +63,78 @@ else: self._ns_uri_utf = _utf8(ns_uri) self._c_ns_uri_utf = _cstr(self._ns_uri_utf) - self._classes = {} - self._extensions = {} + self._entries = {} def update(self, class_dict_iterable): - """Forgivingly update the registry. If registered values are - neither subclasses of ElementBase nor callable extension - functions, or if their name starts with '_', they will be - silently discarded. This allows registrations at the module or - class level using vars(), globals() etc.""" - if hasattr(class_dict_iterable, 'iteritems'): - class_dict_iterable = class_dict_iterable.iteritems() - elif hasattr(class_dict_iterable, 'items'): + """Forgivingly update the registry. If registered values do not match + the required type for this registry, or if their name starts with '_', + they will be silently discarded. This allows registrations at the + module or class level using vars(), globals() etc.""" + if hasattr(class_dict_iterable, 'items'): class_dict_iterable = class_dict_iterable.items() for name, item in class_dict_iterable: if (name is None or name[:1] != '_') and callable(item): self[name] = item - def __setitem__(self, name, item): - if python.PyType_Check(item) and issubclass(item, ElementBase): - d = self._classes - elif name is None: - raise NamespaceRegistryError, "Registered name can only be None for elements." - elif callable(item): - d = self._extensions - else: - raise NamespaceRegistryError, "Registered item must be callable." - - if name is None: - name_utf = None - else: - name_utf = _utf8(name) - d[name_utf] = item - def __getitem__(self, name): + if name is not None: + name = _utf8(name) + return self._get(name) + + cdef object _get(self, object name): cdef python.PyObject* dict_result - name_utf = _utf8(name) - dict_result = python.PyDict_GetItem(self._classes, name_utf) + dict_result = python.PyDict_GetItem(self._entries, name) if dict_result is NULL: - dict_result = python.PyDict_GetItem(self._extensions, name_utf) + raise KeyError, "Name not registered." + return dict_result + + cdef object _getForString(self, char* name): + cdef python.PyObject* dict_result + dict_result = python.PyDict_GetItemString(self._entries, name) if dict_result is NULL: raise KeyError, "Name not registered." return dict_result + def __iter__(self): + return iter(self._entries) + + def items(self): + return self._entries.items() + + def iteritems(self): + return self._entries.iteritems() + def clear(self): - self._classes.clear() - self._extensions.clear() + self._entries.clear() + +cdef class _ClassNamespaceRegistry(_NamespaceRegistry): + "Dictionary-like registry for namespace implementation classes" + def __setitem__(self, name, item): + if not python.PyType_Check(item) or \ + not issubclass(item, ElementBase): + raise NamespaceRegistryError, \ + "Registered item must be subtypes of ElementBase" + if name is not None: + name = _utf8(name) + self._entries[name] = item def __repr__(self): return "Namespace(%r)" % self._ns_uri cdef class _FunctionNamespaceRegistry(_NamespaceRegistry): + def __setitem__(self, name, item): + if not callable(item): + raise NamespaceRegistryError, \ + "Registered functions must be callable." + if not name: + raise ValueError, \ + "extensions must have non empty names" + self._entries[_utf8(name)] = item + + def __repr__(self): + return "FunctionNamespace(%r)" % self._ns_uri + +cdef class _XPathFunctionNamespaceRegistry(_FunctionNamespaceRegistry): cdef object _prefix cdef object _prefix_utf property prefix: @@ -129,42 +149,28 @@ self._prefix_utf = _utf8(prefix) self._prefix = prefix - def __setitem__(self, name, function): - if not callable(function): - raise NamespaceRegistryError, "Registered function must be callable." - if name is None: - name_utf = None - else: - name_utf = _utf8(name) - self._extensions[name_utf] = function - - def __getitem__(self, name): - cdef python.PyObject* dict_result - name_utf = _utf8(name) - dict_result = python.PyDict_GetItem(self._extensions, name_utf) - if dict_result is NULL: - raise KeyError, "Name not registered." - return dict_result - - def __repr__(self): - return "FunctionNamespace(%r)" % self._ns_uri - cdef object _find_all_extension_prefixes(): "Internal lookup function to find all function prefixes for XSLT/XPath." - cdef _FunctionNamespaceRegistry registry + cdef _XPathFunctionNamespaceRegistry registry ns_prefixes = {} for (ns_utf, registry) in __FUNCTION_NAMESPACE_REGISTRIES.iteritems(): if registry._prefix_utf is not None: ns_prefixes[registry._prefix_utf] = ns_utf return ns_prefixes +cdef object _iter_extension_function_names(): + l = [] + for (ns_utf, registry) in __FUNCTION_NAMESPACE_REGISTRIES.iteritems(): + python.PyList_Append(l, (ns_utf, registry)) + return l + cdef object _find_extension(ns_uri_utf, name_utf): cdef python.PyObject* dict_result dict_result = python.PyDict_GetItem( __FUNCTION_NAMESPACE_REGISTRIES, ns_uri_utf) if dict_result is NULL: return None - extensions = (<_NamespaceRegistry>dict_result)._extensions + extensions = (<_NamespaceRegistry>dict_result)._entries dict_result = python.PyDict_GetItem(extensions, name_utf) if dict_result is NULL: return None @@ -185,7 +191,7 @@ return _Element registry = <_NamespaceRegistry>dict_result - classes = registry._classes + classes = registry._entries if c_element_name_utf is not NULL: dict_result = python.PyDict_GetItemString( Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Thu Jun 8 12:27:06 2006 @@ -12,7 +12,6 @@ cdef class _XPathContext(_BaseContext): cdef object _variables def __init__(self, namespaces, extensions, variables): - self._ext_lookup_function = _function_check self._variables = variables _BaseContext.__init__(self, namespaces, extensions) @@ -24,6 +23,8 @@ self._register_context(doc) if self._variables is not None: self.registerVariables(self._variables) + xpath.xmlXPathRegisterFuncLookup( + self._xpathCtxt, _function_check, self) cdef unregister_context(self): cdef xpath.xmlXPathContext* xpathCtxt Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Thu Jun 8 12:27:06 2006 @@ -183,7 +183,6 @@ cdef xslt.xsltTransformContext* _xsltCtxt def __init__(self, namespaces, extensions): self._xsltCtxt = NULL - self._ext_lookup_function = _xslt_function_check if extensions and None in extensions: raise XSLTExtensionError, "extensions must not have empty namespaces" _BaseContext.__init__(self, namespaces, extensions) @@ -194,6 +193,7 @@ self._set_xpath_context(xsltCtxt.xpathCtxt) self._register_context(doc) xsltCtxt.xpathCtxt.userData = self + self._registerExtensionFunctions() cdef free_context(self): cdef xslt.xsltTransformContext* xsltCtxt @@ -205,11 +205,44 @@ xslt.xsltFreeTransformContext(xsltCtxt) self._release_temp_refs() - cdef _registerLocalExtensionFunction(self, ns_utf, name_utf, function): + cdef void _registerLocalExtensionFunction(self, ns_utf, name_utf, function): if self._extensions is None: self._extensions = {} python.PyDict_SetItem(self._extensions, (ns_utf, name_utf), function) + cdef void _registerExtensionFunctions(self): + cdef python.PyObject* dict_result + if self._extensions is not None: + for (ns_utf, name_utf), function in self._extensions.iteritems(): + if ns_utf is None: + raise ValueError, \ + "extensions must have non empty namespaces" + dict_result = python.PyDict_GetItem( + self._function_cache_ns, ns_utf) + if dict_result is NULL: + d = {} + python.PyDict_SetItem(self._function_cache_ns, ns_utf, d) + else: + d = dict_result + python.PyDict_SetItem(d, name_utf, function) + xslt.xsltRegisterExtFunction( + self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), + _xpath_function_call) + for ns_utf, functions in _iter_extension_function_names(): + if ns_utf is None: + continue + dict_result = python.PyDict_GetItem(self._function_cache_ns, ns_utf) + if dict_result is NULL: + d = {} + python.PyDict_SetItem(self._function_cache_ns, ns_utf, d) + else: + d = dict_result + for name_utf, function in functions.iteritems(): + python.PyDict_SetItem(d, name_utf, function) + xslt.xsltRegisterExtFunction( + self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), + _xpath_function_call) + cdef class _ExsltRegExp # forward declaration cdef class XSLT: @@ -258,7 +291,8 @@ self._context = _XSLTContext(None, extensions) self._error_log = _ErrorLog() if regexp: - self._regexp = _ExsltRegExp() + self._regexp = _ExsltRegExp() + self._regexp._register_in_context(self._context) else: self._regexp = None # XXX is it worthwile to use xsltPrecomputeStylesheet here? @@ -332,9 +366,6 @@ params = NULL self._context.register_context(transform_ctxt, input_doc) - if self._regexp is not None: - self._regexp._register_in_context(self._context) - c_result = xslt.xsltApplyStylesheetUser(self._c_style, c_doc, params, NULL, NULL, transform_ctxt) From scoder at codespeak.net Thu Jun 8 14:42:58 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 14:42:58 +0200 (CEST) Subject: [Lxml-checkins] r28509 - lxml/trunk/doc Message-ID: <20060608124258.338671007D@code0.codespeak.net> Author: scoder Date: Thu Jun 8 14:42:57 2006 New Revision: 28509 Modified: lxml/trunk/doc/FAQ.txt Log: FAQ entry on XPath default namespace Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Thu Jun 8 14:42:57 2006 @@ -101,6 +101,13 @@ serialization. +#) How can I specify a default namespace for XPath expressions? + + You can't. In XPath, there is no such thing as a default namespace. Just + use an arbitrary prefix and let the namespace dictionary of the XPath + evaluators map it to your namespace. See also the question above. + + #) What are the ``findall()`` and ``xpath()`` methods on Element(Tree)? ``findall()`` is part of the original `ElementTree API`_. It supports a From scoder at codespeak.net Thu Jun 8 14:43:32 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 14:43:32 +0200 (CEST) Subject: [Lxml-checkins] r28510 - lxml/branch/lxml-1.0/doc Message-ID: <20060608124332.A66E71007D@code0.codespeak.net> Author: scoder Date: Thu Jun 8 14:43:31 2006 New Revision: 28510 Modified: lxml/branch/lxml-1.0/doc/FAQ.txt Log: merged in FAQ update from trunk Modified: lxml/branch/lxml-1.0/doc/FAQ.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/FAQ.txt (original) +++ lxml/branch/lxml-1.0/doc/FAQ.txt Thu Jun 8 14:43:31 2006 @@ -101,6 +101,13 @@ serialization. +#) How can I specify a default namespace for XPath expressions? + + You can't. In XPath, there is no such thing as a default namespace. Just + use an arbitrary prefix and let the namespace dictionary of the XPath + evaluators map it to your namespace. See also the question above. + + #) What are the ``findall()`` and ``xpath()`` methods on Element(Tree)? ``findall()`` is part of the original `ElementTree API`_. It supports a From scoder at codespeak.net Thu Jun 8 14:55:26 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 14:55:26 +0200 (CEST) Subject: [Lxml-checkins] r28511 - lxml/trunk/doc/html Message-ID: <20060608125526.2C5A61008D@code0.codespeak.net> Author: scoder Date: Thu Jun 8 14:55:25 2006 New Revision: 28511 Added: lxml/trunk/doc/html/ lxml/trunk/doc/html/style.css Log: copied the stylesheet to doc/html/style.css to include it in the distribution Added: lxml/trunk/doc/html/style.css ============================================================================== --- (empty file) +++ lxml/trunk/doc/html/style.css Thu Jun 8 14:55:25 2006 @@ -0,0 +1,98 @@ +body { + /* CSS Hack for IE that does not respect the "margin: auto" rule at the + * document level */ + text-align: center; + padding: 1em; +} + +div.document { + width: 45em; + font: 13px Arial, Verdana, Helvetica, sans-serif; + margin: 1em auto 1em auto; + background-color: white; + color: #222; + text-align: left; +} + +h1.title { + background: url(http://codespeak.net/img/codespeak1b.png) no-repeat; + padding: 20px 0 0 180px; + height: 60px; + font-size: 200%; +} + +h1.title, h1 a, h2 a, h3 a { + color: #666; + font-weight: bold; + font-family: Helvetica, sans-serif; +} + +h1 { + font-size: 150%; +} + +h2 { + font-size: 130%; +} + +h3 { + font-size: 110%; +} + +a, a:visited { + background-color: transparent; + font-weight: bold; + color: Black; + text-decoration: none; +} + +p a:active, ul a:active { + color: Red; +} + +p a:hover, ul a:hover { + text-decoration: underline; +} + +p { + /*margin: 0.5em 0em 1em 0em;*/ + text-align: justify; + line-height: 1.5em; + margin: 0.5em 0em 0em 0em; +} + +hr { + clear: both; + height: 1px; + color: #8CACBB; + background-color: transparent; +} + +ul { + line-height: 1.5em; + margin-left: 1em; +} + +ol { + line-height: 1.5em; + margin-left: 0em; +} + +blockquote { + font-family: Times, "Times New Roman", serif; + font-style: italic; +} + +code { + color: Black; + background-color: #cccccc; + font-family: "Courier New", Courier, monospace; +} + +pre { + padding: 0.5em; + border: 1px solid #8cacbb; + color: Black; + background-color: #cccccc; + font-family: "Courier New", Courier, monospace; +} From scoder at codespeak.net Thu Jun 8 14:59:24 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 14:59:24 +0200 (CEST) Subject: [Lxml-checkins] r28512 - lxml/trunk/doc Message-ID: <20060608125924.ED2321008D@code0.codespeak.net> Author: scoder Date: Thu Jun 8 14:59:24 2006 New Revision: 28512 Modified: lxml/trunk/doc/mkhtml.py Log: fix stylesheet URL building Modified: lxml/trunk/doc/mkhtml.py ============================================================================== --- lxml/trunk/doc/mkhtml.py (original) +++ lxml/trunk/doc/mkhtml.py Thu Jun 8 14:59:24 2006 @@ -5,9 +5,7 @@ os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') - stylesheet_url = os.path.join(doc_dir, 'style.css') - - shutil.copy(stylesheet_url, dirname) + stylesheet_url = 'style.css' for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', From scoder at codespeak.net Thu Jun 8 15:01:54 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 15:01:54 +0200 (CEST) Subject: [Lxml-checkins] r28513 - in lxml/branch/lxml-1.0/doc: . html Message-ID: <20060608130154.558451008D@code0.codespeak.net> Author: scoder Date: Thu Jun 8 15:01:53 2006 New Revision: 28513 Added: lxml/branch/lxml-1.0/doc/html/ - copied from r28512, lxml/trunk/doc/html/ lxml/branch/lxml-1.0/doc/html/style.css - copied unchanged from r28511, lxml/trunk/doc/html/style.css Modified: lxml/branch/lxml-1.0/doc/mkhtml.py Log: HTML updates from trunk Modified: lxml/branch/lxml-1.0/doc/mkhtml.py ============================================================================== --- lxml/branch/lxml-1.0/doc/mkhtml.py (original) +++ lxml/branch/lxml-1.0/doc/mkhtml.py Thu Jun 8 15:01:53 2006 @@ -5,9 +5,7 @@ os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') - stylesheet_url = os.path.join(doc_dir, 'style.css') - - shutil.copy(stylesheet_url, dirname) + stylesheet_url = 'style.css' for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', From ogrisel at codespeak.net Thu Jun 8 15:33:44 2006 From: ogrisel at codespeak.net (ogrisel at codespeak.net) Date: Thu, 8 Jun 2006 15:33:44 +0200 (CEST) Subject: [Lxml-checkins] r28517 - lxml/trunk Message-ID: <20060608133344.2A96310078@code0.codespeak.net> Author: ogrisel Date: Thu Jun 8 15:33:43 2006 New Revision: 28517 Modified: lxml/trunk/Makefile Log: added Makefile target to trigger pyflakes, a useful and fast linter to detect useless imports and potential bugs Modified: lxml/trunk/Makefile ============================================================================== --- lxml/trunk/Makefile (original) +++ lxml/trunk/Makefile Thu Jun 8 15:33:43 2006 @@ -1,4 +1,5 @@ PYTHON?=python +PYFLAKES=pyflakes TESTFLAGS=-p -v TESTOPTS= SETUPFLAGS= @@ -33,6 +34,10 @@ mkdir -p doc/html $(PYTHON) doc/mkhtml.py doc/html . `cat version.txt` +# run pyflakes on all python files (`easy_install pyflakes` first) +lint: + $(PYFLAKES) . + # XXX What should the default be? test: test_inplace From ogrisel at codespeak.net Thu Jun 8 15:34:28 2006 From: ogrisel at codespeak.net (ogrisel at codespeak.net) Date: Thu, 8 Jun 2006 15:34:28 +0200 (CEST) Subject: [Lxml-checkins] r28519 - lxml/trunk/doc Message-ID: <20060608133428.6E9C21009A@code0.codespeak.net> Author: ogrisel Date: Thu Jun 8 15:34:28 2006 New Revision: 28519 Modified: lxml/trunk/doc/mkhtml.py Log: useless import Modified: lxml/trunk/doc/mkhtml.py ============================================================================== --- lxml/trunk/doc/mkhtml.py (original) +++ lxml/trunk/doc/mkhtml.py Thu Jun 8 15:34:28 2006 @@ -1,4 +1,4 @@ -import os, shutil, sys +import os, sys def publish(dirname, lxml_path, release): if not os.path.exists(dirname): From scoder at codespeak.net Thu Jun 8 16:00:40 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 16:00:40 +0200 (CEST) Subject: [Lxml-checkins] r28526 - in lxml/trunk: . src/lxml Message-ID: <20060608140040.6E568100A9@code0.codespeak.net> Author: scoder Date: Thu Jun 8 16:00:38 2006 New Revision: 28526 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/xpath.pxi Log: some code cleanup after XSLT bugfix Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 8 16:00:38 2006 @@ -23,6 +23,9 @@ Bugs fixed ---------- +* Extension function calls in XSLT variable declarations could break the + stylesheet and crash on repeated calls + * Deep copying Elements could loose namespaces declared in parents * Deep copying Elements did not copy tail Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Thu Jun 8 16:00:38 2006 @@ -42,7 +42,7 @@ for (ns_uri, name), function in extension.items(): if name is None: raise ValueError, \ - "extensions must have non empty names and namespaces" + "extensions must have non empty names" ns_utf = self._to_utf(ns_uri) name_utf = self._to_utf(name) python.PyDict_SetItem( @@ -109,8 +109,28 @@ # extension functions + cdef _find_cached_function(self, char* c_ns_uri, char* c_name): + """Lookup an extension function in the cache and return it. + + Parameters: c_ns_uri may be NULL, c_name must not be NULL + """ + cdef python.PyObject* c_dict + cdef python.PyObject* dict_result + if c_ns_uri is NULL: + c_dict = self._function_cache + else: + c_dict = python.PyDict_GetItemString( + self._function_cache_ns, c_ns_uri) + + if c_dict is not NULL: + dict_result = python.PyDict_GetItemString(c_dict, c_name) + if dict_result is not NULL: + return dict_result + return None + cdef int _prepare_function_call(self, char* c_ns_uri, char* c_name): """Find an extension function and store it in 'self._called_function'. + This is absolutely performance-critical for XPath/XSLT! Return 1 if it was found, 0 otherwise. Parameters: c_ns_uri may be NULL, c_name must not be NULL @@ -311,15 +331,16 @@ cdef _BaseContext context rctxt = ctxt.context context = <_BaseContext>(rctxt.userData) - if context._prepare_function_call(rctxt.functionURI, rctxt.function): - _extension_function_call(context, ctxt, nargs) + function = context._find_cached_function(rctxt.functionURI, rctxt.function) + if function is not None: + _extension_function_call(context, function, ctxt, nargs) else: if rctxt.functionURI is not NULL: fref = "{%s}%s" % (rctxt.functionURI, rctxt.function) else: fref = rctxt.function print "FAILED", fref - xpath.xmlXPathErr(ctxt, xpath.XPATH_EXPR_ERROR) + xpath.xmlXPathErr(ctxt, xpath.XML_XPATH_UNKNOWN_FUNC_ERROR) exception = XPathFunctionError("XPath function '%s' not found" % fref) context._exc._store_exception(exception) @@ -328,9 +349,9 @@ cdef _BaseContext context rctxt = ctxt.context context = <_BaseContext>(rctxt.userData) - _extension_function_call(context, ctxt, nargs) + _extension_function_call(context, context._called_function, ctxt, nargs) -cdef void _extension_function_call(_BaseContext context, +cdef void _extension_function_call(_BaseContext context, function, xpath.xmlXPathParserContext* ctxt, int nargs): cdef _NodeBase node cdef _Document doc @@ -346,7 +367,7 @@ python.PyList_Append(args, o) python.PyList_Reverse(args) - res = context._called_function(None, *args) + res = function(None, *args) # wrap result for XPath consumption obj = _wrapXPathObject(res) # prevent Python from deallocating elements handed to libxml2 Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Thu Jun 8 16:00:38 2006 @@ -36,10 +36,14 @@ def registerVariables(self, variable_dict): for name, value in variable_dict.items(): - self._registerVariable(self._to_utf(name), value) + name_utf = self._to_utf(name) + xpath.xmlXPathRegisterVariable( + self._xpathCtxt, _cstr(name_utf), _wrapXPathObject(value)) def registerVariable(self, name, value): - self._registerVariable(self._to_utf(name), value) + name_utf = self._to_utf(name) + xpath.xmlXPathRegisterVariable( + self._xpathCtxt, _cstr(name_utf), _wrapXPathObject(value)) cdef void _registerVariable(self, name_utf, value): xpath.xmlXPathRegisterVariable( From scoder at codespeak.net Thu Jun 8 16:02:07 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 16:02:07 +0200 (CEST) Subject: [Lxml-checkins] r28527 - lxml/trunk Message-ID: <20060608140207.2EC90100A9@code0.codespeak.net> Author: scoder Date: Thu Jun 8 16:02:06 2006 New Revision: 28527 Modified: lxml/trunk/Makefile Log: reverted Modified: lxml/trunk/Makefile ============================================================================== --- lxml/trunk/Makefile (original) +++ lxml/trunk/Makefile Thu Jun 8 16:02:06 2006 @@ -1,5 +1,4 @@ PYTHON?=python -PYFLAKES=pyflakes TESTFLAGS=-p -v TESTOPTS= SETUPFLAGS= @@ -34,10 +33,6 @@ mkdir -p doc/html $(PYTHON) doc/mkhtml.py doc/html . `cat version.txt` -# run pyflakes on all python files (`easy_install pyflakes` first) -lint: - $(PYFLAKES) . - # XXX What should the default be? test: test_inplace From scoder at codespeak.net Thu Jun 8 16:13:01 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 16:13:01 +0200 (CEST) Subject: [Lxml-checkins] r28529 - lxml/trunk/src/lxml Message-ID: <20060608141301.EAD09100B2@code0.codespeak.net> Author: scoder Date: Thu Jun 8 16:13:01 2006 New Revision: 28529 Modified: lxml/trunk/src/lxml/xslt.pxi Log: more code cleanup Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Thu Jun 8 16:13:01 2006 @@ -205,29 +205,13 @@ xslt.xsltFreeTransformContext(xsltCtxt) self._release_temp_refs() - cdef void _registerLocalExtensionFunction(self, ns_utf, name_utf, function): + cdef void _addLocalExtensionFunction(self, ns_utf, name_utf, function): if self._extensions is None: self._extensions = {} python.PyDict_SetItem(self._extensions, (ns_utf, name_utf), function) cdef void _registerExtensionFunctions(self): cdef python.PyObject* dict_result - if self._extensions is not None: - for (ns_utf, name_utf), function in self._extensions.iteritems(): - if ns_utf is None: - raise ValueError, \ - "extensions must have non empty namespaces" - dict_result = python.PyDict_GetItem( - self._function_cache_ns, ns_utf) - if dict_result is NULL: - d = {} - python.PyDict_SetItem(self._function_cache_ns, ns_utf, d) - else: - d = dict_result - python.PyDict_SetItem(d, name_utf, function) - xslt.xsltRegisterExtFunction( - self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), - _xpath_function_call) for ns_utf, functions in _iter_extension_function_names(): if ns_utf is None: continue @@ -242,6 +226,26 @@ xslt.xsltRegisterExtFunction( self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), _xpath_function_call) + if self._extensions is None: + return # done + last_ns = None + for (ns_utf, name_utf), function in self._extensions.iteritems(): + if ns_utf is None: + raise ValueError, \ + "extensions must have non empty namespaces" + elif ns_utf is not last_ns: + last_ns = ns_utf + dict_result = python.PyDict_GetItem( + self._function_cache_ns, ns_utf) + if dict_result is NULL: + d = {} + python.PyDict_SetItem(self._function_cache_ns, ns_utf, d) + else: + d = dict_result + python.PyDict_SetItem(d, name_utf, function) + xslt.xsltRegisterExtFunction( + self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), + _xpath_function_call) cdef class _ExsltRegExp # forward declaration @@ -546,6 +550,6 @@ cdef _register_in_context(self, _XSLTContext context): ns = "http://exslt.org/regular-expressions" - context._registerLocalExtensionFunction(ns, "test", self.test) - context._registerLocalExtensionFunction(ns, "match", self.match) - context._registerLocalExtensionFunction(ns, "replace", self.replace) + context._addLocalExtensionFunction(ns, "test", self.test) + context._addLocalExtensionFunction(ns, "match", self.match) + context._addLocalExtensionFunction(ns, "replace", self.replace) From scoder at codespeak.net Thu Jun 8 16:28:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 16:28:50 +0200 (CEST) Subject: [Lxml-checkins] r28530 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060608142850.B050B1009F@code0.codespeak.net> Author: scoder Date: Thu Jun 8 16:28:49 2006 New Revision: 28530 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/src/lxml/extensions.pxi lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi lxml/branch/lxml-1.0/src/lxml/xpath.pxi lxml/branch/lxml-1.0/src/lxml/xslt.pxi Log: merged in 'bug fix' for XSLT-include/extension bug from trunk Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Thu Jun 8 16:28:49 2006 @@ -10,6 +10,9 @@ Bugs fixed ---------- +* Extension function calls in XSLT variable declarations could break the + stylesheet and crash on repeated calls + * Deep copying Elements could loose namespaces declared in parents * Deep copying Elements did not copy tail Modified: lxml/branch/lxml-1.0/src/lxml/extensions.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/extensions.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/extensions.pxi Thu Jun 8 16:28:49 2006 @@ -14,7 +14,6 @@ cdef class _BaseContext: cdef xpath.xmlXPathContext* _xpathCtxt - cdef xpath.xmlXPathFuncLookupFunc _ext_lookup_function cdef _Document _doc cdef object _extensions cdef object _namespaces @@ -41,6 +40,9 @@ new_extensions = {} for extension in extensions: for (ns_uri, name), function in extension.items(): + if name is None: + raise ValueError, \ + "extensions must have non empty names" ns_utf = self._to_utf(ns_uri) name_utf = self._to_utf(name) python.PyDict_SetItem( @@ -77,8 +79,6 @@ namespaces = self._namespaces if namespaces is not None: self.registerNamespaces(namespaces) - xpath.xmlXPathRegisterFuncLookup( - self._xpathCtxt, self._ext_lookup_function, self) cdef _unregister_context(self): xpath.xmlXPathRegisteredNsCleanup(self._xpathCtxt) @@ -109,8 +109,28 @@ # extension functions + cdef _find_cached_function(self, char* c_ns_uri, char* c_name): + """Lookup an extension function in the cache and return it. + + Parameters: c_ns_uri may be NULL, c_name must not be NULL + """ + cdef python.PyObject* c_dict + cdef python.PyObject* dict_result + if c_ns_uri is NULL: + c_dict = self._function_cache + else: + c_dict = python.PyDict_GetItemString( + self._function_cache_ns, c_ns_uri) + + if c_dict is not NULL: + dict_result = python.PyDict_GetItemString(c_dict, c_name) + if dict_result is not NULL: + return dict_result + return None + cdef int _prepare_function_call(self, char* c_ns_uri, char* c_name): """Find an extension function and store it in 'self._called_function'. + This is absolutely performance-critical for XPath/XSLT! Return 1 if it was found, 0 otherwise. Parameters: c_ns_uri may be NULL, c_name must not be NULL @@ -312,14 +332,16 @@ cdef _BaseContext context rctxt = ctxt.context context = <_BaseContext>(rctxt.userData) - if context._prepare_function_call(rctxt.functionURI, rctxt.function): - _extension_function_call(context, ctxt, nargs) + function = context._find_cached_function(rctxt.functionURI, rctxt.function) + if function is not None: + _extension_function_call(context, function, ctxt, nargs) else: if rctxt.functionURI is not NULL: fref = "{%s}%s" % (rctxt.functionURI, rctxt.function) else: fref = rctxt.function - xpath.xmlXPathErr(ctxt, xpath.XPATH_EXPR_ERROR) + print "FAILED", fref + xpath.xmlXPathErr(ctxt, xpath.XML_XPATH_UNKNOWN_FUNC_ERROR) exception = XPathFunctionError("XPath function '%s' not found" % fref) context._exc._store_exception(exception) @@ -328,9 +350,9 @@ cdef _BaseContext context rctxt = ctxt.context context = <_BaseContext>(rctxt.userData) - _extension_function_call(context, ctxt, nargs) + _extension_function_call(context, context._called_function, ctxt, nargs) -cdef void _extension_function_call(_BaseContext context, +cdef void _extension_function_call(_BaseContext context, function, xpath.xmlXPathParserContext* ctxt, int nargs): cdef _NodeBase node cdef _Document doc @@ -346,7 +368,7 @@ python.PyList_Append(args, o) python.PyList_Reverse(args) - res = context._called_function(None, *args) + res = function(None, *args) # wrap result for XPath consumption obj = _wrapXPathObject(res) # prevent Python from deallocating elements handed to libxml2 Modified: lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi Thu Jun 8 16:28:49 2006 @@ -30,7 +30,7 @@ return __NAMESPACE_REGISTRIES[ns_utf] except KeyError: registry = __NAMESPACE_REGISTRIES[ns_utf] = \ - _NamespaceRegistry(ns_uri) + _ClassNamespaceRegistry(ns_uri) return registry def FunctionNamespace(ns_uri): @@ -45,16 +45,15 @@ return __FUNCTION_NAMESPACE_REGISTRIES[ns_utf] except KeyError: registry = __FUNCTION_NAMESPACE_REGISTRIES[ns_utf] = \ - _FunctionNamespaceRegistry(ns_uri) + _XPathFunctionNamespaceRegistry(ns_uri) return registry cdef class _NamespaceRegistry: - "Dictionary-like registry for namespace implementations" + "Dictionary-like namespace registry" cdef object _ns_uri cdef object _ns_uri_utf - cdef object _classes - cdef object _extensions + cdef object _entries cdef char* _c_ns_uri_utf def __init__(self, ns_uri): self._ns_uri = ns_uri @@ -64,57 +63,78 @@ else: self._ns_uri_utf = _utf8(ns_uri) self._c_ns_uri_utf = _cstr(self._ns_uri_utf) - self._classes = {} - self._extensions = {} + self._entries = {} def update(self, class_dict_iterable): - """Forgivingly update the registry. If registered values are - neither subclasses of ElementBase nor callable extension - functions, or if their name starts with '_', they will be - silently discarded. This allows registrations at the module or - class level using vars(), globals() etc.""" - if hasattr(class_dict_iterable, 'iteritems'): - class_dict_iterable = class_dict_iterable.iteritems() - elif hasattr(class_dict_iterable, 'items'): + """Forgivingly update the registry. If registered values do not match + the required type for this registry, or if their name starts with '_', + they will be silently discarded. This allows registrations at the + module or class level using vars(), globals() etc.""" + if hasattr(class_dict_iterable, 'items'): class_dict_iterable = class_dict_iterable.items() for name, item in class_dict_iterable: if (name is None or name[:1] != '_') and callable(item): self[name] = item - def __setitem__(self, name, item): - if python.PyType_Check(item) and issubclass(item, ElementBase): - d = self._classes - elif name is None: - raise NamespaceRegistryError, "Registered name can only be None for elements." - elif callable(item): - d = self._extensions - else: - raise NamespaceRegistryError, "Registered item must be callable." - - if name is None: - name_utf = None - else: - name_utf = _utf8(name) - d[name_utf] = item - def __getitem__(self, name): + if name is not None: + name = _utf8(name) + return self._get(name) + + cdef object _get(self, object name): cdef python.PyObject* dict_result - name_utf = _utf8(name) - dict_result = python.PyDict_GetItem(self._classes, name_utf) + dict_result = python.PyDict_GetItem(self._entries, name) if dict_result is NULL: - dict_result = python.PyDict_GetItem(self._extensions, name_utf) + raise KeyError, "Name not registered." + return dict_result + + cdef object _getForString(self, char* name): + cdef python.PyObject* dict_result + dict_result = python.PyDict_GetItemString(self._entries, name) if dict_result is NULL: raise KeyError, "Name not registered." return dict_result + def __iter__(self): + return iter(self._entries) + + def items(self): + return self._entries.items() + + def iteritems(self): + return self._entries.iteritems() + def clear(self): - self._classes.clear() - self._extensions.clear() + self._entries.clear() + +cdef class _ClassNamespaceRegistry(_NamespaceRegistry): + "Dictionary-like registry for namespace implementation classes" + def __setitem__(self, name, item): + if not python.PyType_Check(item) or \ + not issubclass(item, ElementBase): + raise NamespaceRegistryError, \ + "Registered item must be subtypes of ElementBase" + if name is not None: + name = _utf8(name) + self._entries[name] = item def __repr__(self): return "Namespace(%r)" % self._ns_uri cdef class _FunctionNamespaceRegistry(_NamespaceRegistry): + def __setitem__(self, name, item): + if not callable(item): + raise NamespaceRegistryError, \ + "Registered functions must be callable." + if not name: + raise ValueError, \ + "extensions must have non empty names" + self._entries[_utf8(name)] = item + + def __repr__(self): + return "FunctionNamespace(%r)" % self._ns_uri + +cdef class _XPathFunctionNamespaceRegistry(_FunctionNamespaceRegistry): cdef object _prefix cdef object _prefix_utf property prefix: @@ -129,42 +149,28 @@ self._prefix_utf = _utf8(prefix) self._prefix = prefix - def __setitem__(self, name, function): - if not callable(function): - raise NamespaceRegistryError, "Registered function must be callable." - if name is None: - name_utf = None - else: - name_utf = _utf8(name) - self._extensions[name_utf] = function - - def __getitem__(self, name): - cdef python.PyObject* dict_result - name_utf = _utf8(name) - dict_result = python.PyDict_GetItem(self._extensions, name_utf) - if dict_result is NULL: - raise KeyError, "Name not registered." - return dict_result - - def __repr__(self): - return "FunctionNamespace(%r)" % self._ns_uri - cdef object _find_all_extension_prefixes(): "Internal lookup function to find all function prefixes for XSLT/XPath." - cdef _FunctionNamespaceRegistry registry + cdef _XPathFunctionNamespaceRegistry registry ns_prefixes = {} for (ns_utf, registry) in __FUNCTION_NAMESPACE_REGISTRIES.iteritems(): if registry._prefix_utf is not None: ns_prefixes[registry._prefix_utf] = ns_utf return ns_prefixes +cdef object _iter_extension_function_names(): + l = [] + for (ns_utf, registry) in __FUNCTION_NAMESPACE_REGISTRIES.iteritems(): + python.PyList_Append(l, (ns_utf, registry)) + return l + cdef object _find_extension(ns_uri_utf, name_utf): cdef python.PyObject* dict_result dict_result = python.PyDict_GetItem( __FUNCTION_NAMESPACE_REGISTRIES, ns_uri_utf) if dict_result is NULL: return None - extensions = (<_NamespaceRegistry>dict_result)._extensions + extensions = (<_NamespaceRegistry>dict_result)._entries dict_result = python.PyDict_GetItem(extensions, name_utf) if dict_result is NULL: return None @@ -185,7 +191,7 @@ return _Element registry = <_NamespaceRegistry>dict_result - classes = registry._classes + classes = registry._entries if c_element_name_utf is not NULL: dict_result = python.PyDict_GetItemString( Modified: lxml/branch/lxml-1.0/src/lxml/xpath.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xpath.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xpath.pxi Thu Jun 8 16:28:49 2006 @@ -12,7 +12,6 @@ cdef class _XPathContext(_BaseContext): cdef object _variables def __init__(self, namespaces, extensions, variables): - self._ext_lookup_function = _function_check self._variables = variables _BaseContext.__init__(self, namespaces, extensions) @@ -24,6 +23,8 @@ self._register_context(doc) if self._variables is not None: self.registerVariables(self._variables) + xpath.xmlXPathRegisterFuncLookup( + self._xpathCtxt, _function_check, self) cdef unregister_context(self): cdef xpath.xmlXPathContext* xpathCtxt @@ -35,10 +36,14 @@ def registerVariables(self, variable_dict): for name, value in variable_dict.items(): - self._registerVariable(self._to_utf(name), value) + name_utf = self._to_utf(name) + xpath.xmlXPathRegisterVariable( + self._xpathCtxt, _cstr(name_utf), _wrapXPathObject(value)) def registerVariable(self, name, value): - self._registerVariable(self._to_utf(name), value) + name_utf = self._to_utf(name) + xpath.xmlXPathRegisterVariable( + self._xpathCtxt, _cstr(name_utf), _wrapXPathObject(value)) cdef void _registerVariable(self, name_utf, value): xpath.xmlXPathRegisterVariable( Modified: lxml/branch/lxml-1.0/src/lxml/xslt.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xslt.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xslt.pxi Thu Jun 8 16:28:49 2006 @@ -183,7 +183,6 @@ cdef xslt.xsltTransformContext* _xsltCtxt def __init__(self, namespaces, extensions): self._xsltCtxt = NULL - self._ext_lookup_function = _xslt_function_check if extensions and None in extensions: raise XSLTExtensionError, "extensions must not have empty namespaces" _BaseContext.__init__(self, namespaces, extensions) @@ -194,6 +193,7 @@ self._set_xpath_context(xsltCtxt.xpathCtxt) self._register_context(doc) xsltCtxt.xpathCtxt.userData = self + self._registerExtensionFunctions() cdef free_context(self): cdef xslt.xsltTransformContext* xsltCtxt @@ -205,11 +205,48 @@ xslt.xsltFreeTransformContext(xsltCtxt) self._release_temp_refs() - cdef _registerLocalExtensionFunction(self, ns_utf, name_utf, function): + cdef void _addLocalExtensionFunction(self, ns_utf, name_utf, function): if self._extensions is None: self._extensions = {} python.PyDict_SetItem(self._extensions, (ns_utf, name_utf), function) + cdef void _registerExtensionFunctions(self): + cdef python.PyObject* dict_result + for ns_utf, functions in _iter_extension_function_names(): + if ns_utf is None: + continue + dict_result = python.PyDict_GetItem(self._function_cache_ns, ns_utf) + if dict_result is NULL: + d = {} + python.PyDict_SetItem(self._function_cache_ns, ns_utf, d) + else: + d = dict_result + for name_utf, function in functions.iteritems(): + python.PyDict_SetItem(d, name_utf, function) + xslt.xsltRegisterExtFunction( + self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), + _xpath_function_call) + if self._extensions is None: + return # done + last_ns = None + for (ns_utf, name_utf), function in self._extensions.iteritems(): + if ns_utf is None: + raise ValueError, \ + "extensions must have non empty namespaces" + elif ns_utf is not last_ns: + last_ns = ns_utf + dict_result = python.PyDict_GetItem( + self._function_cache_ns, ns_utf) + if dict_result is NULL: + d = {} + python.PyDict_SetItem(self._function_cache_ns, ns_utf, d) + else: + d = dict_result + python.PyDict_SetItem(d, name_utf, function) + xslt.xsltRegisterExtFunction( + self._xsltCtxt, _cstr(name_utf), _cstr(ns_utf), + _xpath_function_call) + cdef class _ExsltRegExp # forward declaration cdef class XSLT: @@ -258,7 +295,8 @@ self._context = _XSLTContext(None, extensions) self._error_log = _ErrorLog() if regexp: - self._regexp = _ExsltRegExp() + self._regexp = _ExsltRegExp() + self._regexp._register_in_context(self._context) else: self._regexp = None # XXX is it worthwile to use xsltPrecomputeStylesheet here? @@ -332,9 +370,6 @@ params = NULL self._context.register_context(transform_ctxt, input_doc) - if self._regexp is not None: - self._regexp._register_in_context(self._context) - c_result = xslt.xsltApplyStylesheetUser(self._c_style, c_doc, params, NULL, NULL, transform_ctxt) @@ -517,6 +552,6 @@ cdef _register_in_context(self, _XSLTContext context): ns = "http://exslt.org/regular-expressions" - context._registerLocalExtensionFunction(ns, "test", self.test) - context._registerLocalExtensionFunction(ns, "match", self.match) - context._registerLocalExtensionFunction(ns, "replace", self.replace) + context._addLocalExtensionFunction(ns, "test", self.test) + context._addLocalExtensionFunction(ns, "match", self.match) + context._addLocalExtensionFunction(ns, "replace", self.replace) From scoder at codespeak.net Thu Jun 8 16:42:43 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 16:42:43 +0200 (CEST) Subject: [Lxml-checkins] r28531 - lxml/branch/lxml-1.0 Message-ID: <20060608144243.2C5371009A@code0.codespeak.net> Author: scoder Date: Thu Jun 8 16:42:41 2006 New Revision: 28531 Modified: lxml/branch/lxml-1.0/CHANGES.txt Log: 1.0.1 in changelog Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Thu Jun 8 16:42:41 2006 @@ -1,8 +1,8 @@ lxml changelog ============== -current -======= +1.0.1 (2006-06-08) +================== Features added -------------- From scoder at codespeak.net Thu Jun 8 17:14:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 17:14:13 +0200 (CEST) Subject: [Lxml-checkins] r28533 - lxml/trunk/doc Message-ID: <20060608151413.2780B100AB@code0.codespeak.net> Author: scoder Date: Thu Jun 8 17:14:11 2006 New Revision: 28533 Added: lxml/trunk/doc/rest2html.py (contents, props changed) Modified: lxml/trunk/doc/mkhtml.py Log: quick and dirty fix for different names of rest2html.py on different platforms: add it to SVN Modified: lxml/trunk/doc/mkhtml.py ============================================================================== --- lxml/trunk/doc/mkhtml.py (original) +++ lxml/trunk/doc/mkhtml.py Thu Jun 8 17:14:11 2006 @@ -5,6 +5,7 @@ os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') + script = os.path.join(doc_dir, 'rest2html.py') stylesheet_url = 'style.css' for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', @@ -14,21 +15,22 @@ outname = os.path.splitext(name)[0] + '.html' outpath = os.path.join(dirname, outname) - rest2html(path, outpath, stylesheet_url) + rest2html(script, path, outpath, stylesheet_url) # also convert INSTALL.txt and CHANGES.txt - rest2html(os.path.join(lxml_path, 'INSTALL.txt'), + rest2html(script, + os.path.join(lxml_path, 'INSTALL.txt'), os.path.join(dirname, 'installation.html'), stylesheet_url) - rest2html(os.path.join(lxml_path, 'CHANGES.txt'), + rest2html(script, + os.path.join(lxml_path, 'CHANGES.txt'), os.path.join(dirname, 'changes-%s.html' % release), stylesheet_url) os.rename(os.path.join(dirname, 'main.html'), os.path.join(dirname, 'index.html')) -def rest2html(source_path, dest_path, stylesheet_url): - - command = ('rest2html --stylesheet=%s --link-stylesheet %s > %s' % - (stylesheet_url, source_path, dest_path)) +def rest2html(script, source_path, dest_path, stylesheet_url): + command = ('%s --stylesheet=%s --link-stylesheet %s > %s' % + (script, stylesheet_url, source_path, dest_path)) os.system(command) if __name__ == '__main__': Added: lxml/trunk/doc/rest2html.py ============================================================================== --- (empty file) +++ lxml/trunk/doc/rest2html.py Thu Jun 8 17:14:11 2006 @@ -0,0 +1,25 @@ +#!/usr/bin/python + +# Author: David Goodger +# Contact: goodger at python.org +# Revision: $Revision: 3901 $ +# Date: $Date: 2005-09-25 17:49:54 +0200 (Sun, 25 Sep 2005) $ +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing HTML. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates (X)HTML documents from standalone reStructuredText ' + 'sources. ' + default_description) + +publish_cmdline(writer_name='html', description=description) From scoder at codespeak.net Thu Jun 8 17:14:47 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 17:14:47 +0200 (CEST) Subject: [Lxml-checkins] r28535 - lxml/branch/lxml-1.0/doc Message-ID: <20060608151447.B02EB100B2@code0.codespeak.net> Author: scoder Date: Thu Jun 8 17:14:46 2006 New Revision: 28535 Added: lxml/branch/lxml-1.0/doc/rest2html.py - copied unchanged from r28534, lxml/trunk/doc/rest2html.py Modified: lxml/branch/lxml-1.0/doc/mkhtml.py Log: merged in rest2html.py Modified: lxml/branch/lxml-1.0/doc/mkhtml.py ============================================================================== --- lxml/branch/lxml-1.0/doc/mkhtml.py (original) +++ lxml/branch/lxml-1.0/doc/mkhtml.py Thu Jun 8 17:14:46 2006 @@ -5,6 +5,7 @@ os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') + script = os.path.join(doc_dir, 'rest2html.py') stylesheet_url = 'style.css' for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', @@ -14,21 +15,22 @@ outname = os.path.splitext(name)[0] + '.html' outpath = os.path.join(dirname, outname) - rest2html(path, outpath, stylesheet_url) + rest2html(script, path, outpath, stylesheet_url) # also convert INSTALL.txt and CHANGES.txt - rest2html(os.path.join(lxml_path, 'INSTALL.txt'), + rest2html(script, + os.path.join(lxml_path, 'INSTALL.txt'), os.path.join(dirname, 'installation.html'), stylesheet_url) - rest2html(os.path.join(lxml_path, 'CHANGES.txt'), + rest2html(script, + os.path.join(lxml_path, 'CHANGES.txt'), os.path.join(dirname, 'changes-%s.html' % release), stylesheet_url) os.rename(os.path.join(dirname, 'main.html'), os.path.join(dirname, 'index.html')) -def rest2html(source_path, dest_path, stylesheet_url): - - command = ('rest2html --stylesheet=%s --link-stylesheet %s > %s' % - (stylesheet_url, source_path, dest_path)) +def rest2html(script, source_path, dest_path, stylesheet_url): + command = ('%s --stylesheet=%s --link-stylesheet %s > %s' % + (script, stylesheet_url, source_path, dest_path)) os.system(command) if __name__ == '__main__': From scoder at codespeak.net Thu Jun 8 17:18:40 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 17:18:40 +0200 (CEST) Subject: [Lxml-checkins] r28536 - lxml/trunk/src/lxml Message-ID: <20060608151840.07E4A100AC@code0.codespeak.net> Author: scoder Date: Thu Jun 8 17:18:39 2006 New Revision: 28536 Modified: lxml/trunk/src/lxml/etree.pyx Log: docstrings added by Andreas Pakulat Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 8 17:18:39 2006 @@ -382,6 +382,8 @@ return self._context_node def getroot(self): + """Gets the root element for this tree. + """ return self._context_node property docinfo: @@ -417,6 +419,8 @@ c_write_declaration, bool(pretty_print)) def getpath(self, _NodeBase element not None): + """Returns a structural, absolute XPath expression to find that element. + """ cdef _Document doc cdef xmlDoc* c_doc cdef char* c_path @@ -433,12 +437,17 @@ return path def getiterator(self, tag=None): + """Creates an iterator for the root element. The iterator loops over all elements + in this tree, in document order. + """ root = self.getroot() if root is None: return () return root.getiterator(tag) def find(self, path): + """Finds the first toplevel element with given tag. Same as getroot().find(path). + """ self._assertHasRoot() root = self.getroot() if path[:1] == "/": @@ -446,6 +455,8 @@ return root.find(path) def findtext(self, path, default=None): + """Finds the element text for the first toplevel element with given tag. Same as getroot().findtext(path) + """ self._assertHasRoot() root = self.getroot() if path[:1] == "/": @@ -453,6 +464,8 @@ return root.findtext(path, default) def findall(self, path): + """Finds all toplevel elements with the given tag. Same as getroot().findall(path). + """ self._assertHasRoot() root = self.getroot() if path[:1] == "/": @@ -574,6 +587,8 @@ # MANIPULATORS def __setitem__(self, Py_ssize_t index, _NodeBase element not None): + """Replaces the given subelement. + """ cdef xmlNode* c_node cdef xmlNode* c_next c_node = _findChild(self._c_node, index) @@ -587,6 +602,8 @@ attemptDeallocation(c_node) def __delitem__(self, Py_ssize_t index): + """Deletes the given subelement. + """ cdef xmlNode* c_node c_node = _findChild(self._c_node, index) if c_node is NULL: @@ -595,11 +612,16 @@ _removeNode(c_node) def __delslice__(self, Py_ssize_t start, Py_ssize_t stop): + """Deletes a number of subelements. + """ cdef xmlNode* c_node c_node = _findChild(self._c_node, start) _deleteSlice(c_node, start, stop) def __setslice__(self, Py_ssize_t start, Py_ssize_t stop, value): + """Replaces a number of subelements with elements + from a sequence. + """ cdef xmlNode* c_node cdef xmlNode* c_next cdef _Element mynode @@ -641,9 +663,14 @@ return new_doc.getroot() def set(self, key, value): + """Sets an element attribute. + """ _setAttributeValue(self, key, value) def append(self, _Element element not None): + """ + Adds a subelement to the end of this element. + """ cdef xmlNode* c_next cdef xmlNode* c_node c_node = element._c_node @@ -659,6 +686,10 @@ moveNodeToDocument(element, self._doc) def clear(self): + """Resets an element. This function removes all subelements, + clears all attributes and sets the text and tail + attributes to None. + """ cdef xmlAttr* c_attr cdef xmlAttr* c_attr_next cdef xmlNode* c_node @@ -684,6 +715,8 @@ c_node = c_node_next def insert(self, index, _Element element not None): + """Inserts a subelement at the given position in this element + """ cdef xmlNode* c_node cdef xmlNode* c_next c_node = _findChild(self._c_node, index) @@ -696,6 +729,10 @@ moveNodeToDocument(element, self._doc) def remove(self, _Element element not None): + """Removes a matching subelement. Unlike the find methods, this + method compares elements based on identity, not on tag value + or contents. + """ cdef xmlNode* c_node c_node = element._c_node if c_node.parent is not self._c_node: @@ -705,6 +742,8 @@ # PROPERTIES property tag: + """Element tag + """ def __get__(self): if self._tag is not None: return self._tag @@ -722,6 +761,8 @@ # not in ElementTree, read-only property prefix: + """Namespace Prefix or None. + """ def __get__(self): if self._c_node.ns is not NULL: if self._c_node.ns.prefix is not NULL: @@ -729,6 +770,9 @@ return None property attrib: + """Element attribute dictionary. Where possible, use + get, set, keys and items to access element attributes. + """ def __get__(self): # do *NOT* keep a reference here to prevent cyclic dependencies # this would free the element in the Cyclic GC, which might let @@ -736,6 +780,9 @@ return _Attrib(self) property text: + """Text before the first subelement. This is either a string or + the value None, if there was no text + """ def __get__(self): return _collectText(self._c_node.children) @@ -756,6 +803,10 @@ c_text_node) property tail: + """Text after this element's end tag, but before the next sibling + element's start tag. This is either a string or the value None, if + there was no text. + """ def __get__(self): return _collectText(self._c_node.next) @@ -775,6 +826,8 @@ return "" % (self.tag, id(self)) def __getitem__(self, Py_ssize_t index): + """Returns the given subelement. + """ cdef xmlNode* c_node c_node = _findChild(self._c_node, index) if c_node is NULL: @@ -782,6 +835,8 @@ return _elementFactory(self._doc, c_node) def __getslice__(self, Py_ssize_t start, Py_ssize_t stop): + """Returns a list containing subelements in the given range. + """ cdef xmlNode* c_node cdef _Document doc cdef Py_ssize_t c @@ -804,6 +859,8 @@ return result def __len__(self): + """Returns the number of subelements. + """ cdef Py_ssize_t c cdef xmlNode* c_node c = 0 @@ -905,16 +962,25 @@ raise ValueError, "list.index(x): x not in list" def get(self, key, default=None): + """Gets an element attribute. + """ return _getAttributeValue(self, key, default) def keys(self): + """Gets a list of attribute names. The names are returned in an arbitrary + order (just like for an ordinary Python dictionary). + """ return self.attrib.keys() def items(self): + """Gets element attributes, as a sequence. The attributes are returned in + an arbitrary order. + """ return self.attrib.items() def getchildren(self): - "Return a list with all children of this element." + """Returns all subelements. The elements are returned in document order. + """ cdef xmlNode* c_node cdef _Document doc cdef int ret @@ -930,7 +996,8 @@ return result def getparent(self): - "Returns the parent of this element or None for the root element" + """Returns the parent of this element or None for the root element. + """ cdef xmlNode* c_node c_node = _parentElement(self._c_node) if c_node is NULL: @@ -939,7 +1006,8 @@ return _elementFactory(self._doc, c_node) def getnext(self): - "Returns the following sibling of this element or None" + """Returns the following sibling of this element or None. + """ cdef xmlNode* c_node c_node = _nextElement(self._c_node) if c_node is not NULL: @@ -947,7 +1015,8 @@ return None def getprevious(self): - "Returns the preceding sibling of this element or None" + """Returns the preceding sibling of this element or None. + """ cdef xmlNode* c_node c_node = _previousElement(self._c_node) if c_node is not NULL: @@ -962,7 +1031,8 @@ return SiblingsIterator(self, preceding) def iterancestors(self): - "Iterate over the ancestors of this element (from parent to parent)." + """Iterate over the ancestors of this element (from parent to parent). + """ return AncestorsIterator(self) def iterdescendants(self): @@ -994,7 +1064,8 @@ return ElementDepthFirstIterator(self, tag) def makeelement(self, _tag, attrib=None, nsmap=None, **_extra): - "Creates a new element associated with the same document." + """Creates a new element associated with the same document. + """ # a little code duplication, but less overhead through doc reuse cdef xmlNode* c_node cdef xmlDoc* c_doc @@ -1009,15 +1080,23 @@ return _elementFactory(doc, c_node) def find(self, path): + """Finds the first matching subelement, by tag name or path. + """ return _elementpath.find(self, path) def findtext(self, path, default=None): + """Finds text for the first matching subelement, by tag name or path. + """ return _elementpath.findtext(self, path, default) def findall(self, path): + """Finds all matching subelements, by tag name or path. + """ return _elementpath.findall(self, path) def xpath(self, _path, namespaces=None, extensions=None, **_variables): + """Evaluate an xpath expression using the element as context node. + """ evaluator = XPathElementEvaluator(self, namespaces, extensions) return evaluator.evaluate(_path, **_variables) @@ -1409,6 +1488,8 @@ # module-level API for ElementTree def Element(_tag, attrib=None, nsmap=None, **_extra): + """Element factory. This function returns an object implementing the Element interface. + """ cdef xmlNode* c_node cdef xmlDoc* c_doc cdef _Document doc @@ -1423,6 +1504,9 @@ return _elementFactory(doc, c_node) def Comment(text=None): + """Comment element factory. This factory function creates a special element that will + be serialized as an XML comment. + """ cdef _Document doc cdef xmlNode* c_node cdef xmlDoc* c_doc @@ -1438,6 +1522,9 @@ def SubElement(_Element _parent not None, _tag, attrib=None, nsmap=None, **_extra): + """Subelement factory. This function creates an element instance, and appends it to an + existing element. + """ cdef xmlNode* c_node cdef _Document doc ns_utf, name_utf = _getNsTag(_tag) @@ -1450,6 +1537,8 @@ return _elementFactory(doc, c_node) def ElementTree(_Element element=None, file=None, _BaseParser parser=None): + """ElementTree wrapper class. + """ cdef xmlNode* c_next cdef xmlNode* c_node cdef xmlNode* c_node_copy @@ -1468,11 +1557,17 @@ return _elementTreeFactory(doc, element) def HTML(text): + """Parses an HTML document from a string constant. This function can be used + to embed "HTML literals" in Python code. + """ cdef _Document doc doc = _parseMemoryDocument(text, None, __DEFAULT_HTML_PARSER) return doc.getroot() def XML(text): + """Parses an XML document from a string constant. This function can be used + to embed "XML literals" in Python code. + """ cdef _Document doc doc = _parseMemoryDocument(text, None, __DEFAULT_XML_PARSER) return doc.getroot() @@ -1480,6 +1575,8 @@ fromstring = XML cdef class QName: + """QName wrapper. + """ cdef readonly object text def __init__(self, text_or_uri, tag=None): if tag is not None: @@ -1493,9 +1590,14 @@ return self.text.__hash__() def iselement(element): + """Checks if an object appears to be a valid element object. + """ return isinstance(element, _Element) def dump(_NodeBase elem not None, pretty_print=True): + """Writes an element tree or element structure to sys.stdout. This function + should be used for debugging only. + """ _dumpToFile(sys.stdout, elem._c_node, bool(pretty_print)) def tostring(element_or_tree, encoding=None, From scoder at codespeak.net Thu Jun 8 17:48:22 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 17:48:22 +0200 (CEST) Subject: [Lxml-checkins] r28545 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060608154822.9C848100B9@code0.codespeak.net> Author: scoder Date: Thu Jun 8 17:48:21 2006 New Revision: 28545 Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx Log: docstrings added by Andreas Pakulat Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Thu Jun 8 17:48:21 2006 @@ -382,6 +382,8 @@ return self._context_node def getroot(self): + """Gets the root element for this tree. + """ return self._context_node property docinfo: @@ -417,6 +419,8 @@ c_write_declaration, bool(pretty_print)) def getpath(self, _NodeBase element not None): + """Returns a structural, absolute XPath expression to find that element. + """ cdef _Document doc cdef xmlDoc* c_doc cdef char* c_path @@ -433,12 +437,17 @@ return path def getiterator(self, tag=None): + """Creates an iterator for the root element. The iterator loops over all elements + in this tree, in document order. + """ root = self.getroot() if root is None: return () return root.getiterator(tag) def find(self, path): + """Finds the first toplevel element with given tag. Same as getroot().find(path). + """ self._assertHasRoot() root = self.getroot() if path[:1] == "/": @@ -446,6 +455,8 @@ return root.find(path) def findtext(self, path, default=None): + """Finds the element text for the first toplevel element with given tag. Same as getroot().findtext(path) + """ self._assertHasRoot() root = self.getroot() if path[:1] == "/": @@ -453,6 +464,8 @@ return root.findtext(path, default) def findall(self, path): + """Finds all toplevel elements with the given tag. Same as getroot().findall(path). + """ self._assertHasRoot() root = self.getroot() if path[:1] == "/": @@ -574,6 +587,8 @@ # MANIPULATORS def __setitem__(self, Py_ssize_t index, _NodeBase element not None): + """Replaces the given subelement. + """ cdef xmlNode* c_node cdef xmlNode* c_next c_node = _findChild(self._c_node, index) @@ -587,6 +602,8 @@ attemptDeallocation(c_node) def __delitem__(self, Py_ssize_t index): + """Deletes the given subelement. + """ cdef xmlNode* c_node c_node = _findChild(self._c_node, index) if c_node is NULL: @@ -595,11 +612,16 @@ _removeNode(c_node) def __delslice__(self, Py_ssize_t start, Py_ssize_t stop): + """Deletes a number of subelements. + """ cdef xmlNode* c_node c_node = _findChild(self._c_node, start) _deleteSlice(c_node, start, stop) def __setslice__(self, Py_ssize_t start, Py_ssize_t stop, value): + """Replaces a number of subelements with elements + from a sequence. + """ cdef xmlNode* c_node cdef xmlNode* c_next cdef _Element mynode @@ -641,9 +663,14 @@ return new_doc.getroot() def set(self, key, value): + """Sets an element attribute. + """ _setAttributeValue(self, key, value) def append(self, _Element element not None): + """ + Adds a subelement to the end of this element. + """ cdef xmlNode* c_next cdef xmlNode* c_node c_node = element._c_node @@ -659,6 +686,10 @@ moveNodeToDocument(element, self._doc) def clear(self): + """Resets an element. This function removes all subelements, + clears all attributes and sets the text and tail + attributes to None. + """ cdef xmlAttr* c_attr cdef xmlAttr* c_attr_next cdef xmlNode* c_node @@ -684,6 +715,8 @@ c_node = c_node_next def insert(self, index, _Element element not None): + """Inserts a subelement at the given position in this element + """ cdef xmlNode* c_node cdef xmlNode* c_next c_node = _findChild(self._c_node, index) @@ -696,6 +729,10 @@ moveNodeToDocument(element, self._doc) def remove(self, _Element element not None): + """Removes a matching subelement. Unlike the find methods, this + method compares elements based on identity, not on tag value + or contents. + """ cdef xmlNode* c_node c_node = element._c_node if c_node.parent is not self._c_node: @@ -705,6 +742,8 @@ # PROPERTIES property tag: + """Element tag + """ def __get__(self): if self._tag is not None: return self._tag @@ -722,6 +761,8 @@ # not in ElementTree, read-only property prefix: + """Namespace Prefix or None. + """ def __get__(self): if self._c_node.ns is not NULL: if self._c_node.ns.prefix is not NULL: @@ -729,6 +770,9 @@ return None property attrib: + """Element attribute dictionary. Where possible, use + get, set, keys and items to access element attributes. + """ def __get__(self): # do *NOT* keep a reference here to prevent cyclic dependencies # this would free the element in the Cyclic GC, which might let @@ -736,6 +780,9 @@ return _Attrib(self) property text: + """Text before the first subelement. This is either a string or + the value None, if there was no text + """ def __get__(self): return _collectText(self._c_node.children) @@ -756,6 +803,10 @@ c_text_node) property tail: + """Text after this element's end tag, but before the next sibling + element's start tag. This is either a string or the value None, if + there was no text. + """ def __get__(self): return _collectText(self._c_node.next) @@ -775,6 +826,8 @@ return "" % (self.tag, id(self)) def __getitem__(self, Py_ssize_t index): + """Returns the given subelement. + """ cdef xmlNode* c_node c_node = _findChild(self._c_node, index) if c_node is NULL: @@ -782,6 +835,8 @@ return _elementFactory(self._doc, c_node) def __getslice__(self, Py_ssize_t start, Py_ssize_t stop): + """Returns a list containing subelements in the given range. + """ cdef xmlNode* c_node cdef _Document doc cdef Py_ssize_t c @@ -804,6 +859,8 @@ return result def __len__(self): + """Returns the number of subelements. + """ cdef Py_ssize_t c cdef xmlNode* c_node c = 0 @@ -905,15 +962,25 @@ raise ValueError, "list.index(x): x not in list" def get(self, key, default=None): + """Gets an element attribute. + """ return _getAttributeValue(self, key, default) def keys(self): + """Gets a list of attribute names. The names are returned in an arbitrary + order (just like for an ordinary Python dictionary). + """ return self.attrib.keys() def items(self): + """Gets element attributes, as a sequence. The attributes are returned in + an arbitrary order. + """ return self.attrib.items() def getchildren(self): + """Returns all subelements. The elements are returned in document order. + """ cdef xmlNode* c_node cdef _Document doc cdef int ret @@ -929,6 +996,8 @@ return result def getparent(self): + """Returns the parent of this element or None for the root element. + """ cdef xmlNode* c_node c_node = self._c_node.parent if c_node is not NULL and _isElement(c_node): @@ -941,10 +1010,17 @@ return _elementTreeFactory(self._doc, None) def getiterator(self, tag=None): + """Iterate over all elements in the subtree in document order (depth + first pre-order), starting with this element. + + Can be restricted to find only elements with a specific tag or from a + namespace. + """ return ElementDepthFirstIterator(self, tag) def makeelement(self, _tag, attrib=None, nsmap=None, **_extra): - "Creates a new element associated with the same document." + """Creates a new element associated with the same document. + """ # a little code duplication, but less overhead through doc reuse cdef xmlNode* c_node cdef xmlDoc* c_doc @@ -959,15 +1035,23 @@ return _elementFactory(doc, c_node) def find(self, path): + """Finds the first matching subelement, by tag name or path. + """ return _elementpath.find(self, path) def findtext(self, path, default=None): + """Finds text for the first matching subelement, by tag name or path. + """ return _elementpath.findtext(self, path, default) def findall(self, path): + """Finds all matching subelements, by tag name or path. + """ return _elementpath.findall(self, path) def xpath(self, _path, namespaces=None, extensions=None, **_variables): + """Evaluate an xpath expression using the element as context node. + """ evaluator = XPathElementEvaluator(self, namespaces, extensions) return evaluator.evaluate(_path, **_variables) @@ -1335,6 +1419,8 @@ # module-level API for ElementTree def Element(_tag, attrib=None, nsmap=None, **_extra): + """Element factory. This function returns an object implementing the Element interface. + """ cdef xmlNode* c_node cdef xmlDoc* c_doc cdef _Document doc @@ -1349,6 +1435,9 @@ return _elementFactory(doc, c_node) def Comment(text=None): + """Comment element factory. This factory function creates a special element that will + be serialized as an XML comment. + """ cdef _Document doc cdef xmlNode* c_node cdef xmlDoc* c_doc @@ -1364,6 +1453,9 @@ def SubElement(_Element _parent not None, _tag, attrib=None, nsmap=None, **_extra): + """Subelement factory. This function creates an element instance, and appends it to an + existing element. + """ cdef xmlNode* c_node cdef _Document doc ns_utf, name_utf = _getNsTag(_tag) @@ -1376,6 +1468,8 @@ return _elementFactory(doc, c_node) def ElementTree(_Element element=None, file=None, _BaseParser parser=None): + """ElementTree wrapper class. + """ cdef xmlNode* c_next cdef xmlNode* c_node cdef xmlNode* c_node_copy @@ -1394,11 +1488,17 @@ return _elementTreeFactory(doc, element) def HTML(text): + """Parses an HTML document from a string constant. This function can be used + to embed "HTML literals" in Python code. + """ cdef _Document doc doc = _parseMemoryDocument(text, None, __DEFAULT_HTML_PARSER) return doc.getroot() def XML(text): + """Parses an XML document from a string constant. This function can be used + to embed "XML literals" in Python code. + """ cdef _Document doc doc = _parseMemoryDocument(text, None, __DEFAULT_XML_PARSER) return doc.getroot() @@ -1406,6 +1506,8 @@ fromstring = XML cdef class QName: + """QName wrapper. + """ cdef readonly object text def __init__(self, text_or_uri, tag=None): if tag is not None: @@ -1419,9 +1521,14 @@ return self.text.__hash__() def iselement(element): + """Checks if an object appears to be a valid element object. + """ return isinstance(element, _Element) def dump(_NodeBase elem not None, pretty_print=True): + """Writes an element tree or element structure to sys.stdout. This function + should be used for debugging only. + """ _dumpToFile(sys.stdout, elem._c_node, bool(pretty_print)) def tostring(element_or_tree, encoding=None, From scoder at codespeak.net Thu Jun 8 22:25:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:25:08 +0200 (CEST) Subject: [Lxml-checkins] r28557 - lxml/trunk/src/lxml Message-ID: <20060608202508.09E6E10068@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:25:06 2006 New Revision: 28557 Modified: lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/proxy.pxi Log: new deallocation procedure * _Document.__dealloc__() no longer simply frees the document * instead, it deep traverses the document and searches for proxies * for each proxy, it clears the _c_node attribute to prevent the node from running its dealloc procedure * it then frees the C document Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 8 22:25:06 2006 @@ -173,13 +173,16 @@ cdef _BaseParser _parser def __dealloc__(self): - # if there are no more references to the document, it is safe - # to clean the whole thing up, as all nodes have a reference to - # the document - #print "freeing document:", self._c_doc - #displayNode(self._c_doc, 0) - #print self._c_doc, self._c_doc.dict is __GLOBAL_PARSER_CONTEXT._c_dict - #print self._c_doc, canDeallocateChildNodes(self._c_doc) + """We cannot rely on Python's GC to *always* dealloc the _Document *after* + all proxies it contains => traverse the document and mark all its proxies + as dead by clearing their xmlNode* reference. + """ + cdef xmlNode* c_node + c_node = self._c_doc.children + tree.BEGIN_FOR_EACH_ELEMENT_FROM(self._c_doc, c_node, 1) + if c_node._private is not NULL: + (<_NodeBase>c_node._private)._c_node = NULL + tree.END_FOR_EACH_ELEMENT_FROM(c_node) tree.xmlFreeDoc(self._c_doc) cdef getroot(self): Modified: lxml/trunk/src/lxml/proxy.pxi ============================================================================== From scoder at codespeak.net Thu Jun 8 22:27:00 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:27:00 +0200 (CEST) Subject: [Lxml-checkins] r28558 - lxml/trunk/src/lxml Message-ID: <20060608202700.D1FCE10068@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:26:59 2006 New Revision: 28558 Modified: lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/proxy.pxi Log: fixes for last checkin: move deallocation into external function Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 8 22:26:59 2006 @@ -173,17 +173,15 @@ cdef _BaseParser _parser def __dealloc__(self): - """We cannot rely on Python's GC to *always* dealloc the _Document *after* - all proxies it contains => traverse the document and mark all its proxies - as dead by clearing their xmlNode* reference. - """ - cdef xmlNode* c_node - c_node = self._c_doc.children - tree.BEGIN_FOR_EACH_ELEMENT_FROM(self._c_doc, c_node, 1) - if c_node._private is not NULL: - (<_NodeBase>c_node._private)._c_node = NULL - tree.END_FOR_EACH_ELEMENT_FROM(c_node) - tree.xmlFreeDoc(self._c_doc) + # if there are no more references to the document, it is safe + # to clean the whole thing up, as all nodes have a reference to + # the document + #print "freeing document:", self._c_doc + #displayNode(self._c_doc, 0) + #print self._c_doc, self._c_doc.dict is __GLOBAL_PARSER_CONTEXT._c_dict + #print self._c_doc, canDeallocateChildNodes(self._c_doc) + #tree.xmlFreeDoc(c_doc) + _deallocDocument(self._c_doc) cdef getroot(self): cdef xmlNode* c_node Modified: lxml/trunk/src/lxml/proxy.pxi ============================================================================== --- lxml/trunk/src/lxml/proxy.pxi (original) +++ lxml/trunk/src/lxml/proxy.pxi Thu Jun 8 22:26:59 2006 @@ -144,6 +144,19 @@ tree.END_FOR_EACH_ELEMENT_FROM(c_node) return 1 +cdef void _deallocDocument(xmlDoc* c_doc): + """We cannot rely on Python's GC to *always* dealloc the _Document *after* + all proxies it contains => traverse the document and mark all its proxies + as dead by deleting their xmlNode* reference. + """ + cdef xmlNode* c_node + c_node = c_doc.children + tree.BEGIN_FOR_EACH_ELEMENT_FROM(c_doc, c_node, 1) + if c_node._private is not NULL: + (<_NodeBase>c_node._private)._c_node = NULL + tree.END_FOR_EACH_ELEMENT_FROM(c_node) + tree.xmlFreeDoc(c_doc) + ################################################################################ # change _Document references when a node changes documents From scoder at codespeak.net Thu Jun 8 22:29:33 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:29:33 +0200 (CEST) Subject: [Lxml-checkins] r28559 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060608202933.3F63F10068@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:29:32 2006 New Revision: 28559 Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx lxml/branch/lxml-1.0/src/lxml/proxy.pxi Log: merged in document deallocation fix from trunk Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Thu Jun 8 22:29:32 2006 @@ -180,7 +180,8 @@ #displayNode(self._c_doc, 0) #print self._c_doc, self._c_doc.dict is __GLOBAL_PARSER_CONTEXT._c_dict #print self._c_doc, canDeallocateChildNodes(self._c_doc) - tree.xmlFreeDoc(self._c_doc) + #tree.xmlFreeDoc(c_doc) + _deallocDocument(self._c_doc) cdef getroot(self): cdef xmlNode* c_node Modified: lxml/branch/lxml-1.0/src/lxml/proxy.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/proxy.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/proxy.pxi Thu Jun 8 22:29:32 2006 @@ -144,6 +144,19 @@ tree.END_FOR_EACH_ELEMENT_FROM(c_node) return 1 +cdef void _deallocDocument(xmlDoc* c_doc): + """We cannot rely on Python's GC to *always* dealloc the _Document *after* + all proxies it contains => traverse the document and mark all its proxies + as dead by deleting their xmlNode* reference. + """ + cdef xmlNode* c_node + c_node = c_doc.children + tree.BEGIN_FOR_EACH_ELEMENT_FROM(c_doc, c_node, 1) + if c_node._private is not NULL: + (<_NodeBase>c_node._private)._c_node = NULL + tree.END_FOR_EACH_ELEMENT_FROM(c_node) + tree.xmlFreeDoc(c_doc) + ################################################################################ # change _Document references when a node changes documents From scoder at codespeak.net Thu Jun 8 22:35:47 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:35:47 +0200 (CEST) Subject: [Lxml-checkins] r28560 - lxml/trunk Message-ID: <20060608203547.17B3910068@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:35:45 2006 New Revision: 28560 Modified: lxml/trunk/CHANGES.txt Log: mark document GC bug fixed Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 8 22:35:45 2006 @@ -23,6 +23,8 @@ Bugs fixed ---------- +* Document deallocation could crash in certain garbage collection scenarios + * Extension function calls in XSLT variable declarations could break the stylesheet and crash on repeated calls From scoder at codespeak.net Thu Jun 8 22:36:03 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:36:03 +0200 (CEST) Subject: [Lxml-checkins] r28561 - lxml/branch/lxml-1.0 Message-ID: <20060608203603.50E9B10068@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:36:01 2006 New Revision: 28561 Modified: lxml/branch/lxml-1.0/CHANGES.txt Log: mark document GC bug fixed Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Thu Jun 8 22:36:01 2006 @@ -10,6 +10,8 @@ Bugs fixed ---------- +* Document deallocation could crash in certain garbage collection scenarios + * Extension function calls in XSLT variable declarations could break the stylesheet and crash on repeated calls From scoder at codespeak.net Thu Jun 8 22:37:54 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:37:54 +0200 (CEST) Subject: [Lxml-checkins] r28562 - in lxml/trunk: . src/lxml Message-ID: <20060608203754.1160010068@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:37:52 2006 New Revision: 28562 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.pyx Log: let Element.attrib return the same instance on repeated calls Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Thu Jun 8 22:37:52 2006 @@ -7,6 +7,8 @@ Features added -------------- +* Repeated calls to Element.attrib now efficiently return the same instance + * Element iteration over XPath axes: * Element.iterdescendants() iterates over the descendants of an element Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Thu Jun 8 22:37:52 2006 @@ -580,6 +580,7 @@ cdef class _Element(_NodeBase): cdef object _tag + cdef object _attrib def _init(self): """Called after object initialisation. Custom subclasses may override this if they recursively call _init() in the superclasses. @@ -775,10 +776,9 @@ get, set, keys and items to access element attributes. """ def __get__(self): - # do *NOT* keep a reference here to prevent cyclic dependencies - # this would free the element in the Cyclic GC, which might let - # Python deallocate the document before the element! - return _Attrib(self) + if self._attrib is None: + self._attrib = _Attrib(self) + return self._attrib property text: """Text before the first subelement. This is either a string or From scoder at codespeak.net Thu Jun 8 22:38:53 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 8 Jun 2006 22:38:53 +0200 (CEST) Subject: [Lxml-checkins] r28563 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060608203853.694EC10050@code0.codespeak.net> Author: scoder Date: Thu Jun 8 22:38:52 2006 New Revision: 28563 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/src/lxml/etree.pyx Log: merge from trunk: let Element.attrib return the same instance on repeated calls Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Thu Jun 8 22:38:52 2006 @@ -1,12 +1,14 @@ lxml changelog ============== -1.0.1 (2006-06-08) +1.0.1 (2006-06-09) ================== Features added -------------- +* Repeated calls to Element.attrib now efficiently return the same instance + Bugs fixed ---------- Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Thu Jun 8 22:38:52 2006 @@ -580,6 +580,7 @@ cdef class _Element(_NodeBase): cdef object _tag + cdef object _attrib def _init(self): """Called after object initialisation. Custom subclasses may override this if they recursively call _init() in the superclasses. @@ -775,10 +776,9 @@ get, set, keys and items to access element attributes. """ def __get__(self): - # do *NOT* keep a reference here to prevent cyclic dependencies - # this would free the element in the Cyclic GC, which might let - # Python deallocate the document before the element! - return _Attrib(self) + if self._attrib is None: + self._attrib = _Attrib(self) + return self._attrib property text: """Text before the first subelement. This is either a string or From scoder at codespeak.net Fri Jun 9 06:48:25 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 06:48:25 +0200 (CEST) Subject: [Lxml-checkins] r28564 - lxml/trunk/src/lxml Message-ID: <20060609044825.07A0D10053@code0.codespeak.net> Author: scoder Date: Fri Jun 9 06:48:23 2006 New Revision: 28564 Modified: lxml/trunk/src/lxml/etree.pyx Log: doc strings Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Fri Jun 9 06:48:23 2006 @@ -772,8 +772,8 @@ return None property attrib: - """Element attribute dictionary. Where possible, use - get, set, keys and items to access element attributes. + """Element attribute dictionary. Where possible, use get(), set(), + keys() and items() to access element attributes. """ def __get__(self): if self._attrib is None: @@ -782,7 +782,7 @@ property text: """Text before the first subelement. This is either a string or - the value None, if there was no text + the value None, if there was no text. """ def __get__(self): return _collectText(self._c_node.children) From scoder at codespeak.net Fri Jun 9 06:48:48 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 06:48:48 +0200 (CEST) Subject: [Lxml-checkins] r28565 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060609044848.7B78E10053@code0.codespeak.net> Author: scoder Date: Fri Jun 9 06:48:47 2006 New Revision: 28565 Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx Log: doc strings Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Fri Jun 9 06:48:47 2006 @@ -772,8 +772,8 @@ return None property attrib: - """Element attribute dictionary. Where possible, use - get, set, keys and items to access element attributes. + """Element attribute dictionary. Where possible, use get(), set(), + keys() and items() to access element attributes. """ def __get__(self): if self._attrib is None: @@ -782,7 +782,7 @@ property text: """Text before the first subelement. This is either a string or - the value None, if there was no text + the value None, if there was no text. """ def __get__(self): return _collectText(self._c_node.children) From scoder at codespeak.net Fri Jun 9 06:56:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 06:56:31 +0200 (CEST) Subject: [Lxml-checkins] r28566 - lxml/trunk Message-ID: <20060609045631.AFC1810053@code0.codespeak.net> Author: scoder Date: Fri Jun 9 06:56:30 2006 New Revision: 28566 Modified: lxml/trunk/MANIFEST.in Log: added rest2html.py to MANIFEST.in Modified: lxml/trunk/MANIFEST.in ============================================================================== --- lxml/trunk/MANIFEST.in (original) +++ lxml/trunk/MANIFEST.in Fri Jun 9 06:56:30 2006 @@ -5,5 +5,6 @@ include CHANGES.txt CREDITS.txt INSTALL.txt LICENSES.txt README.txt TODO.txt recursive-include src *.pyx *.pxd *.pxi *.py etree.c etree.h recursive-include src/lxml/tests *.rng *.xslt *.xml -recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc mkhtml.py +recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc +recursive-include doc mkhtml.py rest2html.py exclude doc/pyrex.txt From scoder at codespeak.net Fri Jun 9 06:59:53 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 06:59:53 +0200 (CEST) Subject: [Lxml-checkins] r28567 - lxml/branch/lxml-1.0 Message-ID: <20060609045953.3907810053@code0.codespeak.net> Author: scoder Date: Fri Jun 9 06:59:47 2006 New Revision: 28567 Modified: lxml/branch/lxml-1.0/MANIFEST.in Log: added rest2html.py to MANIFEST.in Modified: lxml/branch/lxml-1.0/MANIFEST.in ============================================================================== --- lxml/branch/lxml-1.0/MANIFEST.in (original) +++ lxml/branch/lxml-1.0/MANIFEST.in Fri Jun 9 06:59:47 2006 @@ -5,5 +5,6 @@ include CHANGES.txt CREDITS.txt INSTALL.txt LICENSES.txt README.txt TODO.txt recursive-include src *.pyx *.pxd *.pxi *.py etree.c etree.h recursive-include src/lxml/tests *.rng *.xslt *.xml -recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc mkhtml.py +recursive-include doc *.txt *.html *.css *.xml *.mgp pubkey.asc +recursive-include doc mkhtml.py rest2html.py exclude doc/pyrex.txt From scoder at codespeak.net Fri Jun 9 07:40:33 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 07:40:33 +0200 (CEST) Subject: [Lxml-checkins] r28568 - lxml/trunk/doc Message-ID: <20060609054033.EFB4610036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 07:40:32 2006 New Revision: 28568 Modified: lxml/trunk/doc/main.txt lxml/trunk/doc/mkhtml.py Log: add pubkey.asc to web site Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Fri Jun 9 07:40:32 2006 @@ -20,8 +20,10 @@ The best way to download binary versions is to visit `lxml at the Python cheeseshop`_. It has the source, eggs and installers for various platforms. +The source distribution is signed with `this key`_. .. _`lxml at the Python cheeseshop`: http://cheeseshop.python.org/pypi/lxml/ +.. _`this key`: pubkey.asc Please take a look at the `installation instructions`_! Modified: lxml/trunk/doc/mkhtml.py ============================================================================== --- lxml/trunk/doc/mkhtml.py (original) +++ lxml/trunk/doc/mkhtml.py Fri Jun 9 07:40:32 2006 @@ -1,4 +1,4 @@ -import os, sys +import os, shutil, sys def publish(dirname, lxml_path, release): if not os.path.exists(dirname): @@ -6,8 +6,11 @@ doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') + pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' + shutil.copy(pubkey, dirname) + for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', 'build.txt', 'FAQ.txt', 'performance.txt', 'resolvers.txt']: From scoder at codespeak.net Fri Jun 9 07:40:54 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 07:40:54 +0200 (CEST) Subject: [Lxml-checkins] r28569 - lxml/branch/lxml-1.0/doc Message-ID: <20060609054054.E6AE710036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 07:40:53 2006 New Revision: 28569 Modified: lxml/branch/lxml-1.0/doc/main.txt lxml/branch/lxml-1.0/doc/mkhtml.py Log: add pubkey.asc to web site Modified: lxml/branch/lxml-1.0/doc/main.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/main.txt (original) +++ lxml/branch/lxml-1.0/doc/main.txt Fri Jun 9 07:40:53 2006 @@ -20,8 +20,10 @@ The best way to download binary versions is to visit `lxml at the Python cheeseshop`_. It has the source, eggs and installers for various platforms. +The source distribution is signed with `this key`_. .. _`lxml at the Python cheeseshop`: http://cheeseshop.python.org/pypi/lxml/ +.. _`this key`: pubkey.asc Please take a look at the `installation instructions`_! Modified: lxml/branch/lxml-1.0/doc/mkhtml.py ============================================================================== --- lxml/branch/lxml-1.0/doc/mkhtml.py (original) +++ lxml/branch/lxml-1.0/doc/mkhtml.py Fri Jun 9 07:40:53 2006 @@ -6,8 +6,11 @@ doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') + pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' + shutil.copy(pubkey, dirname) + for name in ['main.txt', 'intro.txt', 'api.txt', 'compatibility.txt', 'extensions.txt', 'namespace_extensions.txt', 'sax.txt', 'build.txt', 'FAQ.txt', 'performance.txt', 'resolvers.txt']: From scoder at codespeak.net Fri Jun 9 07:46:06 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 07:46:06 +0200 (CEST) Subject: [Lxml-checkins] r28570 - lxml/tag/lxml-1.0.1 Message-ID: <20060609054606.58BF810036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 07:46:05 2006 New Revision: 28570 Added: lxml/tag/lxml-1.0.1/ - copied from r28569, lxml/branch/lxml-1.0/ Log: tag for lxml 1.0.1 From faassen at codespeak.net Fri Jun 9 11:04:00 2006 From: faassen at codespeak.net (faassen at codespeak.net) Date: Fri, 9 Jun 2006 11:04:00 +0200 (CEST) Subject: [Lxml-checkins] r28572 - lxml/branch/lxml-1.0/doc Message-ID: <20060609090400.BD3B010053@code0.codespeak.net> Author: faassen Date: Fri Jun 9 11:03:58 2006 New Revision: 28572 Modified: lxml/branch/lxml-1.0/doc/main.txt Log: Actually announce lxml 1.0.1. Modified: lxml/branch/lxml-1.0/doc/main.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/main.txt (original) +++ lxml/branch/lxml-1.0/doc/main.txt Fri Jun 9 11:03:58 2006 @@ -29,6 +29,8 @@ .. _`installation instructions`: installation.html +* `lxml 1.0.1`_, released 2006-06-09 (`changes for 1.0.1`_) + * `lxml 1.0`_, released 2006-06-01 (`changes for 1.0`_) * `lxml 0.9.2`_, released 2006-05-10 (`changes for 0.9.2`_) @@ -47,6 +49,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 1.0.1`: lxml-1.0.1.tgz .. _`lxml 1.0`: lxml-1.0.tgz .. _`lxml 0.9.2`: lxml-0.9.2.tgz .. _`lxml 0.9.1`: lxml-0.9.1.tgz @@ -57,6 +60,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`CHANGES for 1.0.1`: changes-1.0.1.html .. _`CHANGES for 1.0`: changes-1.0.html .. _`CHANGES for 0.9.2`: changes-0.9.2.html .. _`CHANGES for 0.9.1`: changes-0.9.1.html From scoder at codespeak.net Fri Jun 9 11:25:36 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 11:25:36 +0200 (CEST) Subject: [Lxml-checkins] r28573 - in lxml/trunk: . doc Message-ID: <20060609092536.566A610034@code0.codespeak.net> Author: scoder Date: Fri Jun 9 11:25:32 2006 New Revision: 28573 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/main.txt Log: doc updates regarding 1.0.1 release Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 9 11:25:32 2006 @@ -7,8 +7,6 @@ Features added -------------- -* Repeated calls to Element.attrib now efficiently return the same instance - * Element iteration over XPath axes: * Element.iterdescendants() iterates over the descendants of an element @@ -25,6 +23,18 @@ Bugs fixed ---------- + +1.0.1 (2006-06-09) +================== + +Features added +-------------- + +* Repeated calls to Element.attrib now efficiently return the same instance + +Bugs fixed +---------- + * Document deallocation could crash in certain garbage collection scenarios * Extension function calls in XSLT variable declarations could break the Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Fri Jun 9 11:25:32 2006 @@ -29,6 +29,8 @@ .. _`installation instructions`: installation.html +* `lxml 1.0.1`_, released 2006-06-09 (`changes for 1.0.1`_) + * `lxml 1.0`_, released 2006-06-01 (`changes for 1.0`_) * `lxml 0.9.2`_, released 2006-05-10 (`changes for 0.9.2`_) @@ -47,6 +49,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 1.0.1`: lxml-1.0.1.tgz .. _`lxml 1.0`: lxml-1.0.tgz .. _`lxml 0.9.2`: lxml-0.9.2.tgz .. _`lxml 0.9.1`: lxml-0.9.1.tgz @@ -57,6 +60,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`CHANGES for 1.0.1`: changes-1.0.1.html .. _`CHANGES for 1.0`: changes-1.0.html .. _`CHANGES for 0.9.2`: changes-0.9.2.html .. _`CHANGES for 0.9.1`: changes-0.9.1.html From scoder at codespeak.net Fri Jun 9 18:57:34 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 18:57:34 +0200 (CEST) Subject: [Lxml-checkins] r28594 - lxml/trunk Message-ID: <20060609165734.98E3410068@code0.codespeak.net> Author: scoder Date: Fri Jun 9 18:57:33 2006 New Revision: 28594 Modified: lxml/trunk/bench.py Log: benchmarks for setting el.text and getting text on iteration Modified: lxml/trunk/bench.py ============================================================================== --- lxml/trunk/bench.py (original) +++ lxml/trunk/bench.py Fri Jun 9 18:57:33 2006 @@ -431,6 +431,16 @@ for i in repeat: child.text + def bench_set_text(self, root): + text = _TEXT + for child in root: + child.text = text + + def bench_set_utext(self, root): + text = _UTEXT + for child in root: + child.text = text + @onlylib('lxe') def bench_index(self, root): for child in root: @@ -458,6 +468,9 @@ def bench_getiterator_tag_all(self, root): list(root.getiterator(self.SEARCH_TAG)) + def bench_getiterator_tag_text(self, root): + [ e.text for e in root.getiterator(self.SEARCH_TAG) ] + def bench_findall(self, root): root.findall(".//*") From scoder at codespeak.net Fri Jun 9 19:00:05 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 19:00:05 +0200 (CEST) Subject: [Lxml-checkins] r28595 - lxml/trunk/src/lxml Message-ID: <20060609170005.AB79910064@code0.codespeak.net> Author: scoder Date: Fri Jun 9 19:00:01 2006 New Revision: 28595 Modified: lxml/trunk/src/lxml/apihelpers.pxi lxml/trunk/src/lxml/proxy.pxi lxml/trunk/src/lxml/python.pxd Log: replace call to xmlReconciliateNs by new function _fixNamespaces that 'does what we want' Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Fri Jun 9 19:00:01 2006 @@ -272,6 +272,72 @@ return cstd.strcmp(c_node.name, c_name) == 0 and \ cstd.strcmp(c_node.ns.href, c_href) == 0 +cdef void _fixNamespaces(_Document doc, xmlNode* c_element): + """Fix the xmlNs pointers of a node and its subtree that were moved. + + Mainly copied from libxml2's xmlReconciliateNs, except for certain bugs. + """ + cdef xmlDoc* c_doc + cdef xmlNode* c_start_node + cdef xmlNode* c_node + cdef xmlNs** c_ns_new_cache + cdef xmlNs** c_ns_old_cache + cdef xmlNs* c_ns + cdef python.size_t i, c_cache_size, c_cache_last + + c_doc = doc._c_doc + c_start_node = c_element + c_ns_new_cache = NULL + c_ns_old_cache = NULL + c_cache_size = 0 + c_cache_last = 0 + tree.BEGIN_FOR_EACH_ELEMENT_FROM(c_element, c_element, 1) + c_node = c_element + while c_node is not NULL: + if c_node.ns is not NULL: + c_ns = c_node.ns + for i from 0 <= i < c_cache_last: + if c_ns is c_ns_old_cache[i]: + c_node.ns = c_ns_new_cache[i] + c_ns = NULL + break + if c_ns is not NULL: + # not in cache, must find a replacement from this document + c_ns = doc._findOrBuildNodeNs(c_element, c_ns.href) + if c_ns is NULL: + python.PyMem_Free(c_ns_old_cache) + python.PyMem_Free(c_ns_new_cache) + python.PyErr_NoMemory() + if c_cache_last >= c_cache_size: + # must resize cache + if c_cache_size == 0: + c_cache_size = 20 + else: + c_cache_size = c_cache_size * 2 + c_ns_new_cache = python.PyMem_Realloc( + c_ns_new_cache, c_cache_size * sizeof(xmlNs*)) + if c_ns_new_cache is NULL: + python.PyMem_Free(c_ns_old_cache) + python.PyErr_NoMemory() + c_ns_old_cache = python.PyMem_Realloc( + c_ns_old_cache, c_cache_size * sizeof(xmlNs*)) + if c_ns_old_cache is NULL: + python.PyMem_Free(c_ns_new_cache) + python.PyErr_NoMemory() + c_ns_new_cache[c_cache_last] = c_ns + c_ns_old_cache[c_cache_last] = c_node.ns + c_cache_last = c_cache_last + 1 + c_node.ns = c_ns + if c_node is c_element: + c_node = c_element.properties + else: + c_node = c_node.next + tree.END_FOR_EACH_ELEMENT_FROM(c_element) + if c_ns_new_cache is not NULL: + python.PyMem_Free(c_ns_new_cache) + if c_ns_old_cache is not NULL: + python.PyMem_Free(c_ns_old_cache) + cdef void _removeNode(xmlNode* c_node): """Unlink and free a node and subnodes if possible. """ Modified: lxml/trunk/src/lxml/proxy.pxi ============================================================================== --- lxml/trunk/src/lxml/proxy.pxi (original) +++ lxml/trunk/src/lxml/proxy.pxi Fri Jun 9 19:00:01 2006 @@ -168,7 +168,8 @@ tree below (including the current node). It also reconciliates namespaces so they're correct inside the new environment. """ - tree.xmlReconciliateNs(doc._c_doc, node._c_node) + _fixNamespaces(doc, node._c_node) + #tree.xmlReconciliateNs(doc._c_doc, node._c_node) if node._doc is not doc: node._doc = doc changeDocumentBelow(node._c_node, doc) Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Fri Jun 9 19:00:01 2006 @@ -54,7 +54,9 @@ cdef int PyObject_SetAttr(object o, object name, object value) cdef void* PyMem_Malloc(size_t size) + cdef void* PyMem_Realloc(void* p, size_t size) cdef void PyMem_Free(void* p) + cdef object PyErr_NoMemory() cdef extern from "etree.h": # redefines some functions as macros cdef int _isString(object obj) From scoder at codespeak.net Fri Jun 9 19:14:25 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 19:14:25 +0200 (CEST) Subject: [Lxml-checkins] r28596 - in lxml/trunk: . src/lxml Message-ID: <20060609171425.DB00C10036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 19:14:23 2006 New Revision: 28596 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.h lxml/trunk/src/lxml/htmlparser.pxd lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/xmlparser.pxd Log: globally enable PARSE_COMPACT in parser options for XML and HTML (+ conditional compilation fix for libxml2 < 2.6.21) Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 9 19:14:23 2006 @@ -7,6 +7,9 @@ Features added -------------- +* Parsers enable the COMPACT option that parses faster and reduces the memory + footprint for small text nodes + * Element iteration over XPath axes: * Element.iterdescendants() iterates over the descendants of an element Modified: lxml/trunk/src/lxml/etree.h ============================================================================== --- lxml/trunk/src/lxml/etree.h (original) +++ lxml/trunk/src/lxml/etree.h Fri Jun 9 19:14:23 2006 @@ -16,6 +16,14 @@ #endif #endif +/* XML_PARSE_COMPACT was added in libxml2 2.6.21 */ +#include "libxml/xmlversion.h" +#if LIBXML_VERSION < 20621 +#define XML_PARSE_COMPACT 0 +#define HTML_PARSE_COMPACT 0 +#endif + +/* Redefinition of some Python builtins as C functions */ #define isinstance(o,c) PyObject_IsInstance(o,c) #define issubclass(c,csuper) PyObject_IsSubclass(c,csuper) #define hasattr(o,a) PyObject_HasAttr(o,a) Modified: lxml/trunk/src/lxml/htmlparser.pxd ============================================================================== --- lxml/trunk/src/lxml/htmlparser.pxd (original) +++ lxml/trunk/src/lxml/htmlparser.pxd Fri Jun 9 19:14:23 2006 @@ -10,9 +10,9 @@ HTML_PARSE_PEDANTIC # pedantic error reporting HTML_PARSE_NOBLANKS # remove blank nodes HTML_PARSE_NONET # Forbid network access -# libxml2 2.6.21+ only: -# HTML_PARSE_RECOVER # Relaxed parsing -# HTML_PARSE_COMPACT # compact small text nodes + # libxml2 2.6.21+ only: + HTML_PARSE_RECOVER # Relaxed parsing + HTML_PARSE_COMPACT # compact small text nodes cdef xmlParserCtxt* htmlCreateMemoryParserCtxt(char* buffer, int size) cdef xmlParserCtxt* htmlCreateFileParserCtxt(char* filename, char* encoding) Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Fri Jun 9 19:14:23 2006 @@ -437,6 +437,7 @@ cdef int _XML_DEFAULT_PARSE_OPTIONS _XML_DEFAULT_PARSE_OPTIONS = ( xmlparser.XML_PARSE_NOENT | + xmlparser.XML_PARSE_COMPACT | xmlparser.XML_PARSE_NOCDATA ) @@ -560,7 +561,7 @@ ############################################################ cdef int _HTML_DEFAULT_PARSE_OPTIONS -_HTML_DEFAULT_PARSE_OPTIONS = 0 +_HTML_DEFAULT_PARSE_OPTIONS = htmlparser.HTML_PARSE_COMPACT # 0 cdef class HTMLParser(_BaseParser): """The HTML parser. This parser allows reading HTML into a normal XML Modified: lxml/trunk/src/lxml/xmlparser.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlparser.pxd (original) +++ lxml/trunk/src/lxml/xmlparser.pxd Fri Jun 9 19:14:23 2006 @@ -45,7 +45,7 @@ XML_PARSE_NOCDATA = 16384 # merge CDATA as text nodes XML_PARSE_NOXINCNODE = 32768 # do not generate XINCLUDE START/END nodes # libxml2 2.6.21+ only: - #XML_PARSE_COMPACT = 65536 # compact small text nodes + XML_PARSE_COMPACT = 65536 # compact small text nodes cdef void xmlInitParser() cdef int xmlLineNumbersDefault(int onoff) From scoder at codespeak.net Fri Jun 9 20:18:18 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 20:18:18 +0200 (CEST) Subject: [Lxml-checkins] r28598 - lxml/trunk/doc Message-ID: <20060609181818.C8BF310036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 20:18:17 2006 New Revision: 28598 Modified: lxml/trunk/doc/sax.txt Log: doc/sax.txt: say that we always call the namespace aware *NS methods of the content handler Modified: lxml/trunk/doc/sax.txt ============================================================================== --- lxml/trunk/doc/sax.txt (original) +++ lxml/trunk/doc/sax.txt Fri Jun 9 20:18:17 2006 @@ -1,11 +1,11 @@ Sax support =========== -In this document we'll describe lxml's SAX support. lxml has support -for producing SAX events for an ElementTree or Element. lxml can also -turn SAX events into an ElementTree. The SAX API used by lxml is -compatible with that in the Python core (xml.sax), so is useful for -interfacing lxml with code that uses the Python core SAX facilities. +In this document we'll describe lxml's SAX support. lxml has support for +producing SAX events for an ElementTree or Element. lxml can also turn SAX +events into an ElementTree. The SAX API used by lxml is compatible with that +in the Python core (xml.sax), so is useful for interfacing lxml with code that +uses the Python core SAX facilities. .. contents:: .. @@ -49,8 +49,8 @@ >>> f = StringIO('Text') >>> tree = lxml.etree.parse(f) -To see whether the correct SAX events are produced, we'll write a -custom content handler:: +To see whether the correct SAX events are produced, we'll write a custom +content handler.:: >>> from xml.sax.handler import ContentHandler >>> class MyContentHandler(ContentHandler): @@ -69,8 +69,11 @@ ... def characters(self, data): ... self.text = data -Now let's produce some SAX events and handle them with this content -handler:: +Note that it only defines the startElementNS() method and not startElement(). +The SAX event generator in lxml.sax does not currently support the +namespace-unaware methods. + +To test the content handler, we can produce SAX events from the tree:: >>> handler = MyContentHandler() >>> lxml.sax.saxify(tree, handler) From scoder at codespeak.net Fri Jun 9 20:22:23 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 20:22:23 +0200 (CEST) Subject: [Lxml-checkins] r28599 - lxml/trunk/src/lxml Message-ID: <20060609182223.9BA3A10036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 20:22:22 2006 New Revision: 28599 Modified: lxml/trunk/src/lxml/etree.pyx Log: doc updates for xinclude() Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Fri Jun 9 20:22:22 2006 @@ -527,7 +527,7 @@ return schema.validate(self) def xmlschema(self, xmlschema): - """Validate this document using other doucment. + """Validate this document using other document. xmlschema is a tree that should contain XML Schema XML. @@ -543,15 +543,17 @@ return schema.validate(self) def xinclude(self): - """Process this document, including using XInclude. + """Process the XInclude nodes in this document and include the + referenced XML fragments. """ cdef int result - # XXX what happens memory-wise with the original XInclude nodes? - # they seem to be still accessible if a reference to them has - # been made previously, but I have no idea whether they get freed - # at all. The XInclude nodes appear to be still being in the same - # parent and same document, but they must not be connected to the - # tree.. + # We cannot pass the XML_PARSE_NOXINCNODE option as this would free + # the XInclude nodes - there may still be Python references to them! + # Therefore, we allow XInclude nodes to be converted to + # XML_XINCLUDE_START nodes. XML_XINCLUDE_END nodes are added as + # siblings. Tree traversal will simply ignore them as they are not + # typed as elements. The included fragment is added between the two, + # i.e. as a sibling, which does not conflict with traversal. self._assertHasRoot() result = xinclude.xmlXIncludeProcessTree(self._context_node._c_node) if result == -1: From scoder at codespeak.net Fri Jun 9 20:43:37 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 20:43:37 +0200 (CEST) Subject: [Lxml-checkins] r28600 - lxml/trunk/src/lxml Message-ID: <20060609184337.AB45010036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 20:43:36 2006 New Revision: 28600 Modified: lxml/trunk/src/lxml/apihelpers.pxi Log: small cleanup Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Fri Jun 9 20:43:36 2006 @@ -283,7 +283,7 @@ cdef xmlNs** c_ns_new_cache cdef xmlNs** c_ns_old_cache cdef xmlNs* c_ns - cdef python.size_t i, c_cache_size, c_cache_last + cdef cstd.size_t i, c_cache_size, c_cache_last c_doc = doc._c_doc c_start_node = c_element @@ -302,7 +302,7 @@ c_ns = NULL break if c_ns is not NULL: - # not in cache, must find a replacement from this document + # not in cache, must find a replacement from *this* document c_ns = doc._findOrBuildNodeNs(c_element, c_ns.href) if c_ns is NULL: python.PyMem_Free(c_ns_old_cache) From scoder at codespeak.net Fri Jun 9 20:50:59 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 20:50:59 +0200 (CEST) Subject: [Lxml-checkins] r28601 - lxml/trunk/src/lxml Message-ID: <20060609185059.45DA910036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 20:50:55 2006 New Revision: 28601 Modified: lxml/trunk/src/lxml/apihelpers.pxi Log: small cleanup Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Fri Jun 9 20:50:55 2006 @@ -278,7 +278,6 @@ Mainly copied from libxml2's xmlReconciliateNs, except for certain bugs. """ cdef xmlDoc* c_doc - cdef xmlNode* c_start_node cdef xmlNode* c_node cdef xmlNs** c_ns_new_cache cdef xmlNs** c_ns_old_cache @@ -286,7 +285,6 @@ cdef cstd.size_t i, c_cache_size, c_cache_last c_doc = doc._c_doc - c_start_node = c_element c_ns_new_cache = NULL c_ns_old_cache = NULL c_cache_size = 0 From scoder at codespeak.net Fri Jun 9 21:13:55 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 21:13:55 +0200 (CEST) Subject: [Lxml-checkins] r28602 - in lxml/trunk: . src/lxml Message-ID: <20060609191355.4CA9C10036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 21:13:53 2006 New Revision: 28602 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.h lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/proxy.pxi Log: removed XML_PARSE_COMPACT option, not considered safe when modifying the tree Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 9 21:13:53 2006 @@ -7,9 +7,6 @@ Features added -------------- -* Parsers enable the COMPACT option that parses faster and reduces the memory - footprint for small text nodes - * Element iteration over XPath axes: * Element.iterdescendants() iterates over the descendants of an element Modified: lxml/trunk/src/lxml/etree.h ============================================================================== --- lxml/trunk/src/lxml/etree.h (original) +++ lxml/trunk/src/lxml/etree.h Fri Jun 9 21:13:53 2006 @@ -17,11 +17,13 @@ #endif /* XML_PARSE_COMPACT was added in libxml2 2.6.21 */ +/* #include "libxml/xmlversion.h" #if LIBXML_VERSION < 20621 #define XML_PARSE_COMPACT 0 #define HTML_PARSE_COMPACT 0 #endif +*/ /* Redefinition of some Python builtins as C functions */ #define isinstance(o,c) PyObject_IsInstance(o,c) Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Fri Jun 9 21:13:53 2006 @@ -437,7 +437,6 @@ cdef int _XML_DEFAULT_PARSE_OPTIONS _XML_DEFAULT_PARSE_OPTIONS = ( xmlparser.XML_PARSE_NOENT | - xmlparser.XML_PARSE_COMPACT | xmlparser.XML_PARSE_NOCDATA ) @@ -561,7 +560,7 @@ ############################################################ cdef int _HTML_DEFAULT_PARSE_OPTIONS -_HTML_DEFAULT_PARSE_OPTIONS = htmlparser.HTML_PARSE_COMPACT # 0 +_HTML_DEFAULT_PARSE_OPTIONS = 0 cdef class HTMLParser(_BaseParser): """The HTML parser. This parser allows reading HTML into a normal XML Modified: lxml/trunk/src/lxml/proxy.pxi ============================================================================== --- lxml/trunk/src/lxml/proxy.pxi (original) +++ lxml/trunk/src/lxml/proxy.pxi Fri Jun 9 21:13:53 2006 @@ -168,8 +168,8 @@ tree below (including the current node). It also reconciliates namespaces so they're correct inside the new environment. """ - _fixNamespaces(doc, node._c_node) - #tree.xmlReconciliateNs(doc._c_doc, node._c_node) + #_fixNamespaces(doc, node._c_node) + tree.xmlReconciliateNs(doc._c_doc, node._c_node) if node._doc is not doc: node._doc = doc changeDocumentBelow(node._c_node, doc) From scoder at codespeak.net Fri Jun 9 21:16:24 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 21:16:24 +0200 (CEST) Subject: [Lxml-checkins] r28603 - lxml/trunk/src/lxml Message-ID: <20060609191624.99DEF10036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 21:16:23 2006 New Revision: 28603 Modified: lxml/trunk/src/lxml/apihelpers.pxi Log: mark _fixNamespaces as having potential problems with XInclude start nodes, which might have left-over children and ns definitions Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Fri Jun 9 21:16:23 2006 @@ -276,6 +276,10 @@ """Fix the xmlNs pointers of a node and its subtree that were moved. Mainly copied from libxml2's xmlReconciliateNs, except for certain bugs. + + Note that this function does not currently traverse XINCLUDE_START nodes, + which *might* also contain namespace definitions (as well as the children + they *might* have). """ cdef xmlDoc* c_doc cdef xmlNode* c_node From scoder at codespeak.net Fri Jun 9 21:18:58 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 9 Jun 2006 21:18:58 +0200 (CEST) Subject: [Lxml-checkins] r28604 - lxml/trunk/src/lxml Message-ID: <20060609191858.7E50010036@code0.codespeak.net> Author: scoder Date: Fri Jun 9 21:18:57 2006 New Revision: 28604 Modified: lxml/trunk/src/lxml/apihelpers.pxi lxml/trunk/src/lxml/proxy.pxi Log: removed _fixNamespaces function, useless after reverting to original xmlReconciliateNS call Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Fri Jun 9 21:18:57 2006 @@ -272,74 +272,6 @@ return cstd.strcmp(c_node.name, c_name) == 0 and \ cstd.strcmp(c_node.ns.href, c_href) == 0 -cdef void _fixNamespaces(_Document doc, xmlNode* c_element): - """Fix the xmlNs pointers of a node and its subtree that were moved. - - Mainly copied from libxml2's xmlReconciliateNs, except for certain bugs. - - Note that this function does not currently traverse XINCLUDE_START nodes, - which *might* also contain namespace definitions (as well as the children - they *might* have). - """ - cdef xmlDoc* c_doc - cdef xmlNode* c_node - cdef xmlNs** c_ns_new_cache - cdef xmlNs** c_ns_old_cache - cdef xmlNs* c_ns - cdef cstd.size_t i, c_cache_size, c_cache_last - - c_doc = doc._c_doc - c_ns_new_cache = NULL - c_ns_old_cache = NULL - c_cache_size = 0 - c_cache_last = 0 - tree.BEGIN_FOR_EACH_ELEMENT_FROM(c_element, c_element, 1) - c_node = c_element - while c_node is not NULL: - if c_node.ns is not NULL: - c_ns = c_node.ns - for i from 0 <= i < c_cache_last: - if c_ns is c_ns_old_cache[i]: - c_node.ns = c_ns_new_cache[i] - c_ns = NULL - break - if c_ns is not NULL: - # not in cache, must find a replacement from *this* document - c_ns = doc._findOrBuildNodeNs(c_element, c_ns.href) - if c_ns is NULL: - python.PyMem_Free(c_ns_old_cache) - python.PyMem_Free(c_ns_new_cache) - python.PyErr_NoMemory() - if c_cache_last >= c_cache_size: - # must resize cache - if c_cache_size == 0: - c_cache_size = 20 - else: - c_cache_size = c_cache_size * 2 - c_ns_new_cache = python.PyMem_Realloc( - c_ns_new_cache, c_cache_size * sizeof(xmlNs*)) - if c_ns_new_cache is NULL: - python.PyMem_Free(c_ns_old_cache) - python.PyErr_NoMemory() - c_ns_old_cache = python.PyMem_Realloc( - c_ns_old_cache, c_cache_size * sizeof(xmlNs*)) - if c_ns_old_cache is NULL: - python.PyMem_Free(c_ns_new_cache) - python.PyErr_NoMemory() - c_ns_new_cache[c_cache_last] = c_ns - c_ns_old_cache[c_cache_last] = c_node.ns - c_cache_last = c_cache_last + 1 - c_node.ns = c_ns - if c_node is c_element: - c_node = c_element.properties - else: - c_node = c_node.next - tree.END_FOR_EACH_ELEMENT_FROM(c_element) - if c_ns_new_cache is not NULL: - python.PyMem_Free(c_ns_new_cache) - if c_ns_old_cache is not NULL: - python.PyMem_Free(c_ns_old_cache) - cdef void _removeNode(xmlNode* c_node): """Unlink and free a node and subnodes if possible. """ Modified: lxml/trunk/src/lxml/proxy.pxi ============================================================================== --- lxml/trunk/src/lxml/proxy.pxi (original) +++ lxml/trunk/src/lxml/proxy.pxi Fri Jun 9 21:18:57 2006 @@ -168,7 +168,6 @@ tree below (including the current node). It also reconciliates namespaces so they're correct inside the new environment. """ - #_fixNamespaces(doc, node._c_node) tree.xmlReconciliateNs(doc._c_doc, node._c_node) if node._doc is not doc: node._doc = doc From scoder at codespeak.net Sat Jun 10 09:43:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 09:43:10 +0200 (CEST) Subject: [Lxml-checkins] r28611 - lxml/trunk/doc Message-ID: <20060610074310.35D5D10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 09:43:07 2006 New Revision: 28611 Modified: lxml/trunk/doc/sax.txt Log: clarification on namespace-aware processing in doc/sax.txt Modified: lxml/trunk/doc/sax.txt ============================================================================== --- lxml/trunk/doc/sax.txt (original) +++ lxml/trunk/doc/sax.txt Sat Jun 10 09:43:07 2006 @@ -70,8 +70,8 @@ ... self.text = data Note that it only defines the startElementNS() method and not startElement(). -The SAX event generator in lxml.sax does not currently support the -namespace-unaware methods. +The SAX event generator in lxml.sax currently only supports namespace-aware +processing. To test the content handler, we can produce SAX events from the tree:: From scoder at codespeak.net Sat Jun 10 10:50:04 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 10:50:04 +0200 (CEST) Subject: [Lxml-checkins] r28612 - in lxml/trunk: . src/lxml Message-ID: <20060610085004.8EF7110053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 10:49:59 2006 New Revision: 28612 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/serializer.pxi lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/src/lxml/xmlparser.pxd lxml/trunk/src/lxml/xslt.pxi Log: merge of threading branch, including a few more bug fixes regarding threaded ref-counting etc. Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sat Jun 10 10:49:59 2006 @@ -7,6 +7,16 @@ Features added -------------- +* Threading support in parsers and serializers: + + * All in-memory operations (tostring, parse(StringIO), etc.) free the GIL + + * File operations (on file names) free the GIL + + * Reading from file-like objects frees the GIL and reacquires it for reading + + * Serialisation to file-like objects is single-threaded (high lock overhead) + * Element iteration over XPath axes: * Element.iterdescendants() iterates over the descendants of an element Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sat Jun 10 10:49:59 2006 @@ -23,6 +23,12 @@ cdef object re import re +cdef object thread +try: + import thread +except ImportError: + pass + # the rules # any libxml C argument/variable is prefixed with c_ # any non-public function/class is prefixed with an underscore @@ -146,18 +152,18 @@ cdef void _store_exception(self, exception): self._exc_info = (exception, None, None) - cdef _has_raised(self): + cdef int _has_raised(self): return self._exc_info is not None cdef _raise_if_stored(self): - _exc_info = self._exc_info - if _exc_info is not None: - self._exc_info = None - type, value, traceback = _exc_info - if traceback is None and value is None: - raise type - else: - raise type, value, traceback + if self._exc_info is None: + return + type, value, traceback = self._exc_info + self._exc_info = None + if value is None and traceback is None: + raise type + else: + raise type, value, traceback cdef class _BaseParser # forward declaration @@ -300,7 +306,7 @@ result._c_doc = c_doc result._ns_counter = 0 if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() result._parser = parser.copy() return result Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sat Jun 10 10:49:59 2006 @@ -18,49 +18,93 @@ """Global parser context to share the string dictionary. """ cdef xmlDict* _c_dict - def __init__(self): - self._c_dict = NULL - + cdef _BaseParser _default_parser def __dealloc__(self): if self._c_dict is not NULL: xmlparser.xmlDictFree(self._c_dict) + cdef void _initMainParserContext(self): + cdef python.PyObject* thread_dict + cdef python.PyObject* result + thread_dict = python.PyThreadState_GetDict() + if thread_dict is not NULL: + python.PyDict_SetItem(thread_dict, "_ParserContext", self) + + cdef _ParserContext _findThreadParserContext(self): + "Find the _ParserContext for the current thread" + cdef python.PyObject* thread_dict + cdef python.PyObject* result + thread_dict = python.PyThreadState_GetDict() + if thread_dict is NULL: + return self + d = thread_dict + result = python.PyDict_GetItem(d, "_ParserContext") + if result is not NULL: + return result + context = _ParserContext() + python.PyDict_SetItem(d, "_ParserContext", context) + return context + + cdef void _setDefaultParser(self, _BaseParser parser): + cdef _ParserContext context + context = self._findThreadParserContext() + context._default_parser = parser + + cdef _BaseParser _getDefaultParser(self): + cdef _ParserContext context + context = self._findThreadParserContext() + if context._default_parser is None: + if self._default_parser is None: + self._default_parser = __DEFAULT_XML_PARSER.copy() + context._default_parser = self._default_parser.copy() + return context._default_parser + cdef void _initParserDict(self, xmlParserCtxt* pctxt): "Assure we always use the same string dictionary." - if self._c_dict is NULL or self._c_dict is pctxt.dict: + cdef _ParserContext context + context = self._findThreadParserContext() + if context._c_dict is NULL or context._c_dict is pctxt.dict: return if pctxt.dict is not NULL: xmlparser.xmlDictFree(pctxt.dict) - pctxt.dict = self._c_dict + pctxt.dict = context._c_dict xmlparser.xmlDictReference(pctxt.dict) cdef void _initXPathParserDict(self, xpath.xmlXPathContext* pctxt): "Assure we always use the same string dictionary." - if self._c_dict is NULL or self._c_dict is pctxt.dict: + cdef _ParserContext context + context = self._findThreadParserContext() + if context._c_dict is NULL or context._c_dict is pctxt.dict: return if pctxt.dict is not NULL: xmlparser.xmlDictFree(pctxt.dict) - pctxt.dict = self._c_dict + pctxt.dict = context._c_dict xmlparser.xmlDictReference(pctxt.dict) cdef void _initDocDict(self, xmlDoc* result): "Store dict of last object parsed if no shared dict yet" + cdef _ParserContext context if result is NULL: return - if self._c_dict is NULL: + context = self._findThreadParserContext() + if context._c_dict is NULL: #print "storing shared dict" if result.dict is NULL: - result.dict = xmlparser.xmlDictCreate() - self._c_dict = result.dict - xmlparser.xmlDictReference(self._c_dict) - elif result.dict != self._c_dict: + if self._c_dict is NULL: + result.dict = xmlparser.xmlDictCreate() + else: + result.dict = xmlparser.xmlDictCreateSub(self._c_dict) + context._c_dict = result.dict + xmlparser.xmlDictReference(context._c_dict) + elif result.dict != context._c_dict: if result.dict is not NULL: xmlparser.xmlDictFree(result.dict) - result.dict = self._c_dict + result.dict = context._c_dict xmlparser.xmlDictReference(result.dict) cdef _ParserContext __GLOBAL_PARSER_CONTEXT __GLOBAL_PARSER_CONTEXT = _ParserContext() +__GLOBAL_PARSER_CONTEXT._initMainParserContext() ############################################################ ## support for Python unicode I/O @@ -138,20 +182,27 @@ cdef xmlDoc* _readDoc(self, xmlParserCtxt* ctxt, int options, LxmlParserType parser_type): + cdef python.PyThreadState* state + cdef xmlDoc* result + state = python.PyEval_SaveThread() if parser_type == LXML_XML_PARSER: - return xmlparser.xmlCtxtReadIO( + result = xmlparser.xmlCtxtReadIO( ctxt, _readFilelikeParser, NULL, self, self._c_url, NULL, options) else: - return htmlparser.htmlCtxtReadIO( + result = htmlparser.htmlCtxtReadIO( ctxt, _readFilelikeParser, NULL, self, self._c_url, NULL, options) + python.PyEval_RestoreThread(state) + return result cdef int copyToBuffer(self, char* c_buffer, int c_size): cdef char* c_start cdef Py_ssize_t byte_count, remaining + cdef python.PyGILState_STATE gil_state if self._bytes_read < 0: return 0 + gil_state = python.PyGILState_Ensure() try: byte_count = python.PyString_GET_SIZE(self._bytes) remaining = byte_count - self._bytes_read @@ -163,15 +214,21 @@ self._bytes_read = 0 if remaining == 0: self._bytes_read = -1 + python.PyGILState_Release(gil_state) return 0 if c_size > remaining: c_size = remaining c_start = _cstr(self._bytes) + self._bytes_read + python.PyGILState_Release(gil_state) self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size + except Exception, e: + self._exc_context._store_exception(e) + python.PyGILState_Release(gil_state) + return -1 except: - self._exc_context._store_raised() + python.PyGILState_Release(gil_state) return -1 cdef int _readFilelikeParser(void* ctxt, char* c_buffer, int c_size): @@ -187,12 +244,14 @@ cdef _InputDocument doc_ref cdef _FileParserContext file_context cdef xmlparser.xmlParserInput* c_input - if c_context._private is NULL or \ - not isinstance(c_context._private, _ResolverContext): + cdef python.PyGILState_STATE gil_state + if c_context._private is NULL: if __DEFAULT_ENTITY_LOADER is NULL: return NULL return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) + gil_state = python.PyGILState_Ensure() + context = <_ResolverContext>c_context._private try: if c_url is NULL: url = None @@ -203,13 +262,17 @@ else: pubid = funicode(c_pubid) - context = <_ResolverContext>c_context._private doc_ref = context._resolvers.resolve(url, pubid, context) + except Exception, e: + context._store_exception(e) + python.PyGILState_Release(gil_state) + return NULL except: - context._store_raised() + python.PyGILState_Release(gil_state) return NULL if doc_ref is None: + python.PyGILState_Release(gil_state) if __DEFAULT_ENTITY_LOADER is NULL: return NULL return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) @@ -230,6 +293,7 @@ if data is not None: context._storage.add(data) + python.PyGILState_Release(gil_state) return c_input cdef xmlparser.xmlExternalEntityLoader __DEFAULT_ENTITY_LOADER @@ -248,6 +312,8 @@ cdef _ResolverContext _context cdef LxmlParserType _parser_type cdef xmlParserCtxt* _parser_ctxt + cdef object _lockParser + cdef object _unlockParser def __init__(self): cdef xmlParserCtxt* pctxt @@ -262,19 +328,30 @@ self._parser_ctxt = pctxt if pctxt is NULL: raise ParserError, "Failed to create parser context" + if thread is None: + # no threading + self._lockParser = self.__dummy + self._unlockParser = self.__dummy + else: + lock = thread.allocate_lock() + self._lockParser = lock.acquire + self._unlockParser = lock.release self._error_log = _ErrorLog() self.resolvers = _ResolverRegistry() self._context = _ResolverContext(self.resolvers) pctxt._private = self._context def __dealloc__(self): - if self._parser_ctxt != NULL: + if self._parser_ctxt is not NULL: xmlparser.xmlFreeParserCtxt(self._parser_ctxt) property error_log: def __get__(self): return self._error_log.copy() + def __dummy(self): + pass + def copy(self): "Create a new parser with the same configuration." cdef _BaseParser parser @@ -282,11 +359,13 @@ parser._parse_options = self._parse_options parser.resolvers = self.resolvers.copy() parser._context = _ResolverContext(parser.resolvers) + parser._parser_ctxt._private = parser._context return parser cdef xmlDoc* _parseUnicodeDoc(self, utext, char* c_filename) except NULL: """Parse unicode document, share dictionary if possible. """ + cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover @@ -300,70 +379,89 @@ return self._parseDoc(_cstr(text_utf), py_buffer_len, c_filename) buffer_len = py_buffer_len + self._lockParser() self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + try: + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - c_text = python.PyUnicode_AS_DATA(utext) - if self._parser_type == LXML_HTML_PARSER: - result = htmlparser.htmlCtxtReadMemory( - pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, - self._parse_options) - else: - result = xmlparser.xmlCtxtReadMemory( - pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, - self._parse_options) - - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, NULL, recover) + c_text = python.PyUnicode_AS_DATA(utext) + state = python.PyEval_SaveThread() + if self._parser_type == LXML_HTML_PARSER: + result = htmlparser.htmlCtxtReadMemory( + pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, + self._parse_options) + else: + result = xmlparser.xmlCtxtReadMemory( + pctxt, c_text, buffer_len, c_filename, _UNICODE_ENCODING, + self._parse_options) + python.PyEval_RestoreThread(state) + + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, NULL, recover) + finally: + self._error_log.disconnect() + self._unlockParser() cdef xmlDoc* _parseDoc(self, char* c_text, Py_ssize_t c_len, char* c_filename) except NULL: """Parse document, share dictionary if possible. """ + cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover if c_len > python.INT_MAX: raise ParserError, "string is too long to parse it with libxml2" - + self._lockParser() self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - if self._parser_type == LXML_HTML_PARSER: - result = htmlparser.htmlCtxtReadMemory( - pctxt, c_text, c_len, c_filename, NULL, self._parse_options) - else: - result = xmlparser.xmlCtxtReadMemory( - pctxt, c_text, c_len, c_filename, NULL, self._parse_options) + try: + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, NULL, recover) + state = python.PyEval_SaveThread() + if self._parser_type == LXML_HTML_PARSER: + result = htmlparser.htmlCtxtReadMemory( + pctxt, c_text, c_len, c_filename, NULL, self._parse_options) + else: + result = xmlparser.xmlCtxtReadMemory( + pctxt, c_text, c_len, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) + + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, NULL, recover) + finally: + self._error_log.disconnect() + self._unlockParser() cdef xmlDoc* _parseDocFromFile(self, char* c_filename) except NULL: + cdef python.PyThreadState* state cdef xmlDoc* result cdef xmlParserCtxt* pctxt cdef int recover + result = NULL + self._lockParser() self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - if self._parser_type == LXML_HTML_PARSER: - result = htmlparser.htmlCtxtReadFile( - pctxt, c_filename, NULL, self._parse_options) - else: - result = xmlparser.xmlCtxtReadFile( - pctxt, c_filename, NULL, self._parse_options) + try: + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, c_filename, recover) + state = python.PyEval_SaveThread() + if self._parser_type == LXML_HTML_PARSER: + result = htmlparser.htmlCtxtReadFile( + pctxt, c_filename, NULL, self._parse_options) + else: + result = xmlparser.xmlCtxtReadFile( + pctxt, c_filename, NULL, self._parse_options) + python.PyEval_RestoreThread(state) + + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, c_filename, recover) + finally: + self._error_log.disconnect() + self._unlockParser() cdef xmlDoc* _parseDocFromFilelike(self, filelike, filename) except NULL: - # we read Python string, so we must convert to UTF-8 cdef _FileParserContext file_context cdef xmlDoc* result cdef xmlParserCtxt* pctxt @@ -373,19 +471,22 @@ c_filename = NULL else: c_filename = filename + self._lockParser() self._error_log.connect() - pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) - - file_context = _FileParserContext(filelike, self._context, filename) - result = file_context._readDoc( - pctxt, self._parse_options, self._parser_type) - - self._error_log.disconnect() - recover = self._parse_options & xmlparser.XML_PARSE_RECOVER - return _handleParseResult(pctxt, result, c_filename, recover) + try: + pctxt = self._parser_ctxt + __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + file_context = _FileParserContext(filelike, self._context, filename) + result = file_context._readDoc( + pctxt, self._parse_options, self._parser_type) + + recover = self._parse_options & xmlparser.XML_PARSE_RECOVER + return _handleParseResult(pctxt, result, c_filename, recover) + finally: + self._error_log.disconnect() + self._unlockParser() -cdef _raiseParseError(xmlParserCtxt* ctxt, char* c_filename): +cdef int _raiseParseError(xmlParserCtxt* ctxt, char* c_filename) except 0: if c_filename is not NULL and \ ctxt.lastError.domain == xmlerror.XML_FROM_IO: if ctxt.lastError.message is not NULL: @@ -533,27 +634,24 @@ cdef XMLParser __DEFAULT_XML_PARSER __DEFAULT_XML_PARSER = XMLParser() -cdef _BaseParser __DEFAULT_PARSER -__DEFAULT_PARSER = __DEFAULT_XML_PARSER +__GLOBAL_PARSER_CONTEXT._setDefaultParser(__DEFAULT_XML_PARSER) def set_default_parser(_BaseParser parser=None): - """Set a default parser. This parser is used globally whenever no parser - is supplied to the various parse functions of the lxml API. If this - function is called without a parser (or if it is None), the default parser - is reset to the original configuration. - - Note that the default parser is not thread-safe. Avoid the default parser - in multi-threaded environments. You can create a separate parser for each - thread explicitly or use a parser pool. + """Set a default parser for the current thread. This parser is used + globally whenever no parser is supplied to the various parse functions of + the lxml API. If this function is called without a parser (or if it is + None), the default parser is reset to the original configuration. + + Note that the pre-installed default parser is not thread-safe. Avoid the + default parser in multi-threaded environments. You can create a separate + parser for each thread explicitly or use a parser pool. """ - global __DEFAULT_PARSER if parser is None: - __DEFAULT_PARSER = __DEFAULT_XML_PARSER - else: - __DEFAULT_PARSER = parser + parser = __DEFAULT_XML_PARSER + __GLOBAL_PARSER_CONTEXT._setDefaultParser(parser) def get_default_parser(): - return __DEFAULT_PARSER + return __GLOBAL_PARSER_CONTEXT._getDefaultParser() ############################################################ ## HTML parser @@ -602,7 +700,7 @@ cdef char* c_text cdef Py_ssize_t c_len if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() if not filename: c_filename = NULL else: @@ -616,14 +714,14 @@ cdef xmlDoc* _parseDocFromFile(filename, _BaseParser parser) except NULL: if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() return (<_BaseParser>parser)._parseDocFromFile(_cstr(filename)) cdef xmlDoc* _parseDocFromFilelike(source, filename, _BaseParser parser) except NULL: cdef char* c_filename if parser is None: - parser = __DEFAULT_PARSER + parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() return (<_BaseParser>parser)._parseDocFromFilelike(source, filename) cdef xmlDoc* _newDoc(): Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sat Jun 10 10:49:59 2006 @@ -2,6 +2,7 @@ cdef extern from "Python.h": ctypedef struct PyObject + ctypedef struct PyThreadState ctypedef int size_t ctypedef int Py_ssize_t cdef int INT_MAX @@ -56,7 +57,17 @@ cdef void* PyMem_Malloc(size_t size) cdef void* PyMem_Realloc(void* p, size_t size) cdef void PyMem_Free(void* p) - cdef object PyErr_NoMemory() + cdef object PyErr_NoMemory() # always returns NULL to pass on exception + + ctypedef enum PyGILState_STATE: + PyGILState_LOCKED + PyGILState_UNLOCKED + + cdef PyGILState_STATE PyGILState_Ensure() + cdef void PyGILState_Release(PyGILState_STATE state) + cdef PyThreadState* PyEval_SaveThread() + cdef void PyEval_RestoreThread(PyThreadState* state) + cdef PyObject* PyThreadState_GetDict() cdef extern from "etree.h": # redefines some functions as macros cdef int _isString(object obj) Modified: lxml/trunk/src/lxml/serializer.pxi ============================================================================== --- lxml/trunk/src/lxml/serializer.pxi (original) +++ lxml/trunk/src/lxml/serializer.pxi Sat Jun 10 10:49:59 2006 @@ -3,6 +3,7 @@ cdef _tostring(_NodeBase element, encoding, int write_xml_declaration, int pretty_print): "Serialize an element to an encoded string representation of its XML tree." + cdef python.PyThreadState* state cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlBuffer* c_result_buffer cdef tree.xmlCharEncodingHandler* enchandler @@ -26,9 +27,11 @@ raise LxmlError, "Failed to create output buffer" try: + state = python.PyEval_SaveThread() _writeNodeToBuffer(c_buffer, element._c_node, c_enc, write_xml_declaration, pretty_print) tree.xmlOutputBufferFlush(c_buffer) + python.PyEval_RestoreThread(state) if c_buffer.conv is not NULL: c_result_buffer = c_buffer.conv else: @@ -42,6 +45,7 @@ cdef _tounicode(_NodeBase element, int pretty_print): "Serialize an element to the Python unicode representation of its XML tree." + cdef python.PyThreadState* state cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlBuffer* c_result_buffer if element is None: @@ -50,8 +54,10 @@ if c_buffer is NULL: raise LxmlError, "Failed to create output buffer" try: + state = python.PyEval_SaveThread() _writeNodeToBuffer(c_buffer, element._c_node, NULL, 0, pretty_print) tree.xmlOutputBufferFlush(c_buffer) + python.PyEval_RestoreThread(state) if c_buffer.conv is not NULL: c_result_buffer = c_buffer.conv else: @@ -142,6 +148,7 @@ cdef _tofilelike(f, _NodeBase element, encoding, int write_xml_declaration, int pretty_print): + cdef python.PyThreadState* state cdef _FilelikeWriter writer cdef tree.xmlOutputBuffer* c_buffer cdef tree.xmlCharEncodingHandler* enchandler @@ -159,6 +166,7 @@ filename = _utf8(f) c_buffer = tree.xmlOutputBufferCreateFilename( _cstr(filename), enchandler, 0) + state = python.PyEval_SaveThread() elif hasattr(f, 'write'): writer = _FilelikeWriter(f) c_buffer = writer._createOutputBuffer(enchandler) @@ -168,15 +176,18 @@ _writeNodeToBuffer(c_buffer, element._c_node, c_enc, write_xml_declaration, pretty_print) - tree.xmlOutputBufferClose(c_buffer) tree.xmlCharEncCloseFunc(enchandler) - if writer is not None: + if writer is None: + python.PyEval_RestoreThread(state) + else: writer._exc_context._raise_if_stored() cdef _tofilelikeC14N(f, _NodeBase element): + cdef python.PyThreadState* state cdef _FilelikeWriter writer cdef tree.xmlOutputBuffer* c_buffer + cdef char* c_filename cdef xmlDoc* c_base_doc cdef xmlDoc* c_doc cdef int bytes @@ -186,8 +197,10 @@ try: if _isString(f): filename = _utf8(f) - bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, - _cstr(filename), 0) + c_filename = _cstr(filename) + state = python.PyEval_SaveThread() + bytes = c14n.xmlC14NDocSave(c_doc, NULL, 0, NULL, 1, c_filename, 0) + python.PyEval_RestoreThread(state) elif hasattr(f, 'write'): writer = _FilelikeWriter(f) c_buffer = writer._createOutputBuffer(NULL) Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Sat Jun 10 10:49:59 2006 @@ -298,14 +298,18 @@ # local log function: forward error to logger object cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error): cdef _ErrorLog log_handler + cdef python.PyGILState_STATE gil_state if __DEBUG != 0: + gil_state = python.PyGILState_Ensure() if c_log_handler is not NULL: log_handler = <_ErrorLog>c_log_handler else: log_handler = __GLOBAL_ERROR_LOG log_handler._receive(error) + python.PyGILState_Release(gil_state) cdef void _receiveGenericError(void* c_log_handler, char* msg, ...): + cdef python.PyGILState_STATE gil_state cdef cstd.va_list args cdef _ErrorLog log_handler cdef char* c_text @@ -314,11 +318,6 @@ cdef int c_line if __DEBUG == 0 or msg == NULL or cstd.strlen(msg) < 10: return - if c_log_handler is not NULL: - log_handler = <_ErrorLog>c_log_handler - else: - log_handler = __GLOBAL_ERROR_LOG - cstd.va_start(args, msg) if cstd.strncmp(msg, '%s:', 3) == 0: c_text = cstd.va_charptr(args) @@ -338,6 +337,7 @@ c_element = NULL cstd.va_end(args) + gil_state = python.PyGILState_Ensure() try: if c_text is NULL: message = None @@ -360,10 +360,16 @@ except UnicodeDecodeError: filename = "" + if c_log_handler is not NULL: + log_handler = <_ErrorLog>c_log_handler + else: + log_handler = __GLOBAL_ERROR_LOG + log_handler._receiveGeneric(xmlerror.XML_FROM_XSLT, xmlerror.XML_ERR_OK, xmlerror.XML_ERR_ERROR, c_line, message, filename) + python.PyGILState_Release(gil_state) # dummy function: no debug output at all cdef void _nullGenericErrorFunc(void* ctxt, char* msg, ...): Modified: lxml/trunk/src/lxml/xmlparser.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlparser.pxd (original) +++ lxml/trunk/src/lxml/xmlparser.pxd Sat Jun 10 10:49:59 2006 @@ -15,6 +15,7 @@ cdef extern from "libxml/parser.h": cdef xmlDict* xmlDictCreate() + cdef xmlDict* xmlDictCreateSub(xmlDict* subdict) cdef void xmlDictFree(xmlDict* sub) cdef int xmlDictReference(xmlDict* dict) Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sat Jun 10 10:49:59 2006 @@ -57,20 +57,21 @@ cdef _XSLTResolverContext doc_resolver_context cdef _XSLTResolverContext resolver_context cdef XMLParser parser + cdef python.PyGILState_STATE gil_state # find resolver contexts of stylesheet and transformed doc c_doc = NULL doc_resolver_context = None if c_type == xslt.XSLT_LOAD_DOCUMENT: c_doc = (c_ctxt).document.doc if c_doc is not NULL and c_doc._private is not NULL: - if isinstance(c_doc._private, _XSLTResolverContext): - doc_resolver_context = <_XSLTResolverContext>c_doc._private + #if isinstance(c_doc._private, _XSLTResolverContext): + doc_resolver_context = <_XSLTResolverContext>c_doc._private c_doc = (c_ctxt).style.doc elif c_type == xslt.XSLT_LOAD_STYLESHEET: c_doc = (c_ctxt).doc - if c_doc is NULL or c_doc._private is NULL or \ - not isinstance(c_doc._private, _XSLTResolverContext): + if c_doc is NULL or c_doc._private is NULL: + #or not isinstance(c_doc._private, _XSLTResolverContext): # can't call Python without context, fall back to default loader return XSLT_DOC_DEFAULT_LOADER( c_uri, c_dict, parse_options, c_ctxt, c_type) @@ -84,6 +85,7 @@ return _copyDoc(c_doc, 1) # call the Python document loaders + gil_state = python.PyGILState_Ensure() c_doc = NULL resolver_context = xslt_resolver_context # currently use only XSLT resolvers resolvers = resolver_context._resolvers @@ -112,6 +114,7 @@ except: xslt_resolver_context._store_raised() + python.PyGILState_Release(gil_state) return NULL if c_doc is NULL: @@ -124,7 +127,9 @@ else: exception = XSLTParseError(message) xslt_resolver_context._store_exception(exception) + python.PyGILState_Release(gil_state) return NULL + python.PyGILState_Release(gil_state) if c_doc is not NULL and c_doc._private is NULL: c_doc._private = xslt_resolver_context return c_doc From scoder at codespeak.net Sat Jun 10 11:23:35 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 11:23:35 +0200 (CEST) Subject: [Lxml-checkins] r28613 - lxml/trunk/src/lxml Message-ID: <20060610092335.691CE10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 11:23:33 2006 New Revision: 28613 Modified: lxml/trunk/src/lxml/relaxng.pxi lxml/trunk/src/lxml/xmlschema.pxi Log: allow threads during validation in RelaxNG and XMLSchema (untested) Modified: lxml/trunk/src/lxml/relaxng.pxi ============================================================================== --- lxml/trunk/src/lxml/relaxng.pxi (original) +++ lxml/trunk/src/lxml/relaxng.pxi Sat Jun 10 11:23:33 2006 @@ -71,6 +71,7 @@ """Validate doc using Relax NG. Returns true if document is valid, false if not.""" + cdef python.PyThreadState* state cdef _Document doc cdef _NodeBase root_node cdef xmlDoc* c_doc @@ -82,12 +83,20 @@ self._error_log.connect() valid_ctxt = relaxng.xmlRelaxNGNewValidCtxt(self._c_schema) + if valid_ctxt is NULL: + self._error_log.disconnect() + raise RelaxNGError, "Failed to create validation context" + + state = python.PyEval_SaveThread() c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) ret = relaxng.xmlRelaxNGValidateDoc(valid_ctxt, c_doc) _destroyFakeDoc(doc._c_doc, c_doc) relaxng.xmlRelaxNGFreeValidCtxt(valid_ctxt) + + python.PyEval_RestoreThread(state) + self._error_log.disconnect() if ret == -1: raise RelaxNGValidateError, "Internal error in Relax NG validation" Modified: lxml/trunk/src/lxml/xmlschema.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlschema.pxi (original) +++ lxml/trunk/src/lxml/xmlschema.pxi Sat Jun 10 11:23:33 2006 @@ -66,6 +66,7 @@ Returns true if document is valid, false if not. """ + cdef python.PyThreadState* state cdef xmlschema.xmlSchemaValidCtxt* valid_ctxt cdef _Document doc cdef _NodeBase root_node @@ -77,12 +78,20 @@ self._error_log.connect() valid_ctxt = xmlschema.xmlSchemaNewValidCtxt(self._c_schema) + if valid_ctxt is NULL: + self._error_log.disconnect() + raise XMLSchemaError, "Failed to create validation context" + + state = python.PyEval_SaveThread() c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) ret = xmlschema.xmlSchemaValidateDoc(valid_ctxt, c_doc) _destroyFakeDoc(doc._c_doc, c_doc) xmlschema.xmlSchemaFreeValidCtxt(valid_ctxt) + + python.PyEval_RestoreThread(state) + self._error_log.disconnect() if ret == -1: raise XMLSchemaValidateError, "Internal error in XML Schema validation." From scoder at codespeak.net Sat Jun 10 18:23:20 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 18:23:20 +0200 (CEST) Subject: [Lxml-checkins] r28640 - lxml/trunk Message-ID: <20060610162320.5FD8B10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 18:23:19 2006 New Revision: 28640 Modified: lxml/trunk/CHANGES.txt Log: changelog: threading support in RelaxNG/XMLSchema Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sat Jun 10 18:23:19 2006 @@ -7,6 +7,8 @@ Features added -------------- +* Threading support in validators (RelaxNG, XMLSchema) + * Threading support in parsers and serializers: * All in-memory operations (tostring, parse(StringIO), etc.) free the GIL From scoder at codespeak.net Sat Jun 10 18:24:40 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 18:24:40 +0200 (CEST) Subject: [Lxml-checkins] r28641 - lxml/trunk/src/lxml Message-ID: <20060610162440.6482B10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 18:24:38 2006 New Revision: 28641 Modified: lxml/trunk/src/lxml/xslt.pxd lxml/trunk/src/lxml/xslt.pxi Log: rewrite of XSLT resolver function to make it 'Python-free': no INCREF/DECREF outside thread contexts Modified: lxml/trunk/src/lxml/xslt.pxd ============================================================================== --- lxml/trunk/src/lxml/xslt.pxd (original) +++ lxml/trunk/src/lxml/xslt.pxd Sat Jun 10 18:24:38 2006 @@ -19,6 +19,7 @@ xsltStylesheet* style xmlXPathContext* xpathCtxt xsltDocument* document + void* _private cdef xsltStylesheet* xsltParseStylesheetDoc(xmlDoc* doc) cdef void xsltFreeStylesheet(xsltStylesheet* sheet) Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sat Jun 10 18:24:38 2006 @@ -31,7 +31,7 @@ # xsltStylesheet->doc->_private # == _XSLTResolverContext for XSL stylesheet # -# xsltTransformContext->document->doc->_private +# xsltTransformContext->_private # == _XSLTResolverContext for transformed document # ################################################################################ @@ -48,51 +48,30 @@ self._parser = parser self._c_style_doc = NULL -cdef xmlDoc* _doc_loader(char* c_uri, tree.xmlDict* c_dict, int parse_options, - void* c_ctxt, xslt.xsltLoadType c_type): +cdef xmlDoc* _xslt_resolve_stylesheet(char* c_uri, void* context): cdef xmlDoc* c_doc - cdef _ResolverRegistry resolvers - cdef _InputDocument doc_ref - cdef _XSLTResolverContext xslt_resolver_context - cdef _XSLTResolverContext doc_resolver_context - cdef _XSLTResolverContext resolver_context - cdef XMLParser parser - cdef python.PyGILState_STATE gil_state - # find resolver contexts of stylesheet and transformed doc - c_doc = NULL - doc_resolver_context = None - if c_type == xslt.XSLT_LOAD_DOCUMENT: - c_doc = (c_ctxt).document.doc - if c_doc is not NULL and c_doc._private is not NULL: - #if isinstance(c_doc._private, _XSLTResolverContext): - doc_resolver_context = <_XSLTResolverContext>c_doc._private - c_doc = (c_ctxt).style.doc - elif c_type == xslt.XSLT_LOAD_STYLESHEET: - c_doc = (c_ctxt).doc - - if c_doc is NULL or c_doc._private is NULL: - #or not isinstance(c_doc._private, _XSLTResolverContext): - # can't call Python without context, fall back to default loader - return XSLT_DOC_DEFAULT_LOADER( - c_uri, c_dict, parse_options, c_ctxt, c_type) - - xslt_resolver_context = <_XSLTResolverContext>c_doc._private - - # quick check if we are looking for the current stylesheet - c_doc = xslt_resolver_context._c_style_doc + c_doc = (<_XSLTResolverContext>context)._c_style_doc if c_doc is not NULL and c_doc.URL is not NULL: if cstd.strcmp(c_uri, c_doc.URL) == 0: - return _copyDoc(c_doc, 1) + return c_doc + return NULL +cdef xmlDoc* _xslt_resolve_from_python(char* c_uri, void* context, + int parse_options, int* error): # call the Python document loaders - gil_state = python.PyGILState_Ensure() - c_doc = NULL - resolver_context = xslt_resolver_context # currently use only XSLT resolvers + cdef _XSLTResolverContext resolver_context + cdef _ResolverRegistry resolvers + cdef _InputDocument doc_ref + cdef xmlDoc* c_doc + + error[0] = 0 + resolver_context = <_XSLTResolverContext>context resolvers = resolver_context._resolvers try: uri = funicode(c_uri) doc_ref = resolvers.resolve(uri, None, resolver_context) + c_doc = NULL if doc_ref is not None: if doc_ref._type == PARSER_DATA_EMPTY: c_doc = _newDoc() @@ -111,33 +90,66 @@ resolver_context) if c_doc is not NULL and c_doc.URL is NULL: c_doc.URL = tree.xmlStrdup(c_uri) - + return c_doc except: - xslt_resolver_context._store_raised() - python.PyGILState_Release(gil_state) + resolver_context._store_raised() + error[0] = 1 return NULL - if c_doc is NULL: +cdef void _xslt_store_resolver_exception(char* c_uri, void* context, + xslt.xsltLoadType c_type): + message = "Cannot resolve URI %s" % funicode(c_uri) + if c_type == xslt.XSLT_LOAD_DOCUMENT: + exception = XSLTApplyError(message) + else: + exception = XSLTParseError(message) + (<_XSLTResolverContext>context)._store_exception(exception) + +cdef xmlDoc* _xslt_doc_loader(char* c_uri, tree.xmlDict* c_dict, + int parse_options, void* c_ctxt, + xslt.xsltLoadType c_type): + # no Python objects here, may be called without thread context ! + # when we declare a Python object, Pyrex will INCREF(None) ! + cdef xmlDoc* c_doc + cdef xmlDoc* result + cdef void* c_pcontext + cdef int error + cdef python.PyGILState_STATE gil_state + # find resolver contexts of stylesheet and transformed doc + if c_type == xslt.XSLT_LOAD_DOCUMENT: + # transformation time + c_pcontext = (c_ctxt)._private + elif c_type == xslt.XSLT_LOAD_STYLESHEET: + # include/import resolution while parsing + c_pcontext = (c_ctxt).doc._private + else: + c_pcontext = NULL + + if c_pcontext is NULL: + # can't call Python without context, fall back to default loader + return XSLT_DOC_DEFAULT_LOADER( + c_uri, c_dict, parse_options, c_ctxt, c_type) + + gil_state = python.PyGILState_Ensure() + c_doc = _xslt_resolve_stylesheet(c_uri, c_pcontext) + if c_doc is not NULL: + python.PyGILState_Release(gil_state) + return _copyDoc(c_doc, 1) + + c_doc = _xslt_resolve_from_python(c_uri, c_pcontext, parse_options, &error) + if c_doc is NULL and not error: c_doc = XSLT_DOC_DEFAULT_LOADER( c_uri, c_dict, parse_options, c_ctxt, c_type) if c_doc is NULL: - message = "Cannot resolve URI %s" % funicode(c_uri) - if c_type == xslt.XSLT_LOAD_DOCUMENT: - exception = XSLTApplyError(message) - else: - exception = XSLTParseError(message) - xslt_resolver_context._store_exception(exception) - python.PyGILState_Release(gil_state) - return NULL + _xslt_store_resolver_exception(c_uri, c_pcontext, c_type) + python.PyGILState_Release(gil_state) - if c_doc is not NULL and c_doc._private is NULL: - c_doc._private = xslt_resolver_context return c_doc cdef xslt.xsltDocLoaderFunc XSLT_DOC_DEFAULT_LOADER XSLT_DOC_DEFAULT_LOADER = xslt.xsltDocDefaultLoader -xslt.xsltSetLoaderFunc(_doc_loader) +xslt.xsltSetLoaderFunc(_xslt_doc_loader) ################################################################################ # XSLT file/network access control @@ -295,6 +307,7 @@ tree.xmlFreeDoc(c_doc) self._xslt_resolver_context._raise_if_stored() raise XSLTParseError, "Cannot parse style sheet" + c_doc._private = NULL # no longer used! self._c_style = c_style self._context = _XSLTContext(None, extensions) @@ -326,7 +339,6 @@ cdef xmlDoc* c_result cdef xmlDoc* c_doc cdef char** params - cdef void* ptemp cdef Py_ssize_t i, kw_count input_doc = _documentOrRaise(_input) @@ -349,8 +361,7 @@ if self._access_control is not None: self._access_control._register_in_context(transform_ctxt) - ptemp = c_doc._private # store original _private pointer! - c_doc._private = resolver_context + transform_ctxt._private = self._xslt_resolver_context kw_count = python.PyDict_Size(_kw) if kw_count > 0: @@ -383,7 +394,6 @@ python.PyMem_Free(params) self._context.free_context() - c_doc._private = ptemp # restore _private before _destroyFakeDoc! _destroyFakeDoc(input_doc._c_doc, c_doc) self._error_log.disconnect() From scoder at codespeak.net Sat Jun 10 18:40:42 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 18:40:42 +0200 (CEST) Subject: [Lxml-checkins] r28642 - lxml/trunk/src/lxml Message-ID: <20060610164042.49BFA10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 18:40:41 2006 New Revision: 28642 Modified: lxml/trunk/src/lxml/parser.pxi Log: rewrite of document resolver C function to make it 'Python-free': no INCREF/DECREF outside thread contexts Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sat Jun 10 18:40:41 2006 @@ -223,11 +223,8 @@ self._bytes_read = self._bytes_read + c_size cstd.memcpy(c_buffer, c_start, c_size) return c_size - except Exception, e: - self._exc_context._store_exception(e) - python.PyGILState_Release(gil_state) - return -1 except: + self._exc_context._store_raised() python.PyGILState_Release(gil_state) return -1 @@ -238,19 +235,14 @@ ## support for custom document loaders ############################################################ -cdef xmlparser.xmlParserInput* _local_resolver(char* c_url, char* c_pubid, - xmlParserCtxt* c_context): +cdef xmlparser.xmlParserInput* _parser_resolve_from_python( + char* c_url, char* c_pubid, xmlParserCtxt* c_context, int* error): + # call the Python document loaders + cdef xmlparser.xmlParserInput* c_input cdef _ResolverContext context cdef _InputDocument doc_ref cdef _FileParserContext file_context - cdef xmlparser.xmlParserInput* c_input - cdef python.PyGILState_STATE gil_state - if c_context._private is NULL: - if __DEFAULT_ENTITY_LOADER is NULL: - return NULL - return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) - - gil_state = python.PyGILState_Ensure() + error[0] = 0 context = <_ResolverContext>c_context._private try: if c_url is NULL: @@ -263,20 +255,13 @@ pubid = funicode(c_pubid) doc_ref = context._resolvers.resolve(url, pubid, context) - except Exception, e: - context._store_exception(e) - python.PyGILState_Release(gil_state) - return NULL + if doc_ref is None: + return NULL except: - python.PyGILState_Release(gil_state) + context._store_raised() + error[0] = 1 return NULL - if doc_ref is None: - python.PyGILState_Release(gil_state) - if __DEFAULT_ENTITY_LOADER is NULL: - return NULL - return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) - c_input = NULL data = None if doc_ref._type == PARSER_DATA_STRING: @@ -293,9 +278,32 @@ if data is not None: context._storage.add(data) - python.PyGILState_Release(gil_state) return c_input +cdef xmlparser.xmlParserInput* _local_resolver(char* c_url, char* c_pubid, + xmlParserCtxt* c_context): + # no Python objects here, may be called without thread context ! + # when we declare a Python object, Pyrex will INCREF(None) ! + cdef xmlparser.xmlParserInput* c_input + cdef python.PyGILState_STATE gil_state + cdef int error + if c_context._private is NULL: + if __DEFAULT_ENTITY_LOADER is NULL: + return NULL + return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) + + gil_state = python.PyGILState_Ensure() + c_input = _parser_resolve_from_python(c_url, c_pubid, c_context, &error) + python.PyGILState_Release(gil_state) + + if c_input is not NULL: + return c_input + if error: + return NULL + if __DEFAULT_ENTITY_LOADER is NULL: + return NULL + return __DEFAULT_ENTITY_LOADER(c_url, c_pubid, c_context) + cdef xmlparser.xmlExternalEntityLoader __DEFAULT_ENTITY_LOADER __DEFAULT_ENTITY_LOADER = xmlparser.xmlGetExternalEntityLoader() From scoder at codespeak.net Sat Jun 10 19:37:14 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 19:37:14 +0200 (CEST) Subject: [Lxml-checkins] r28643 - lxml/trunk/src/lxml Message-ID: <20060610173714.1853310063@code0.codespeak.net> Author: scoder Date: Sat Jun 10 19:37:13 2006 New Revision: 28643 Modified: lxml/trunk/src/lxml/cstd.pxd lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/src/lxml/xslt.pxi Log: rewrite of error reporting function as plain C function to make it 'Python-free': no INCREF/DECREF outside thread contexts Modified: lxml/trunk/src/lxml/cstd.pxd ============================================================================== --- lxml/trunk/src/lxml/cstd.pxd (original) +++ lxml/trunk/src/lxml/cstd.pxd Sat Jun 10 19:37:13 2006 @@ -1,6 +1,7 @@ cdef extern from "stdio.h": ctypedef struct FILE + cdef int sprintf(char* str, char* format, ...) cdef extern from "string.h": ctypedef int size_t Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Sat Jun 10 19:37:13 2006 @@ -32,12 +32,15 @@ cdef readonly object message cdef readonly object filename cdef _setError(self, xmlerror.xmlError* error): + cdef int size self.domain = error.domain self.type = error.code self.level = error.level self.line = error.line - self.message = python.PyString_FromStringAndSize( - error.message, cstd.strlen(error.message) - 1) # strip EOL + size = cstd.strlen(error.message) + if size > 0 and error.message[size-1] == c'\n': + size = size - 1 # strip EOL + self.message = python.PyString_FromStringAndSize(error.message, size) if error.file is NULL: self.filename = '' else: @@ -295,27 +298,34 @@ __GLOBAL_ERROR_LOG = log -# local log function: forward error to logger object -cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error): +# local log functions: forward error to logger object +cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error): cdef _ErrorLog log_handler + if c_log_handler is not NULL: + log_handler = <_ErrorLog>c_log_handler + else: + log_handler = __GLOBAL_ERROR_LOG + log_handler._receive(error) + +cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error): + # no Python objects here, may be called without thread context ! + # when we declare a Python object, Pyrex will INCREF(None) ! cdef python.PyGILState_STATE gil_state if __DEBUG != 0: gil_state = python.PyGILState_Ensure() - if c_log_handler is not NULL: - log_handler = <_ErrorLog>c_log_handler - else: - log_handler = __GLOBAL_ERROR_LOG - log_handler._receive(error) + _forwardError(c_log_handler, error) python.PyGILState_Release(gil_state) -cdef void _receiveGenericError(void* c_log_handler, char* msg, ...): +cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...): + # no Python objects here, may be called without thread context ! + # when we declare a Python object, Pyrex will INCREF(None) ! cdef python.PyGILState_STATE gil_state + cdef xmlerror.xmlError c_error cdef cstd.va_list args - cdef _ErrorLog log_handler cdef char* c_text - cdef char* c_filename + cdef char* c_message cdef char* c_element - cdef int c_line + cdef int i, text_size, element_size if __DEBUG == 0 or msg == NULL or cstd.strlen(msg) < 10: return cstd.va_start(args, msg) @@ -324,13 +334,16 @@ else: c_text = NULL if cstd.strstr(msg, 'file %s') is not NULL: - c_filename = cstd.va_charptr(args) + c_error.file = cstd.va_charptr(args) + if c_error.file is not NULL and cstd.strlen(c_error.file) > 0: + if cstd.strncmp(c_error.file, 'XSLT:', 5) == 0: + c_error.file = '' else: - c_filename = NULL + c_error.file = NULL if cstd.strstr(msg, 'line %d') is not NULL: - c_line = cstd.va_int(args) + c_error.line = cstd.va_int(args) else: - c_line = -1 + c_error.line = -1 if cstd.strstr(msg, 'element %s') is not NULL: c_element = cstd.va_charptr(args) else: @@ -338,37 +351,25 @@ cstd.va_end(args) gil_state = python.PyGILState_Ensure() - try: - if c_text is NULL: - message = None - elif c_element is NULL: - message = funicode(c_text) - else: - message = "%s (element '%s')" % ( - funicode(c_text), funicode(c_element)) - except UnicodeDecodeError: - message = "" - - try: - if c_filename is not NULL and cstd.strlen(c_filename) > 0: - if cstd.strncmp(c_filename, 'XSLT:', 5) == 0: - filename = '' - else: - filename = funicode(c_filename) - else: - filename = None - except UnicodeDecodeError: - filename = "" + c_message = NULL + if c_text is NULL: + c_error.message = '' + elif c_element is not NULL: + text_size = cstd.strlen(c_text) + element_size = cstd.strlen(c_element) + c_message = python.PyMem_Malloc( + (14 + text_size + element_size) * sizeof(char)) + cstd.sprintf(c_message, "%s (element '%s')", c_text, c_element) + c_error.message = c_message + + c_error.domain = xmlerror.XML_FROM_XSLT + c_error.code = xmlerror.XML_ERR_OK # what else? + c_error.level = xmlerror.XML_ERR_ERROR # what else? - if c_log_handler is not NULL: - log_handler = <_ErrorLog>c_log_handler - else: - log_handler = __GLOBAL_ERROR_LOG + _forwardError(c_log_handler, &c_error) - log_handler._receiveGeneric(xmlerror.XML_FROM_XSLT, - xmlerror.XML_ERR_OK, - xmlerror.XML_ERR_ERROR, - c_line, message, filename) + if c_message is not NULL: + python.PyMem_Free(c_error.message) python.PyGILState_Release(gil_state) # dummy function: no debug output at all Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sat Jun 10 19:37:13 2006 @@ -22,7 +22,7 @@ LIBXSLT_VERSION = __unpackIntVersion(xslt.xsltLibxsltVersion) cdef void _logLibxsltErrors(): - xslt.xsltSetGenericErrorFunc(NULL, _receiveGenericError) + xslt.xsltSetGenericErrorFunc(NULL, _receiveXSLTError) ################################################################################ @@ -356,7 +356,7 @@ self._error_log.connect() xslt.xsltSetTransformErrorFunc(transform_ctxt, self._error_log, - _receiveGenericError) + _receiveXSLTError) if self._access_control is not None: self._access_control._register_in_context(transform_ctxt) From scoder at codespeak.net Sat Jun 10 22:09:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 22:09:56 +0200 (CEST) Subject: [Lxml-checkins] r28648 - lxml/trunk/doc Message-ID: <20060610200956.225BB10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 22:09:55 2006 New Revision: 28648 Modified: lxml/trunk/doc/FAQ.txt Log: FAQ entry on threading: what you can do and what you should not do Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Sat Jun 10 22:09:55 2006 @@ -56,13 +56,28 @@ #) Can I use threads to concurrently access the lxml API? - Short answer: No. + Yes, although not carelessly. - Long answer: lxml does not currently release the GIL (Python's global - interpreter lock) internally, so you will not benefit from any performance - improvements by using threads. It is also not trivial to free the GIL, as - lxml calls back into Python in many places during XML processing: extension - functions, Python resolvers, error reporting, etc. + lxml frees the GIL (Python's global interpreter lock) internally when + parsing from disk and memory, as long as you use either the default parser + (which is replicated for each thread) or create a parser for each thread + yourself. lxml also allows concurrency during validation (RelaxNG and + XMLSchema) and XSL transformation. You can share RelaxNG, XMLSchema and + XSLT objects between threads. While you can also share parsers between + threads, this will serialize the access to each of them, so it is better to + copy() parsers or to use the default parser. Note that access to the XML() + and HTML() functions is always serialized. If you need to parse from + strings, use StringIO. + + Warning: You should generally avoid modifying trees in other threads than + the one it was generated in. Although this should work in many cases, + there are certain scenarios where the termination of a thread that parsed a + tree can crash the application if subtrees of this tree are moved to other + documents. You should be on the safe side when passing trees between + threads if you either + + a) do not modify these trees and do not move its elements to other trees, or + b) do not terminate threads while the trees they parsed are still in use #) Why doesn't the ``pretty_print`` option reformat my XML output? From scoder at codespeak.net Sat Jun 10 23:25:23 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 23:25:23 +0200 (CEST) Subject: [Lxml-checkins] r28650 - lxml/trunk/src/lxml Message-ID: <20060610212523.F31A210053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 23:25:21 2006 New Revision: 28650 Modified: lxml/trunk/src/lxml/extensions.pxi lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/xslt.pxi Log: make XSLT and extension functions work with threads Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Sat Jun 10 23:25:21 2006 @@ -55,6 +55,15 @@ self._namespaces = namespaces self._temp_refs = _TempStore() + cdef _copy(self): + cdef _BaseContext context + if self._namespaces is not None: + namespaces = python.PyDict_Copy(self._namespaces) + context = self.__class__(namespaces, None) + if self._extensions is not None: + context._extensions = python.PyDict_Copy(self._extensions) + return context + cdef object _to_utf(self, s): "Convert to UTF-8 and keep a reference to the encoded string" cdef python.PyObject* dict_result @@ -326,30 +335,8 @@ xpathObj.nodesetval = NULL xpath.xmlXPathFreeObject(xpathObj) -cdef void _xpath_function_call(xpath.xmlXPathParserContext* ctxt, int nargs): - cdef xpath.xmlXPathContext* rctxt - cdef _BaseContext context - rctxt = ctxt.context - context = <_BaseContext>(rctxt.userData) - function = context._find_cached_function(rctxt.functionURI, rctxt.function) - if function is not None: - _extension_function_call(context, function, ctxt, nargs) - else: - if rctxt.functionURI is not NULL: - fref = "{%s}%s" % (rctxt.functionURI, rctxt.function) - else: - fref = rctxt.function - print "FAILED", fref - xpath.xmlXPathErr(ctxt, xpath.XML_XPATH_UNKNOWN_FUNC_ERROR) - exception = XPathFunctionError("XPath function '%s' not found" % fref) - context._exc._store_exception(exception) - -cdef void _call_prepared_function(xpath.xmlXPathParserContext* ctxt, int nargs): - cdef xpath.xmlXPathContext* rctxt - cdef _BaseContext context - rctxt = ctxt.context - context = <_BaseContext>(rctxt.userData) - _extension_function_call(context, context._called_function, ctxt, nargs) +################################################################################ +# callbacks for XPath/XSLT extension functions cdef void _extension_function_call(_BaseContext context, function, xpath.xmlXPathParserContext* ctxt, int nargs): @@ -376,3 +363,46 @@ except: xpath.xmlXPathErr(ctxt, xpath.XPATH_EXPR_ERROR) context._exc._store_raised() + +# lookup the function by name and call it + +cdef void _xpath_function_call(xpath.xmlXPathParserContext* ctxt, int nargs): + cdef python.PyGILState_STATE gil_state + gil_state = python.PyGILState_Ensure() + _call_python_xpath_function(ctxt, nargs) + python.PyGILState_Release(gil_state) + +cdef void _call_python_xpath_function(xpath.xmlXPathParserContext* ctxt, + int nargs): + cdef xpath.xmlXPathContext* rctxt + cdef _BaseContext context + rctxt = ctxt.context + context = <_BaseContext>(rctxt.userData) + function = context._find_cached_function(rctxt.functionURI, rctxt.function) + if function is not None: + _extension_function_call(context, function, ctxt, nargs) + else: + if rctxt.functionURI is not NULL: + fref = "{%s}%s" % (rctxt.functionURI, rctxt.function) + else: + fref = rctxt.function + print "FAILED", fref + xpath.xmlXPathErr(ctxt, xpath.XML_XPATH_UNKNOWN_FUNC_ERROR) + exception = XPathFunctionError("XPath function '%s' not found" % fref) + context._exc._store_exception(exception) + +# call the function that was stored in 'context._called_function' + +cdef void _call_prepared_function(xpath.xmlXPathParserContext* ctxt, int nargs): + cdef python.PyGILState_STATE gil_state + gil_state = python.PyGILState_Ensure() + _call_prepared_python_function(ctxt, nargs) + python.PyGILState_Release(gil_state) + +cdef void _call_prepared_python_function(xpath.xmlXPathParserContext* ctxt, + int nargs): + cdef xpath.xmlXPathContext* rctxt + cdef _BaseContext context + rctxt = ctxt.context + context = <_BaseContext>(rctxt.userData) + _extension_function_call(context, context._called_function, ctxt, nargs) Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Sat Jun 10 23:25:21 2006 @@ -40,6 +40,7 @@ cdef PyObject* PyDict_GetItem(object d, object key) cdef int PyDict_DelItem(object d, object key) cdef int PyDict_Clear(object d) + cdef object PyDict_Copy(object d) cdef Py_ssize_t PyDict_Size(object d) cdef object PyList_AsTuple(object o) cdef object PySequence_List(object o) Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Sat Jun 10 23:25:21 2006 @@ -277,6 +277,7 @@ cdef _ErrorLog _error_log def __init__(self, xslt_input, extensions=None, regexp=True, access_control=None): + cdef python.PyThreadState* state cdef xslt.xsltStylesheet* c_style cdef xmlDoc* c_doc cdef xmlDoc* fake_c_doc @@ -297,21 +298,30 @@ doc_url_utf = "XSLT:__STRING__XSLT__%s" % id(self) c_doc.URL = tree.xmlStrdup(_cstr(doc_url_utf)) + self._error_log = _ErrorLog() self._xslt_resolver_context = _XSLTResolverContext(doc._parser) # keep a copy in case we need to access the stylesheet via 'document()' self._xslt_resolver_context._c_style_doc = _copyDoc(c_doc, 1) c_doc._private = self._xslt_resolver_context + self._error_log.connect() + state = python.PyEval_SaveThread() c_style = xslt.xsltParseStylesheetDoc(c_doc) + python.PyEval_RestoreThread(state) + self._error_log.disconnect() + if c_style is NULL: tree.xmlFreeDoc(c_doc) self._xslt_resolver_context._raise_if_stored() - raise XSLTParseError, "Cannot parse style sheet" + if self._error_log.last_error is not None: + raise XSLTParseError, self._error_log.last_error.message + else: + raise XSLTParseError, "Cannot parse style sheet" + c_doc._private = NULL # no longer used! self._c_style = c_style self._context = _XSLTContext(None, extensions) - self._error_log = _ErrorLog() if regexp: self._regexp = _ExsltRegExp() self._regexp._register_in_context(self._context) @@ -331,6 +341,8 @@ return self._error_log.copy() def __call__(self, _input, **_kw): + cdef python.PyThreadState* state + cdef _XSLTContext context cdef _Document input_doc cdef _NodeBase root_node cdef _Document result_doc @@ -385,15 +397,19 @@ else: params = NULL - self._context.register_context(transform_ctxt, input_doc) + context = self._context._copy() + context.register_context(transform_ctxt, input_doc) + + state = python.PyEval_SaveThread() c_result = xslt.xsltApplyStylesheetUser(self._c_style, c_doc, params, NULL, NULL, transform_ctxt) + python.PyEval_RestoreThread(state) if params is not NULL: # deallocate space for parameters python.PyMem_Free(params) - self._context.free_context() + context.free_context() _destroyFakeDoc(input_doc._c_doc, c_doc) self._error_log.disconnect() From scoder at codespeak.net Sat Jun 10 23:27:35 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 10 Jun 2006 23:27:35 +0200 (CEST) Subject: [Lxml-checkins] r28651 - lxml/trunk Message-ID: <20060610212735.4499C10053@code0.codespeak.net> Author: scoder Date: Sat Jun 10 23:27:34 2006 New Revision: 28651 Modified: lxml/trunk/CHANGES.txt Log: changelog: threaded XSLT Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sat Jun 10 23:27:34 2006 @@ -7,7 +7,7 @@ Features added -------------- -* Threading support in validators (RelaxNG, XMLSchema) +* Reentrant threading support in RelaxNG, XMLSchema and XSLT * Threading support in parsers and serializers: From scoder at codespeak.net Sun Jun 11 09:58:59 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 11 Jun 2006 09:58:59 +0200 (CEST) Subject: [Lxml-checkins] r28661 - lxml/trunk Message-ID: <20060611075859.433DF10068@code0.codespeak.net> Author: scoder Date: Sun Jun 11 09:58:57 2006 New Revision: 28661 Modified: lxml/trunk/INSTALL.txt Log: INSTALL.txt: note on XML Schema status in libxml2 Modified: lxml/trunk/INSTALL.txt ============================================================================== --- lxml/trunk/INSTALL.txt (original) +++ lxml/trunk/INSTALL.txt Sun Jun 11 09:58:57 2006 @@ -16,7 +16,8 @@ Newer versions generally contain less bugs and are therefore recommended. The HTML parser benefits from libxml2 version 2.6.21 or later, which support -parsing horribly broken HTML. +parsing horribly broken HTML. XML Schema support is also still worked on in +libxml2, so newer versions will give you better complience with the W3C spec. For Windows, there is a `binary distribution`_ of libxml2 and libxslt. Note that you need both libxml2 and libxslt, as well as iconv and zlib. You can From scoder at codespeak.net Sun Jun 11 10:34:04 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 11 Jun 2006 10:34:04 +0200 (CEST) Subject: [Lxml-checkins] r28662 - lxml/trunk/doc Message-ID: <20060611083404.E5DA310060@code0.codespeak.net> Author: scoder Date: Sun Jun 11 10:34:02 2006 New Revision: 28662 Modified: lxml/trunk/doc/FAQ.txt Log: extended FAQ entry on bug reporting Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Sun Jun 11 10:34:02 2006 @@ -44,12 +44,21 @@ .. _`current developer changelog`: http://codespeak.net/svn/lxml/trunk/CHANGES.txt + c) If you are using threads, please see the following section to check if + you touch on one of the potential pitfalls. + b) Otherwise, we would really like to hear about it. Please report it to the `mailing list`_ so that we can fix it. It is very helpful in this case if you can come up with a short code snippet that demonstrates your problem. Please also report the version of lxml, libxml2 and libxslt - that you are using (see the module attributes ``etree.LXML_VERSION`` - etc.). + that you are using by calling this:: + + from lxml import etree + print "lxml.etree: ", etree.LXML_VERSION + print "libxml used: ", etree.LIBXML_VERSION + print "libxml compiled: ", etree.LIBXML_COMPILED_VERSION + print "libxslt used: ", etree.LIBXSLT_VERSION + print "libxslt compiled: ", etree.LIBXSLT_COMPILED_VERSION .. _`mailing list`: http://codespeak.net/mailman/listinfo/lxml-dev From scoder at codespeak.net Sun Jun 11 13:51:10 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 11 Jun 2006 13:51:10 +0200 (CEST) Subject: [Lxml-checkins] r28669 - lxml/trunk/doc Message-ID: <20060611115110.89D5710063@code0.codespeak.net> Author: scoder Date: Sun Jun 11 13:51:09 2006 New Revision: 28669 Modified: lxml/trunk/doc/performance.txt Log: state libxml2 version used in benchmarks Modified: lxml/trunk/doc/performance.txt ============================================================================== --- lxml/trunk/doc/performance.txt (original) +++ lxml/trunk/doc/performance.txt Sun Jun 11 13:51:09 2006 @@ -17,8 +17,8 @@ The statements made here are backed by the benchmark script `bench.py`_ that comes with the lxml source distribution. The timings cited below compare lxml -1.0, ElementTree 1.2.6 and cElementTree 1.0.5 under CPython 2.4.2 on a 1.6GHz -AMD64 machine. +1.0 (with libxml2 2.6.24), ElementTree 1.2.6 and cElementTree 1.0.5 under +CPython 2.4.2 on a 1.6GHz AMD64 machine. .. _`bench.py`: http://codespeak.net/svn/lxml/trunk/bench.py From scoder at codespeak.net Sun Jun 11 20:32:57 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 11 Jun 2006 20:32:57 +0200 (CEST) Subject: [Lxml-checkins] r28682 - lxml/trunk/src/lxml Message-ID: <20060611183257.7691E10063@code0.codespeak.net> Author: scoder Date: Sun Jun 11 20:32:53 2006 New Revision: 28682 Modified: lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/xpath.pxi Log: major cleanup and refactoring in _ParserContext, make clean which methods are public, use single code path for setting up thread parser dictionary Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sun Jun 11 20:32:53 2006 @@ -306,7 +306,7 @@ result._c_doc = c_doc result._ns_counter = 0 if parser is None: - parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() + parser = __GLOBAL_PARSER_CONTEXT.getDefaultParser() result._parser = parser.copy() return result Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Sun Jun 11 20:32:53 2006 @@ -15,15 +15,24 @@ LXML_HTML_PARSER cdef class _ParserContext: - """Global parser context to share the string dictionary. - """ + # Global parser context to share the string dictionary. + # + # This class is a singleton! + # + # It creates _ParserContext objects for each thread to keep thread state, + # but those must never be used directly. Always stick to using the static + # __GLOBAL_PARSER_CONTEXT as defined below the class. + # + cdef xmlDict* _c_dict cdef _BaseParser _default_parser def __dealloc__(self): if self._c_dict is not NULL: xmlparser.xmlDictFree(self._c_dict) - cdef void _initMainParserContext(self): + cdef void initMainParserContext(self): + """Put the global context into the thread dictionary of the main + thread. To be called once and only in the main thread.""" cdef python.PyObject* thread_dict cdef python.PyObject* result thread_dict = python.PyThreadState_GetDict() @@ -31,9 +40,10 @@ python.PyDict_SetItem(thread_dict, "_ParserContext", self) cdef _ParserContext _findThreadParserContext(self): - "Find the _ParserContext for the current thread" + "Find (or create) the _ParserContext object for the current thread" cdef python.PyObject* thread_dict cdef python.PyObject* result + cdef _ParserContext context thread_dict = python.PyThreadState_GetDict() if thread_dict is NULL: return self @@ -45,12 +55,14 @@ python.PyDict_SetItem(d, "_ParserContext", context) return context - cdef void _setDefaultParser(self, _BaseParser parser): + cdef void setDefaultParser(self, _BaseParser parser): + "Set the default parser for the current thread" cdef _ParserContext context context = self._findThreadParserContext() context._default_parser = parser - cdef _BaseParser _getDefaultParser(self): + cdef _BaseParser getDefaultParser(self): + "Return (or create) the default parser of the current thread" cdef _ParserContext context context = self._findThreadParserContext() if context._default_parser is None: @@ -59,52 +71,52 @@ context._default_parser = self._default_parser.copy() return context._default_parser - cdef void _initParserDict(self, xmlParserCtxt* pctxt): - "Assure we always use the same string dictionary." + cdef xmlDict* _getThreadDict(self, xmlDict* default): + "Return the thread-local dict or create a new one if necessary." cdef _ParserContext context context = self._findThreadParserContext() - if context._c_dict is NULL or context._c_dict is pctxt.dict: + if context._c_dict is NULL: + # thread dict not yet set up => use default or create a new one + if default is not NULL: + context._c_dict = default + xmlparser.xmlDictReference(default) + return default + if self._c_dict is NULL: + self._c_dict = xmlparser.xmlDictCreate() + if context is not self: + context._c_dict = xmlparser.xmlDictCreateSub(self._c_dict) + return context._c_dict + + cdef void _initThreadDictRef(self, xmlDict** c_dict_ref): + cdef xmlDict* c_dict + cdef xmlDict* c_thread_dict + c_dict = c_dict_ref[0] + c_thread_dict = self._getThreadDict(c_dict) + if c_dict is c_thread_dict: return - if pctxt.dict is not NULL: - xmlparser.xmlDictFree(pctxt.dict) - pctxt.dict = context._c_dict - xmlparser.xmlDictReference(pctxt.dict) + if c_dict is not NULL: + xmlparser.xmlDictFree(c_dict) + c_dict_ref[0] = c_thread_dict + xmlparser.xmlDictReference(c_thread_dict) - cdef void _initXPathParserDict(self, xpath.xmlXPathContext* pctxt): + cdef void initParserDict(self, xmlParserCtxt* pctxt): "Assure we always use the same string dictionary." - cdef _ParserContext context - context = self._findThreadParserContext() - if context._c_dict is NULL or context._c_dict is pctxt.dict: - return - if pctxt.dict is not NULL: - xmlparser.xmlDictFree(pctxt.dict) - pctxt.dict = context._c_dict - xmlparser.xmlDictReference(pctxt.dict) + self._initThreadDictRef(&pctxt.dict) + + cdef void initXPathParserDict(self, xpath.xmlXPathContext* pctxt): + "Assure we always use the same string dictionary." + self._initThreadDictRef(&pctxt.dict) - cdef void _initDocDict(self, xmlDoc* result): + cdef void initDocDict(self, xmlDoc* result): "Store dict of last object parsed if no shared dict yet" - cdef _ParserContext context - if result is NULL: - return - context = self._findThreadParserContext() - if context._c_dict is NULL: - #print "storing shared dict" - if result.dict is NULL: - if self._c_dict is NULL: - result.dict = xmlparser.xmlDictCreate() - else: - result.dict = xmlparser.xmlDictCreateSub(self._c_dict) - context._c_dict = result.dict - xmlparser.xmlDictReference(context._c_dict) - elif result.dict != context._c_dict: - if result.dict is not NULL: - xmlparser.xmlDictFree(result.dict) - result.dict = context._c_dict - xmlparser.xmlDictReference(result.dict) + # XXX We also free the result dict here if there already was one. + # This case should only occur for new documents with empty dicts, + # otherwise we'd free data that's in use => segfault + self._initThreadDictRef(&result.dict) cdef _ParserContext __GLOBAL_PARSER_CONTEXT __GLOBAL_PARSER_CONTEXT = _ParserContext() -__GLOBAL_PARSER_CONTEXT._initMainParserContext() +__GLOBAL_PARSER_CONTEXT.initMainParserContext() ############################################################ ## support for Python unicode I/O @@ -391,7 +403,7 @@ self._error_log.connect() try: pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) c_text = python.PyUnicode_AS_DATA(utext) state = python.PyEval_SaveThread() @@ -425,7 +437,7 @@ self._error_log.connect() try: pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: @@ -452,7 +464,7 @@ self._error_log.connect() try: pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) state = python.PyEval_SaveThread() if self._parser_type == LXML_HTML_PARSER: @@ -483,7 +495,7 @@ self._error_log.connect() try: pctxt = self._parser_ctxt - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) file_context = _FileParserContext(filelike, self._context, filename) result = file_context._readDoc( pctxt, self._parse_options, self._parser_type) @@ -519,7 +531,7 @@ if result is not NULL: if ctxt.wellFormed or recover: - __GLOBAL_PARSER_CONTEXT._initDocDict(result) + __GLOBAL_PARSER_CONTEXT.initDocDict(result) else: # free broken document tree.xmlFreeDoc(result) @@ -607,7 +619,7 @@ pctxt = xmlparser.xmlNewParserCtxt() if pctxt is NULL: return NULL - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) pctxt._private = context c_doc = xmlparser.xmlCtxtReadDoc( pctxt, c_text, NULL, NULL, options) @@ -627,7 +639,7 @@ pctxt = xmlparser.xmlNewParserCtxt() if pctxt is NULL: return NULL - __GLOBAL_PARSER_CONTEXT._initParserDict(pctxt) + __GLOBAL_PARSER_CONTEXT.initParserDict(pctxt) pctxt._private = context c_doc = xmlparser.xmlCtxtReadFile( pctxt, c_filename, NULL, options) @@ -642,7 +654,7 @@ cdef XMLParser __DEFAULT_XML_PARSER __DEFAULT_XML_PARSER = XMLParser() -__GLOBAL_PARSER_CONTEXT._setDefaultParser(__DEFAULT_XML_PARSER) +__GLOBAL_PARSER_CONTEXT.setDefaultParser(__DEFAULT_XML_PARSER) def set_default_parser(_BaseParser parser=None): """Set a default parser for the current thread. This parser is used @@ -656,10 +668,10 @@ """ if parser is None: parser = __DEFAULT_XML_PARSER - __GLOBAL_PARSER_CONTEXT._setDefaultParser(parser) + __GLOBAL_PARSER_CONTEXT.setDefaultParser(parser) def get_default_parser(): - return __GLOBAL_PARSER_CONTEXT._getDefaultParser() + return __GLOBAL_PARSER_CONTEXT.getDefaultParser() ############################################################ ## HTML parser @@ -708,7 +720,7 @@ cdef char* c_text cdef Py_ssize_t c_len if parser is None: - parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() + parser = __GLOBAL_PARSER_CONTEXT.getDefaultParser() if not filename: c_filename = NULL else: @@ -722,27 +734,27 @@ cdef xmlDoc* _parseDocFromFile(filename, _BaseParser parser) except NULL: if parser is None: - parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() + parser = __GLOBAL_PARSER_CONTEXT.getDefaultParser() return (<_BaseParser>parser)._parseDocFromFile(_cstr(filename)) cdef xmlDoc* _parseDocFromFilelike(source, filename, _BaseParser parser) except NULL: cdef char* c_filename if parser is None: - parser = __GLOBAL_PARSER_CONTEXT._getDefaultParser() + parser = __GLOBAL_PARSER_CONTEXT.getDefaultParser() return (<_BaseParser>parser)._parseDocFromFilelike(source, filename) cdef xmlDoc* _newDoc(): cdef xmlDoc* result result = tree.xmlNewDoc("1.0") - __GLOBAL_PARSER_CONTEXT._initDocDict(result) + __GLOBAL_PARSER_CONTEXT.initDocDict(result) return result cdef xmlDoc* _copyDoc(xmlDoc* c_doc, int recursive): cdef xmlDoc* result result = tree.xmlCopyDoc(c_doc, recursive) _bugFixURL(c_doc, result) - __GLOBAL_PARSER_CONTEXT._initDocDict(result) + __GLOBAL_PARSER_CONTEXT.initDocDict(result) return result cdef xmlDoc* _copyDocRoot(xmlDoc* c_doc, xmlNode* c_new_root): @@ -751,7 +763,7 @@ cdef xmlNode* c_node result = tree.xmlCopyDoc(c_doc, 0) # non recursive _bugFixURL(c_doc, result) - __GLOBAL_PARSER_CONTEXT._initDocDict(result) + __GLOBAL_PARSER_CONTEXT.initDocDict(result) c_node = tree.xmlDocCopyNode(c_new_root, result, 1) # recursive tree.xmlDocSetRootElement(result, c_node) _copyTail(c_new_root.next, c_node) Modified: lxml/trunk/src/lxml/xpath.pxi ============================================================================== --- lxml/trunk/src/lxml/xpath.pxi (original) +++ lxml/trunk/src/lxml/xpath.pxi Sun Jun 11 20:32:53 2006 @@ -50,7 +50,7 @@ self._xpathCtxt, _cstr(name_utf), _wrapXPathObject(value)) cdef void _setupDict(xpath.xmlXPathContext* xpathCtxt): - __GLOBAL_PARSER_CONTEXT._initXPathParserDict(xpathCtxt) + __GLOBAL_PARSER_CONTEXT.initXPathParserDict(xpathCtxt) cdef class _XPathEvaluatorBase: cdef xpath.xmlXPathContext* _xpathCtxt From scoder at codespeak.net Sun Jun 11 20:43:20 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 11 Jun 2006 20:43:20 +0200 (CEST) Subject: [Lxml-checkins] r28683 - lxml/trunk Message-ID: <20060611184320.7A91310068@code0.codespeak.net> Author: scoder Date: Sun Jun 11 20:43:19 2006 New Revision: 28683 Modified: lxml/trunk/setup.py Log: setup.py: allow alpha/beta versions without separating dot (1.1alpha instead of 1.1.alpha) Modified: lxml/trunk/setup.py ============================================================================== --- lxml/trunk/setup.py (original) +++ lxml/trunk/setup.py Sun Jun 11 20:43:19 2006 @@ -26,6 +26,10 @@ wf, rf, ef = os.popen3(cmd) return rf.read().strip().split(' ') +def fix_alphabeta(version, alphabeta): + if '.'+alphabeta in version: + return version + return version.replace(alphabeta, '.'+alphabeta) src_dir = os.path.join(os.getcwd(), os.path.dirname(sys.argv[0])) version = open(os.path.join(src_dir, 'version.txt')).read().strip() @@ -39,6 +43,15 @@ svn_entries).group(1) svn_version = version + '-' + revision +if 'alpha' in version: + svn_version = fix_alphabeta(svn_version, 'alpha') + dev_status = 'Development Status :: 3 - Alpha' +elif 'beta' in version: + svn_version = fix_alphabeta(svn_version, 'beta') + dev_status = 'Development Status :: 4 - Beta' +else: + dev_status = 'Development Status :: 5 - Production/Stable' + version_h = open(os.path.join(src_dir, 'src', 'lxml', 'lxml-version.h'), 'w') version_h.write('''\ #ifndef LXML_VERSION_STRING @@ -47,13 +60,6 @@ ''' % svn_version) version_h.close() -if 'alpha' in version: - dev_status = 'Development Status :: 3 - Alpha' -elif 'beta' in version: - dev_status = 'Development Status :: 4 - Beta' -else: - dev_status = 'Development Status :: 5 - Production/Stable' - print "Building lxml version", svn_version # setup etree extension building From scoder at codespeak.net Sun Jun 11 20:44:33 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 11 Jun 2006 20:44:33 +0200 (CEST) Subject: [Lxml-checkins] r28684 - lxml/trunk Message-ID: <20060611184433.60D1610068@code0.codespeak.net> Author: scoder Date: Sun Jun 11 20:44:32 2006 New Revision: 28684 Modified: lxml/trunk/version.txt Log: mark version as 1.1alpha Modified: lxml/trunk/version.txt ============================================================================== --- lxml/trunk/version.txt (original) +++ lxml/trunk/version.txt Sun Jun 11 20:44:32 2006 @@ -1 +1 @@ -1.0.1 +1.1alpha From scoder at codespeak.net Mon Jun 12 07:11:06 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 07:11:06 +0200 (CEST) Subject: [Lxml-checkins] r28685 - lxml/trunk/src/lxml Message-ID: <20060612051106.538CA10068@code0.codespeak.net> Author: scoder Date: Mon Jun 12 07:11:03 2006 New Revision: 28685 Modified: lxml/trunk/src/lxml/xmlerror.pxi Log: small cleanup in xmlerror.pxi Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Mon Jun 12 07:11:03 2006 @@ -326,10 +326,10 @@ cdef char* c_message cdef char* c_element cdef int i, text_size, element_size - if __DEBUG == 0 or msg == NULL or cstd.strlen(msg) < 10: + if __DEBUG == 0 or msg is NULL or cstd.strlen(msg) < 10: return cstd.va_start(args, msg) - if cstd.strncmp(msg, '%s:', 3) == 0: + if msg[0] == c'%' and msg[1] == c's': c_text = cstd.va_charptr(args) else: c_text = NULL From scoder at codespeak.net Mon Jun 12 07:24:04 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 07:24:04 +0200 (CEST) Subject: [Lxml-checkins] r28686 - in lxml/branch/lxml-1.0: doc src/lxml Message-ID: <20060612052404.D568510068@code0.codespeak.net> Author: scoder Date: Mon Jun 12 07:24:02 2006 New Revision: 28686 Modified: lxml/branch/lxml-1.0/doc/resolvers.txt lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi lxml/branch/lxml-1.0/src/lxml/xslt.pxi Log: show error line in XSLTApplyError message Modified: lxml/branch/lxml-1.0/doc/resolvers.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/resolvers.txt (original) +++ lxml/branch/lxml-1.0/doc/resolvers.txt Mon Jun 12 07:24:02 2006 @@ -214,7 +214,7 @@ >>> result = transform(normal_doc) Traceback (most recent call last): [...] - XSLTApplyError: runtime error (element 'value-of') + XSLTApplyError: runtime error, element 'value-of', line 6 There are a few things to keep in mind: Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi Mon Jun 12 07:24:02 2006 @@ -344,7 +344,7 @@ elif c_element is NULL: message = funicode(c_text) else: - message = "%s (element '%s')" % ( + message = "%s, element '%s'" % ( funicode(c_text), funicode(c_element)) except UnicodeDecodeError: message = "" Modified: lxml/branch/lxml-1.0/src/lxml/xslt.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xslt.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xslt.pxi Mon Jun 12 07:24:02 2006 @@ -388,12 +388,16 @@ self._xslt_resolver_context._raise_if_stored() if c_result is NULL: - message = "Error applying stylesheet" - errors = self._error_log.filter_from_errors() - if errors: - error = errors[-1] - if error.message: + error = self._error_log.last_error + if error is not None and error.message is not None: + if error.line >= 0: + message = "%s, line %d" % (error.message, error.line) + else: message = error.message + elif error.line >= 0: + message = "Error applying stylesheet, line %d" % error.line + else: + message = "Error applying stylesheet" raise XSLTApplyError, message result_doc = _documentFactory(c_result, input_doc._parser) From scoder at codespeak.net Mon Jun 12 07:38:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 07:38:13 +0200 (CEST) Subject: [Lxml-checkins] r28687 - in lxml/trunk: doc src/lxml Message-ID: <20060612053813.A197010063@code0.codespeak.net> Author: scoder Date: Mon Jun 12 07:38:11 2006 New Revision: 28687 Modified: lxml/trunk/doc/resolvers.txt lxml/trunk/src/lxml/xmlerror.pxi lxml/trunk/src/lxml/xslt.pxi Log: shor line number in XSLT error messages Modified: lxml/trunk/doc/resolvers.txt ============================================================================== --- lxml/trunk/doc/resolvers.txt (original) +++ lxml/trunk/doc/resolvers.txt Mon Jun 12 07:38:11 2006 @@ -214,7 +214,7 @@ >>> result = transform(normal_doc) Traceback (most recent call last): [...] - XSLTApplyError: runtime error (element 'value-of') + XSLTApplyError: runtime error, element 'value-of', line 6 There are a few things to keep in mind: Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Mon Jun 12 07:38:11 2006 @@ -354,12 +354,14 @@ c_message = NULL if c_text is NULL: c_error.message = '' - elif c_element is not NULL: + elif c_element is NULL: + c_error.message = c_text + else: text_size = cstd.strlen(c_text) element_size = cstd.strlen(c_element) c_message = python.PyMem_Malloc( - (14 + text_size + element_size) * sizeof(char)) - cstd.sprintf(c_message, "%s (element '%s')", c_text, c_element) + (text_size + 12 + element_size + 1) * sizeof(char)) + cstd.sprintf(c_message, "%s, element '%s'", c_text, c_element) c_error.message = c_message c_error.domain = xmlerror.XML_FROM_XSLT Modified: lxml/trunk/src/lxml/xslt.pxi ============================================================================== --- lxml/trunk/src/lxml/xslt.pxi (original) +++ lxml/trunk/src/lxml/xslt.pxi Mon Jun 12 07:38:11 2006 @@ -419,10 +419,16 @@ self._xslt_resolver_context._raise_if_stored() if c_result is NULL: - message = "Error applying stylesheet" error = self._error_log.last_error if error is not None and error.message: - message = error.message + if error.line >= 0: + message = "%s, line %d" % (error.message, error.line) + else: + message = error.message + elif error.line >= 0: + message = "Error applying stylesheet, line %d" % error.line + else: + message = "Error applying stylesheet" raise XSLTApplyError, message result_doc = _documentFactory(c_result, input_doc._parser) From scoder at codespeak.net Mon Jun 12 07:45:00 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 07:45:00 +0200 (CEST) Subject: [Lxml-checkins] r28688 - lxml/trunk Message-ID: <20060612054500.2A11510063@code0.codespeak.net> Author: scoder Date: Mon Jun 12 07:44:59 2006 New Revision: 28688 Modified: lxml/trunk/CHANGES.txt Log: changelog: error lines in XSLT Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Mon Jun 12 07:44:59 2006 @@ -35,6 +35,8 @@ Bugs fixed ---------- +* XSLT exception messages include the error line number + 1.0.1 (2006-06-09) ================== From scoder at codespeak.net Mon Jun 12 07:45:34 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 07:45:34 +0200 (CEST) Subject: [Lxml-checkins] r28689 - lxml/branch/lxml-1.0 Message-ID: <20060612054534.7C70210063@code0.codespeak.net> Author: scoder Date: Mon Jun 12 07:45:33 2006 New Revision: 28689 Modified: lxml/branch/lxml-1.0/CHANGES.txt Log: changelog: error lines in XSLT Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Mon Jun 12 07:45:33 2006 @@ -1,6 +1,18 @@ lxml changelog ============== +current +======= + +Features added +-------------- + +Bugs fixed +---------- + +* XSLT exception messages include the error line number + + 1.0.1 (2006-06-09) ================== From scoder at codespeak.net Mon Jun 12 07:59:45 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 07:59:45 +0200 (CEST) Subject: [Lxml-checkins] r28690 - in lxml/trunk: . src/lxml Message-ID: <20060612055945.04EB710063@code0.codespeak.net> Author: scoder Date: Mon Jun 12 07:59:44 2006 New Revision: 28690 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.pyx Log: removed module level function initThread() - never worked and is useless anyway Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Mon Jun 12 07:59:44 2006 @@ -37,6 +37,8 @@ * XSLT exception messages include the error line number +* Module function ``initThread()`` was removed - useless (and never worked) + 1.0.1 (2006-06-09) ================== Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Mon Jun 12 07:59:44 2006 @@ -56,16 +56,6 @@ # initialize parser (and threading) xmlparser.xmlInitParser() -def initThread(): - """Must be called by each newly created thread before calling any API - functions. - - Note that lxml.etree does not currently release the GIL, so there are no - performance gains to be expected from using threads. - """ - #_initThreadLogging() - pass - # Error superclass for ElementTree compatibility class Error(Exception): From scoder at codespeak.net Mon Jun 12 08:02:17 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 08:02:17 +0200 (CEST) Subject: [Lxml-checkins] r28691 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060612060217.F238510060@code0.codespeak.net> Author: scoder Date: Mon Jun 12 08:02:16 2006 New Revision: 28691 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/src/lxml/etree.pyx Log: removed module level function initThread() - never worked and is useless anyway Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Mon Jun 12 08:02:16 2006 @@ -10,6 +10,8 @@ Bugs fixed ---------- +* Module function ``initThread()`` was removed - useless (and never worked) + * XSLT exception messages include the error line number Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Mon Jun 12 08:02:16 2006 @@ -50,16 +50,6 @@ # initialize parser (and threading) xmlparser.xmlInitParser() -def initThread(): - """Must be called by each newly created thread before calling any API - functions. - - Note that lxml.etree does not currently release the GIL, so there are no - performance gains to be expected from using threads. - """ - #_initThreadLogging() - pass - # Error superclass for ElementTree compatibility class Error(Exception): From scoder at codespeak.net Mon Jun 12 08:02:49 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 08:02:49 +0200 (CEST) Subject: [Lxml-checkins] r28692 - lxml/trunk Message-ID: <20060612060249.EE2DD10060@code0.codespeak.net> Author: scoder Date: Mon Jun 12 08:02:48 2006 New Revision: 28692 Modified: lxml/trunk/CHANGES.txt Log: bug fix order in CHANGES.txt Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Mon Jun 12 08:02:48 2006 @@ -35,10 +35,10 @@ Bugs fixed ---------- -* XSLT exception messages include the error line number - * Module function ``initThread()`` was removed - useless (and never worked) +* XSLT exception messages include the error line number + 1.0.1 (2006-06-09) ================== From scoder at codespeak.net Mon Jun 12 15:05:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 12 Jun 2006 15:05:56 +0200 (CEST) Subject: [Lxml-checkins] r28707 - lxml/trunk Message-ID: <20060612130556.B0A1010034@code0.codespeak.net> Author: scoder Date: Mon Jun 12 15:05:55 2006 New Revision: 28707 Modified: lxml/trunk/TODO.txt Log: copied notes on iterparse() implementation to TODO.txt Modified: lxml/trunk/TODO.txt ============================================================================== --- lxml/trunk/TODO.txt (original) +++ lxml/trunk/TODO.txt Mon Jun 12 15:05:55 2006 @@ -17,8 +17,6 @@ * will namespaces nodes of unknown namespaces be added (and never freed?) -* iterparse support would be nice. - Top level --------- @@ -42,3 +40,42 @@ integrating this: http://www.gnosis.cx/download/relax/ + +Notes on implementing iterparse +------------------------------- + +"iterparse" will be (or will return) an iterable object, let's call it +IterParse for clarity. A class is basically the only way of implementing +iterators in Pyrex. For the internal SAX part, IterParse will likely work a +lot like lxml.sax.ElementTreeContentHandler. + +We'd need a custom wrapper to the default libxml2 SAX handler to intercept the +parse events (this means implementing C helper functions for the SAX events) +/after/ they were processed by libxml2. See xmlSAXVersion (SAX2.c) on how to +retrieve the SAX2 default parser structure. + +IterParse should pass chunks into the parser and buffer the events it +receives. When its __next__() method is called, it returns one event or passes +new chunks until there is an event to return. This is needed as IterParse has +to convert between libxml2 push (SAX) and Python pull (iter). + +As for the input to the libxml2 parser, there are two possible ways: one is to +pass data chunks in through xmlParseChunk and the other is to use +xmlCreateIOParserCtxt and implement xmlInputReadCallback (xmlio.h) to have +libxml2 request data by itself. However, xmlParseChunk allows us to control +how far libxml2 parses in advance, so this is preferable. + +Python events (start, end, start-ns, end-ns) are created as follows: + +* "*-ns" events must be extracted from the libxml2 xmlSAX2StartElementNs call +(passed in arguments "prefix"/"URI" and the char* array "namespaces"). They +must be stored on a stack to build the respective "end-ns" events. + +* "start" is somewhat tricky, as it would be a bad idea to allow modifications +of the XML structure during that iterator cycle. Maybe it's enough to document +that, but there may be ways to crash lxml with certain tree operations. Note +also that care has to be taken to prevent Python from garbage collecting the +element before the "end" event. The best way to do that is to store a Python +reference to that element on a stack. + +* "end" is simple then: pop the element from the stack and return it. From scoder at codespeak.net Wed Jun 21 10:23:52 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 10:23:52 +0200 (CEST) Subject: [Lxml-checkins] r29039 - lxml/trunk/src/lxml Message-ID: <20060621082352.86BA610064@code0.codespeak.net> Author: scoder Date: Wed Jun 21 10:23:51 2006 New Revision: 29039 Modified: lxml/trunk/src/lxml/apihelpers.pxi Log: speedup for ASCII strings in funicode() Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Wed Jun 21 10:23:51 2006 @@ -332,9 +332,20 @@ return 0 cdef object funicode(char* s): - if isutf8(s): - return python.PyUnicode_DecodeUTF8(s, cstd.strlen(s), NULL) - return python.PyString_FromString(s) + cdef Py_ssize_t slen + cdef char* spos + cdef char c + spos = s + c = spos[0] + while c != c'\0': + if c & 0x80: + break + spos = spos + 1 + c = spos[0] + slen = spos - s + if c != c'\0': + return python.PyUnicode_DecodeUTF8(s, slen+cstd.strlen(spos), NULL) + return python.PyString_FromStringAndSize(s, slen) cdef object _utf8(object s): if python.PyString_Check(s): From scoder at codespeak.net Wed Jun 21 10:25:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 10:25:56 +0200 (CEST) Subject: [Lxml-checkins] r29040 - lxml/trunk/src/lxml Message-ID: <20060621082556.E034110064@code0.codespeak.net> Author: scoder Date: Wed Jun 21 10:25:55 2006 New Revision: 29040 Modified: lxml/trunk/src/lxml/extensions.pxi Log: cleanup in _wrapXPathObject Modified: lxml/trunk/src/lxml/extensions.pxi ============================================================================== --- lxml/trunk/src/lxml/extensions.pxi (original) +++ lxml/trunk/src/lxml/extensions.pxi Wed Jun 21 10:25:55 2006 @@ -255,10 +255,10 @@ if python.PyNumber_Check(obj): return xpath.xmlXPathNewFloat(obj) if obj is None: - obj = () + resultSet = xpath.xmlXPathNodeSetCreate(NULL) elif isinstance(obj, _NodeBase): - obj = (obj,) - if python.PySequence_Check(obj): + resultSet = xpath.xmlXPathNodeSetCreate((<_NodeBase>obj)._c_node) + elif python.PySequence_Check(obj): resultSet = xpath.xmlXPathNodeSetCreate(NULL) for element in obj: if isinstance(element, _NodeBase): @@ -267,10 +267,9 @@ else: xpath.xmlXPathFreeNodeSet(resultSet) raise XPathResultError, "This is not a node: %s" % element - return xpath.xmlXPathWrapNodeSet(resultSet) else: - raise XPathResultError, "Unknown return type: %s" % obj - return NULL + raise XPathResultError, "Unknown return type: %s" % type(obj) + return xpath.xmlXPathWrapNodeSet(resultSet) cdef object _unwrapXPathObject(xpath.xmlXPathObject* xpathObj, _Document doc): From scoder at codespeak.net Wed Jun 21 13:17:16 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 13:17:16 +0200 (CEST) Subject: [Lxml-checkins] r29049 - lxml/trunk/src/lxml/tests Message-ID: <20060621111716.9C7BC10068@code0.codespeak.net> Author: scoder Date: Wed Jun 21 13:17:15 2006 New Revision: 29049 Modified: lxml/trunk/src/lxml/tests/test_elementtree.py Log: test cases for 8bit parsing Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Wed Jun 21 13:17:15 2006 @@ -1835,7 +1835,7 @@ u'S?k p? nettet'.encode('UTF-8'), tree.getroot(), 'UTF-8') - def test_encoding_latin1(self): + def test_encoding_8bit_latin1(self): ElementTree = self.etree.ElementTree Element = self.etree.Element @@ -1942,6 +1942,22 @@ expected, tostring(b)) + def test_encoding_8bit_xml(self): + utext = u'S?k p? nettet' + uxml = u'

%s

' % utext + prologue = '' + isoxml = prologue + uxml.encode('iso-8859-1') + tree = self.etree.XML(isoxml) + self.assertEquals(utext, tree.text) + + def test_encoding_8bit_parse_stringio(self): + utext = u'S?k p? nettet' + uxml = u'

%s

' % utext + prologue = '' + isoxml = prologue + uxml.encode('iso-8859-1') + el = self.etree.parse(StringIO(isoxml)).getroot() + self.assertEquals(utext, el.text) + def test_deepcopy(self): Element = self.etree.Element From scoder at codespeak.net Wed Jun 21 13:17:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 13:17:38 +0200 (CEST) Subject: [Lxml-checkins] r29050 - lxml/trunk/src/lxml Message-ID: <20060621111738.C63E510068@code0.codespeak.net> Author: scoder Date: Wed Jun 21 13:17:37 2006 New Revision: 29050 Modified: lxml/trunk/src/lxml/parser.pxi Log: fix 8bit parsing for strings and StringIO Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 21 13:17:37 2006 @@ -807,8 +807,8 @@ # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: text = _stripEncodingDeclaration(_utf8(text)) - else: - text = _utf8(text) + elif not python.PyString_Check(text): + raise ValueError, "can only parse strings" if url is not None: url = _utf8(url) c_doc = _parseDoc(text, url, parser) From scoder at codespeak.net Wed Jun 21 13:34:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 13:34:50 +0200 (CEST) Subject: [Lxml-checkins] r29052 - in lxml/branch/lxml-1.0/src/lxml: . tests Message-ID: <20060621113450.ED6CE10070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 13:34:49 2006 New Revision: 29052 Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py Log: merge from trunk: fix for 8bit parsing for strings and StringIO Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 21 13:34:49 2006 @@ -689,8 +689,8 @@ # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: text = _stripEncodingDeclaration(_utf8(text)) - else: - text = _utf8(text) + elif not python.PyString_Check(text): + raise ValueError, "can only parse strings" if url is not None: url = _utf8(url) c_doc = _parseDoc(text, url, parser) Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_elementtree.py Wed Jun 21 13:34:49 2006 @@ -1815,7 +1815,7 @@ u'S?k p? nettet'.encode('UTF-8'), tree.getroot(), 'UTF-8') - def test_encoding_latin1(self): + def test_encoding_8bit_latin1(self): ElementTree = self.etree.ElementTree Element = self.etree.Element @@ -1922,6 +1922,22 @@ expected, tostring(b)) + def test_encoding_8bit_xml(self): + utext = u'S?k p? nettet' + uxml = u'

%s

' % utext + prologue = '' + isoxml = prologue + uxml.encode('iso-8859-1') + tree = self.etree.XML(isoxml) + self.assertEquals(utext, tree.text) + + def test_encoding_8bit_parse_stringio(self): + utext = u'S?k p? nettet' + uxml = u'

%s

' % utext + prologue = '' + isoxml = prologue + uxml.encode('iso-8859-1') + el = self.etree.parse(StringIO(isoxml)).getroot() + self.assertEquals(utext, el.text) + def test_deepcopy(self): Element = self.etree.Element From scoder at codespeak.net Wed Jun 21 15:13:40 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 15:13:40 +0200 (CEST) Subject: [Lxml-checkins] r29060 - lxml/trunk/src/lxml Message-ID: <20060621131340.1BC3B10070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 15:13:39 2006 New Revision: 29060 Modified: lxml/trunk/src/lxml/parser.pxi Log: show error line in parser exception messages Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 21 15:13:39 2006 @@ -517,7 +517,10 @@ message = "Error reading file %s" % funicode(c_filename) raise IOError, message elif ctxt.lastError.message is not NULL: - raise XMLSyntaxError, funicode(ctxt.lastError.message).strip() + message = funicode(ctxt.lastError.message).strip() + if ctxt.lastError.line >= 0: + message = "line %d: %s" % (ctxt.lastError.line, message) + raise XMLSyntaxError, message else: raise XMLSyntaxError From scoder at codespeak.net Wed Jun 21 15:14:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 15:14:13 +0200 (CEST) Subject: [Lxml-checkins] r29061 - lxml/trunk Message-ID: <20060621131413.C3F7A10070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 15:14:12 2006 New Revision: 29061 Modified: lxml/trunk/CHANGES.txt Log: ChangeLog update Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Wed Jun 21 15:14:12 2006 @@ -35,9 +35,11 @@ Bugs fixed ---------- +* Parsing 8-bit encoded strings from StringIO objects raised an exception + * Module function ``initThread()`` was removed - useless (and never worked) -* XSLT exception messages include the error line number +* XSLT and parser exception messages include the error line number 1.0.1 (2006-06-09) From scoder at codespeak.net Wed Jun 21 15:16:25 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 15:16:25 +0200 (CEST) Subject: [Lxml-checkins] r29062 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060621131625.4D6AF10070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 15:16:23 2006 New Revision: 29062 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/src/lxml/parser.pxi Log: merge from trunk: show error lines in parser exceptions Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Wed Jun 21 15:16:23 2006 @@ -10,9 +10,11 @@ Bugs fixed ---------- +* Parsing 8-bit encoded strings from StringIO objects raised an exception + * Module function ``initThread()`` was removed - useless (and never worked) -* XSLT exception messages include the error line number +* XSLT and parser exception messages include the error line number 1.0.1 (2006-06-09) Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 21 15:16:23 2006 @@ -396,7 +396,10 @@ message = "Error reading file %s" % funicode(c_filename) raise IOError, message elif ctxt.lastError.message is not NULL: - raise XMLSyntaxError, funicode(ctxt.lastError.message).strip() + message = funicode(ctxt.lastError.message).strip() + if ctxt.lastError.line >= 0: + message = "line %d: %s" % (ctxt.lastError.line, message) + raise XMLSyntaxError, message else: raise XMLSyntaxError From scoder at codespeak.net Wed Jun 21 15:32:14 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 15:32:14 +0200 (CEST) Subject: [Lxml-checkins] r29065 - lxml/trunk/src/lxml Message-ID: <20060621133214.219FD10063@code0.codespeak.net> Author: scoder Date: Wed Jun 21 15:32:12 2006 New Revision: 29065 Modified: lxml/trunk/src/lxml/etree.pyx Log: doc strings in tostring()/tounicode() Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Wed Jun 21 15:32:12 2006 @@ -1604,7 +1604,12 @@ """Serialize an element to an encoded string representation of its XML tree. - Defaults to ASCII encoding without XML declaration. + Defaults to ASCII encoding without XML declaration. This behaviour can be + configured with the keyword arguments 'encoding' (string) and + 'xml_declaration' (bool). Note that changing the encoding to a non UTF-8 + compatible encoding will enable a declaration by default. + + The keyword argument 'pretty_print' (bool) enables formatted XML. """ cdef int write_declaration cdef int c_pretty_print @@ -1636,6 +1641,8 @@ Note that the result does not carry an XML encoding declaration and is therefore not necessarily suited for serialization to byte streams without further treatment. + + The keyword argument 'pretty_print' (bool) enables formatted XML. """ cdef int c_pretty_print c_pretty_print = bool(pretty_print) From scoder at codespeak.net Wed Jun 21 15:32:39 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 15:32:39 +0200 (CEST) Subject: [Lxml-checkins] r29066 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060621133239.9B86310063@code0.codespeak.net> Author: scoder Date: Wed Jun 21 15:32:38 2006 New Revision: 29066 Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx Log: doc strings in tostring()/tounicode() Modified: lxml/branch/lxml-1.0/src/lxml/etree.pyx ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/etree.pyx (original) +++ lxml/branch/lxml-1.0/src/lxml/etree.pyx Wed Jun 21 15:32:38 2006 @@ -1527,7 +1527,12 @@ """Serialize an element to an encoded string representation of its XML tree. - Defaults to ASCII encoding without XML declaration. + Defaults to ASCII encoding without XML declaration. This behaviour can be + configured with the keyword arguments 'encoding' (string) and + 'xml_declaration' (bool). Note that changing the encoding to a non UTF-8 + compatible encoding will enable a declaration by default. + + The keyword argument 'pretty_print' (bool) enables formatted XML. """ cdef int write_declaration cdef int c_pretty_print @@ -1559,6 +1564,8 @@ Note that the result does not carry an XML encoding declaration and is therefore not necessarily suited for serialization to byte streams without further treatment. + + The keyword argument 'pretty_print' (bool) enables formatted XML. """ cdef int c_pretty_print c_pretty_print = bool(pretty_print) From scoder at codespeak.net Wed Jun 21 16:01:50 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 16:01:50 +0200 (CEST) Subject: [Lxml-checkins] r29067 - lxml/trunk/doc Message-ID: <20060621140150.D014110068@code0.codespeak.net> Author: scoder Date: Wed Jun 21 16:01:49 2006 New Revision: 29067 Modified: lxml/trunk/doc/FAQ.txt Log: FAQ enumeration fix Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Wed Jun 21 16:01:49 2006 @@ -44,10 +44,10 @@ .. _`current developer changelog`: http://codespeak.net/svn/lxml/trunk/CHANGES.txt - c) If you are using threads, please see the following section to check if + b) If you are using threads, please see the following section to check if you touch on one of the potential pitfalls. - b) Otherwise, we would really like to hear about it. Please report it to + c) Otherwise, we would really like to hear about it. Please report it to the `mailing list`_ so that we can fix it. It is very helpful in this case if you can come up with a short code snippet that demonstrates your problem. Please also report the version of lxml, libxml2 and libxslt From scoder at codespeak.net Wed Jun 21 16:47:35 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 16:47:35 +0200 (CEST) Subject: [Lxml-checkins] r29074 - in lxml/trunk: . src/lxml src/lxml/tests Message-ID: <20060621144735.AAFC810069@code0.codespeak.net> Author: scoder Date: Wed Jun 21 16:47:33 2006 New Revision: 29074 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/tests/test_etree.py lxml/trunk/src/lxml/tree.pxd Log: _Element.nsmap property to return a mapping of all known prefixes to their URI Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Wed Jun 21 16:47:33 2006 @@ -7,6 +7,9 @@ Features added -------------- +* Element.nsmap property returns a mapping of all namespace prefixes known at + the Element to their namespace URI + * Reentrant threading support in RelaxNG, XMLSchema and XSLT * Threading support in parsers and serializers: Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Wed Jun 21 16:47:33 2006 @@ -759,16 +759,6 @@ else: self._doc._setNodeNs(self._c_node, _cstr(ns)) - # not in ElementTree, read-only - property prefix: - """Namespace Prefix or None. - """ - def __get__(self): - if self._c_node.ns is not NULL: - if self._c_node.ns.prefix is not NULL: - return funicode(self._c_node.ns.prefix) - return None - property attrib: """Element attribute dictionary. Where possible, use get(), set(), keys() and items() to access element attributes. @@ -820,6 +810,38 @@ # XXX what if we're the top element? tree.xmlAddNextSibling(self._c_node, c_text_node) + # not in ElementTree, read-only + property prefix: + """Namespace prefix or None. + """ + def __get__(self): + if self._c_node.ns is not NULL: + if self._c_node.ns.prefix is not NULL: + return funicode(self._c_node.ns.prefix) + return None + + # not in ElementTree, read-only + property nsmap: + """Namespace prefix->URI mapping known in the context of this Element. + """ + def __get__(self): + cdef xmlNode* c_node + cdef xmlNs* c_ns + nsmap = {} + c_node = self._c_node + while c_node is not NULL and _isElement(c_node): + c_ns = c_node.nsDef + while c_ns is not NULL: + if c_ns.prefix is NULL: + prefix = None + else: + prefix = funicode(c_ns.prefix) + if prefix not in nsmap: + nsmap[prefix] = funicode(c_ns.href) + c_ns = c_ns.next + c_node = c_node.parent + return nsmap + # ACCESSORS def __repr__(self): return "" % (self.tag, id(self)) Modified: lxml/trunk/src/lxml/tests/test_etree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_etree.py (original) +++ lxml/trunk/src/lxml/tests/test_etree.py Wed Jun 21 16:47:33 2006 @@ -529,6 +529,36 @@ '', self._writeElement(e)) + def test_element_nsmap(self): + etree = self.etree + + r = {None: 'http://ns.infrae.com/foo', + 'hoi': 'http://ns.infrae.com/hoi'} + e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=r) + self.assertEquals( + r, + e.nsmap) + + def test_subelement_nsmap(self): + etree = self.etree + + re = {None: 'http://ns.infrae.com/foo', + 'hoi': 'http://ns.infrae.com/hoi'} + e = etree.Element('{http://ns.infrae.com/foo}bar', nsmap=re) + + rs = {None: 'http://ns.infrae.com/honk', + 'top': 'http://ns.infrae.com/top'} + s = etree.SubElement(e, '{http://ns.infrae.com/honk}bar', nsmap=rs) + + r = re.copy() + r.update(rs) + self.assertEquals( + re, + e.nsmap) + self.assertEquals( + r, + s.nsmap) + def test_getiterator_filter_namespace(self): Element = self.etree.Element SubElement = self.etree.SubElement Modified: lxml/trunk/src/lxml/tree.pxd ============================================================================== --- lxml/trunk/src/lxml/tree.pxd (original) +++ lxml/trunk/src/lxml/tree.pxd Wed Jun 21 16:47:33 2006 @@ -82,6 +82,7 @@ ctypedef struct xmlNs: char* href char* prefix + xmlNs* next ctypedef struct xmlNode: void* _private @@ -96,6 +97,7 @@ char* content xmlAttr* properties xmlNs* ns + xmlNs* nsDef ctypedef struct xmlDtd: char* ExternalID From scoder at codespeak.net Wed Jun 21 17:09:46 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 17:09:46 +0200 (CEST) Subject: [Lxml-checkins] r29076 - in lxml/trunk: . src/lxml Message-ID: <20060621150946.3145610063@code0.codespeak.net> Author: scoder Date: Wed Jun 21 17:09:45 2006 New Revision: 29076 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/parser.pxi Log: parsing: do not strip XML encoding decl from unicode strings after conversion to UTF-8 - if they have one, they are considered broken (which libxml2 will notice) Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Wed Jun 21 17:09:45 2006 @@ -38,6 +38,9 @@ Bugs fixed ---------- +* Parsing accepted unicode strings with XML encoding declaration in certain + cases + * Parsing 8-bit encoded strings from StringIO objects raised an exception * Module function ``initThread()`` was removed - useless (and never worked) Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 21 17:09:45 2006 @@ -809,7 +809,7 @@ if python.PyUnicode_Check(text): # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: - text = _stripEncodingDeclaration(_utf8(text)) + text = python.PyUnicode_AsUTF8String(text) elif not python.PyString_Check(text): raise ValueError, "can only parse strings" if url is not None: From scoder at codespeak.net Wed Jun 21 17:24:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 17:24:13 +0200 (CEST) Subject: [Lxml-checkins] r29077 - lxml/trunk/doc Message-ID: <20060621152413.7DD2010064@code0.codespeak.net> Author: scoder Date: Wed Jun 21 17:24:12 2006 New Revision: 29077 Modified: lxml/trunk/doc/FAQ.txt Log: FAQ entry on parsing broken unicode Modified: lxml/trunk/doc/FAQ.txt ============================================================================== --- lxml/trunk/doc/FAQ.txt (original) +++ lxml/trunk/doc/FAQ.txt Wed Jun 21 17:24:12 2006 @@ -109,6 +109,22 @@ lxml can add fresh whitespace to the XML tree to indent it. +#) Why can't lxml parse my XML from unicode strings? + + lxml can read Python unicode strings and even tries to support them if + libxml2 does not. However, if the unicode string declares an XML encoding + internally (````), parsing is bound to fail, as this + encoding is most likely not the real encoding used in Python unicode. The + same is true for HTML unicode strings that contain charset meta tags. Note + that Python uses different encodings for unicode on different platforms, so + even specifying the real internal unicode encoding is not portable between + Python interpreters. Don't do it. + + Python unicode strings with XML data or HTML data that carry encoding + information are broken. lxml will not parse them. You must provide + parsable data in a valid encoding. + + #) How can I find out which namespace prefixes are used in a document? You can traverse the document (``getiterator()``) and collect the prefix From scoder at codespeak.net Wed Jun 21 17:27:01 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 17:27:01 +0200 (CEST) Subject: [Lxml-checkins] r29078 - in lxml/branch/lxml-1.0: . doc src/lxml Message-ID: <20060621152701.782DE10064@code0.codespeak.net> Author: scoder Date: Wed Jun 21 17:27:00 2006 New Revision: 29078 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/doc/FAQ.txt lxml/branch/lxml-1.0/src/lxml/parser.pxi Log: merged in fix for unicode declaration stripping from trunk, including FAQ entry Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Wed Jun 21 17:27:00 2006 @@ -10,6 +10,9 @@ Bugs fixed ---------- +* Parsing accepted unicode strings with XML encoding declaration in certain + cases + * Parsing 8-bit encoded strings from StringIO objects raised an exception * Module function ``initThread()`` was removed - useless (and never worked) Modified: lxml/branch/lxml-1.0/doc/FAQ.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/FAQ.txt (original) +++ lxml/branch/lxml-1.0/doc/FAQ.txt Wed Jun 21 17:27:00 2006 @@ -85,6 +85,22 @@ lxml can add fresh whitespace to the XML tree to indent it. +#) Why can't lxml parse my XML from unicode strings? + + lxml can read Python unicode strings and even tries to support them if + libxml2 does not. However, if the unicode string declares an XML encoding + internally (````), parsing is bound to fail, as this + encoding is most likely not the real encoding used in Python unicode. The + same is true for HTML unicode strings that contain charset meta tags. Note + that Python uses different encodings for unicode on different platforms, so + even specifying the real internal unicode encoding is not portable between + Python interpreters. Don't do it. + + Python unicode strings with XML data or HTML data that carry encoding + information are broken. lxml will not parse them. You must provide + parsable data in a valid encoding. + + #) How can I find out which namespace prefixes are used in a document? You can traverse the document (``getiterator()``) and collect the prefix Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 21 17:27:00 2006 @@ -691,7 +691,7 @@ if python.PyUnicode_Check(text): # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: - text = _stripEncodingDeclaration(_utf8(text)) + text = python.PyUnicode_AsUTF8String(text) elif not python.PyString_Check(text): raise ValueError, "can only parse strings" if url is not None: From scoder at codespeak.net Wed Jun 21 17:50:53 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 17:50:53 +0200 (CEST) Subject: [Lxml-checkins] r29082 - in lxml/trunk/src/lxml: . tests Message-ID: <20060621155053.C3BB310070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 17:50:52 2006 New Revision: 29082 Modified: lxml/trunk/src/lxml/apihelpers.pxi lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/tests/test_unicode.py Log: raise ValueError when requested to parse unicode strings with encoding declaration Modified: lxml/trunk/src/lxml/apihelpers.pxi ============================================================================== --- lxml/trunk/src/lxml/apihelpers.pxi (original) +++ lxml/trunk/src/lxml/apihelpers.pxi Wed Jun 21 17:50:52 2006 @@ -121,14 +121,24 @@ c_ns = element._doc._findOrBuildNodeNs(element._c_node, _cstr(ns)) tree.xmlSetNsProp(element._c_node, c_ns, c_tag, c_value) +cdef object __RE_XML_ENCODING +__RE_XML_ENCODING = re.compile( + r'^(\s*<\?\s*xml[^>]+)\s+encoding\s*=\s*"[^"]*"\s*', re.U) + cdef object __REPLACE_XML_ENCODING -__REPLACE_XML_ENCODING = re.compile( - r'^(\s*<\?\s*xml[^>]+)\s+encoding\s*=\s*"[^"]*"\s*', re.U).sub +__REPLACE_XML_ENCODING = __RE_XML_ENCODING.sub + +cdef object __HAS_XML_ENCODING +__HAS_XML_ENCODING = __RE_XML_ENCODING.match cdef object _stripEncodingDeclaration(object xml_string): # this is a hack to remove the XML encoding declaration from unicode return __REPLACE_XML_ENCODING(r'\g<1>', xml_string) +cdef int _hasEncodingDeclaration(object xml_string): + # check if a (unicode) string has an XML encoding declaration + return __HAS_XML_ENCODING(xml_string) is not None + cdef object _stripDeclaration(object xml_string): # this is a hack to remove the XML declaration when we encode to UTF-8 xml_string = xml_string.strip() Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 21 17:50:52 2006 @@ -807,6 +807,9 @@ cdef _Document _parseMemoryDocument(text, url, _BaseParser parser): cdef xmlDoc* c_doc if python.PyUnicode_Check(text): + if _hasEncodingDeclaration(text): + raise ValueError, \ + "Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead." # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: text = python.PyUnicode_AsUTF8String(text) Modified: lxml/trunk/src/lxml/tests/test_unicode.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_unicode.py (original) +++ lxml/trunk/src/lxml/tests/test_unicode.py Wed Jun 21 17:50:52 2006 @@ -14,6 +14,11 @@ tree = etree.XML(u'

%s

' % uni) self.assertEquals(uni, tree.text) + def test_unicode_xml_broken(self): + uxml = u'' + \ + u'

%s

' % uni + self.assertRaises(ValueError, etree.XML, uxml) + def test_unicode_tag(self): el = etree.Element(uni) self.assertEquals(uni, el.tag) From scoder at codespeak.net Wed Jun 21 17:52:22 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 17:52:22 +0200 (CEST) Subject: [Lxml-checkins] r29084 - in lxml/branch/lxml-1.0/src/lxml: . tests Message-ID: <20060621155222.27AD810071@code0.codespeak.net> Author: scoder Date: Wed Jun 21 17:52:20 2006 New Revision: 29084 Modified: lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi lxml/branch/lxml-1.0/src/lxml/parser.pxi lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py Log: merge from trunk: raise ValueError when requested to parse unicode strings with encoding declaration Modified: lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/apihelpers.pxi Wed Jun 21 17:52:20 2006 @@ -121,14 +121,24 @@ c_ns = element._doc._findOrBuildNodeNs(element._c_node, _cstr(ns)) tree.xmlSetNsProp(element._c_node, c_ns, c_tag, c_value) +cdef object __RE_XML_ENCODING +__RE_XML_ENCODING = re.compile( + r'^(\s*<\?\s*xml[^>]+)\s+encoding\s*=\s*"[^"]*"\s*', re.U) + cdef object __REPLACE_XML_ENCODING -__REPLACE_XML_ENCODING = re.compile( - r'^(\s*<\?\s*xml[^>]+)\s+encoding\s*=\s*"[^"]*"\s*', re.U).sub +__REPLACE_XML_ENCODING = __RE_XML_ENCODING.sub + +cdef object __HAS_XML_ENCODING +__HAS_XML_ENCODING = __RE_XML_ENCODING.match cdef object _stripEncodingDeclaration(object xml_string): # this is a hack to remove the XML encoding declaration from unicode return __REPLACE_XML_ENCODING(r'\g<1>', xml_string) +cdef int _hasEncodingDeclaration(object xml_string): + # check if a (unicode) string has an XML encoding declaration + return __HAS_XML_ENCODING(xml_string) is not None + cdef object _stripDeclaration(object xml_string): # this is a hack to remove the XML declaration when we encode to UTF-8 xml_string = xml_string.strip() Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 21 17:52:20 2006 @@ -689,6 +689,9 @@ cdef _Document _parseMemoryDocument(text, url, _BaseParser parser): cdef xmlDoc* c_doc if python.PyUnicode_Check(text): + if _hasEncodingDeclaration(text): + raise ValueError, \ + "Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead." # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: text = python.PyUnicode_AsUTF8String(text) Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_unicode.py Wed Jun 21 17:52:20 2006 @@ -14,6 +14,11 @@ tree = etree.XML(u'

%s

' % uni) self.assertEquals(uni, tree.text) + def test_unicode_xml_broken(self): + uxml = u'' + \ + u'

%s

' % uni + self.assertRaises(ValueError, etree.XML, uxml) + def test_unicode_tag(self): el = etree.Element(uni) self.assertEquals(uni, el.tag) From scoder at codespeak.net Wed Jun 21 19:21:04 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 19:21:04 +0200 (CEST) Subject: [Lxml-checkins] r29091 - lxml/trunk/doc Message-ID: <20060621172104.2AC7710070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 19:21:03 2006 New Revision: 29091 Modified: lxml/trunk/doc/api.txt Log: clarification in api.txt: unicode strings with encoding prologue are not supported Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Wed Jun 21 19:21:03 2006 @@ -214,7 +214,9 @@ lxml.etree has broader support for Python unicode strings than the ElementTree library. First of all, where ElementTree would raise an exception, the -parsers in lxml.etree can handle unicode strings straight away:: +parsers in lxml.etree can handle unicode strings straight away. This is most +helpful for XML snippets embedded in source code using the ``XML()`` +function:: >>> uxml = u' \uf8d1 + \uf8d2 ' >>> uxml @@ -224,11 +226,15 @@ This requires, however, that unicode strings do not specify a conflicting encoding themselves and thus lie about their real encoding:: - >>> try: - ... broken = etree.XML(u'\n' + uxml) - ... except etree.XMLSyntaxError: - ... print "This is not well-formed XML!" - This is not well-formed XML! + >>> etree.XML(u'\n' + uxml) + Traceback (most recent call last): + ... + ValueError: Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead. + +Similarly, you will get errors when you try the same with HTML data in a +unicode string that specifies a charset in a meta tag of the header. You +should generally avoid converting XML/HTML data to unicode before passing it +into the parsers. It is both slower and error prone. To serialize the result, you would normally use the ``tostring`` module function, which serializes to plain ASCII by default or a number of other @@ -240,8 +246,8 @@ >>> etree.tostring(root, 'UTF-8', xml_declaration=False) ' \xef\xa3\x91 + \xef\xa3\x92 ' -As an extension, lxml.etree has a new ``lxml.etree.tounicode()`` function that -you can call on XML tree objects to retrieve a Python unicode representation:: +As an extension, lxml.etree has a new ``tounicode()`` function that you can +call on XML tree objects to retrieve a Python unicode representation:: >>> etree.tounicode(root) u' \uf8d1 + \uf8d2 ' @@ -258,14 +264,18 @@ >>> etree.tounicode(et) u'' -If you want to save the result to a file or pass it over the network, you -should use ``write()`` or ``tostring()`` with an encoding argument (typically -UTF-8) to serialize the XML. The main reason is that unicode strings returned -by ``tounicode()`` never have an XML declaration and therefore do not specify -an encoding. In contrast, the ``tostring()`` function automatically adds a -declaration as needed that reflects the encoding of the returned string. This -makes it possible for other parsers to correctly parse the XML byte stream. -Note that using ``tostring()`` with UTF-8 is also typically faster. +The result of ``tounicode()`` can be treated like any other Python unicode +string and then passed back into the parsers. However, if you want to save +the result to a file or pass it over the network, you should use ``write()`` +or ``tostring()`` with an encoding argument (typically UTF-8) to serialize the +XML. The main reason is that unicode strings returned by ``tounicode()`` +never have an XML declaration and therefore do not specify their encoding. +These strings are most likely not parsable by other XML libraries. + +In contrast, the ``tostring()`` function automatically adds a declaration as +needed that reflects the encoding of the returned string. This makes it +possible for other parsers to correctly parse the XML byte stream. Note that +using ``tostring()`` with UTF-8 is also considerably faster in most cases. XPath From scoder at codespeak.net Wed Jun 21 19:22:52 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 19:22:52 +0200 (CEST) Subject: [Lxml-checkins] r29092 - lxml/branch/lxml-1.0/doc Message-ID: <20060621172252.96BCD10070@code0.codespeak.net> Author: scoder Date: Wed Jun 21 19:22:51 2006 New Revision: 29092 Modified: lxml/branch/lxml-1.0/doc/api.txt Log: clarification in api.txt: unicode strings with encoding prologue are not supported Modified: lxml/branch/lxml-1.0/doc/api.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/api.txt (original) +++ lxml/branch/lxml-1.0/doc/api.txt Wed Jun 21 19:22:51 2006 @@ -158,7 +158,9 @@ lxml.etree has broader support for Python unicode strings than the ElementTree library. First of all, where ElementTree would raise an exception, the -parsers in lxml.etree can handle unicode strings straight away:: +parsers in lxml.etree can handle unicode strings straight away. This is most +helpful for XML snippets embedded in source code using the ``XML()`` +function:: >>> uxml = u' \uf8d1 + \uf8d2 ' >>> uxml @@ -168,11 +170,15 @@ This requires, however, that unicode strings do not specify a conflicting encoding themselves and thus lie about their real encoding:: - >>> try: - ... broken = etree.XML(u'\n' + uxml) - ... except etree.XMLSyntaxError: - ... print "This is not well-formed XML!" - This is not well-formed XML! + >>> etree.XML(u'\n' + uxml) + Traceback (most recent call last): + ... + ValueError: Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead. + +Similarly, you will get errors when you try the same with HTML data in a +unicode string that specifies a charset in a meta tag of the header. You +should generally avoid converting XML/HTML data to unicode before passing it +into the parsers. It is both slower and error prone. To serialize the result, you would normally use the ``tostring`` module function, which serializes to plain ASCII by default or a number of other @@ -184,8 +190,8 @@ >>> etree.tostring(root, 'UTF-8', xml_declaration=False) ' \xef\xa3\x91 + \xef\xa3\x92 ' -As an extension, lxml.etree has a new ``lxml.etree.tounicode()`` function that -you can call on XML tree objects to retrieve a Python unicode representation:: +As an extension, lxml.etree has a new ``tounicode()`` function that you can +call on XML tree objects to retrieve a Python unicode representation:: >>> etree.tounicode(root) u' \uf8d1 + \uf8d2 ' @@ -202,14 +208,18 @@ >>> etree.tounicode(et) u'' -If you want to save the result to a file or pass it over the network, you -should use ``write()`` or ``tostring()`` with an encoding argument (typically -UTF-8) to serialize the XML. The main reason is that unicode strings returned -by ``tounicode()`` never have an XML declaration and therefore do not specify -an encoding. In contrast, the ``tostring()`` function automatically adds a -declaration as needed that reflects the encoding of the returned string. This -makes it possible for other parsers to correctly parse the XML byte stream. -Note that using ``tostring()`` with UTF-8 is also typically faster. +The result of ``tounicode()`` can be treated like any other Python unicode +string and then passed back into the parsers. However, if you want to save +the result to a file or pass it over the network, you should use ``write()`` +or ``tostring()`` with an encoding argument (typically UTF-8) to serialize the +XML. The main reason is that unicode strings returned by ``tounicode()`` +never have an XML declaration and therefore do not specify their encoding. +These strings are most likely not parsable by other XML libraries. + +In contrast, the ``tostring()`` function automatically adds a declaration as +needed that reflects the encoding of the returned string. This makes it +possible for other parsers to correctly parse the XML byte stream. Note that +using ``tostring()`` with UTF-8 is also considerably faster in most cases. XPath From scoder at codespeak.net Wed Jun 21 19:31:27 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 19:31:27 +0200 (CEST) Subject: [Lxml-checkins] r29093 - in lxml/trunk: doc src/lxml Message-ID: <20060621173127.160B610068@code0.codespeak.net> Author: scoder Date: Wed Jun 21 19:31:25 2006 New Revision: 29093 Modified: lxml/trunk/doc/api.txt lxml/trunk/src/lxml/parser.pxi Log: shorter exception text to fit into 80 chars Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Wed Jun 21 19:31:25 2006 @@ -229,7 +229,7 @@ >>> etree.XML(u'\n' + uxml) Traceback (most recent call last): ... - ValueError: Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead. + ValueError: Unicode strings with encoding declaration are not supported. Similarly, you will get errors when you try the same with HTML data in a unicode string that specifies a charset in a meta tag of the header. You Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Wed Jun 21 19:31:25 2006 @@ -809,7 +809,7 @@ if python.PyUnicode_Check(text): if _hasEncodingDeclaration(text): raise ValueError, \ - "Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead." + "Unicode strings with encoding declaration are not supported." # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: text = python.PyUnicode_AsUTF8String(text) From scoder at codespeak.net Wed Jun 21 19:31:55 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 19:31:55 +0200 (CEST) Subject: [Lxml-checkins] r29094 - in lxml/branch/lxml-1.0: doc src/lxml Message-ID: <20060621173155.CD9EB10068@code0.codespeak.net> Author: scoder Date: Wed Jun 21 19:31:53 2006 New Revision: 29094 Modified: lxml/branch/lxml-1.0/doc/api.txt lxml/branch/lxml-1.0/src/lxml/parser.pxi Log: shorter exception text to fit into 80 chars Modified: lxml/branch/lxml-1.0/doc/api.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/api.txt (original) +++ lxml/branch/lxml-1.0/doc/api.txt Wed Jun 21 19:31:53 2006 @@ -173,7 +173,7 @@ >>> etree.XML(u'\n' + uxml) Traceback (most recent call last): ... - ValueError: Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead. + ValueError: Unicode strings with encoding declaration are not supported. Similarly, you will get errors when you try the same with HTML data in a unicode string that specifies a charset in a meta tag of the header. You Modified: lxml/branch/lxml-1.0/src/lxml/parser.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/parser.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/parser.pxi Wed Jun 21 19:31:53 2006 @@ -691,7 +691,7 @@ if python.PyUnicode_Check(text): if _hasEncodingDeclaration(text): raise ValueError, \ - "Unicode strings with encoding declaration are not supported. Use encoded 8-bit strings instead." + "Unicode strings with encoding declaration are not supported." # pass native unicode only if libxml2 can handle it if _UNICODE_ENCODING is NULL: text = python.PyUnicode_AsUTF8String(text) From scoder at codespeak.net Wed Jun 21 20:53:51 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 20:53:51 +0200 (CEST) Subject: [Lxml-checkins] r29097 - lxml/branch/iterparse Message-ID: <20060621185351.2368510068@code0.codespeak.net> Author: scoder Date: Wed Jun 21 20:53:49 2006 New Revision: 29097 Added: lxml/branch/iterparse/ - copied from r29096, lxml/trunk/ Log: new branch for work on iterparse From scoder at codespeak.net Wed Jun 21 23:26:02 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 23:26:02 +0200 (CEST) Subject: [Lxml-checkins] r29105 - in lxml/branch/iterparse: . src/lxml Message-ID: <20060621212602.D794010069@code0.codespeak.net> Author: scoder Date: Wed Jun 21 23:26:00 2006 New Revision: 29105 Added: lxml/branch/iterparse/src/lxml/iterparse.pxi Modified: lxml/branch/iterparse/selftest.py lxml/branch/iterparse/src/lxml/etree.pyx lxml/branch/iterparse/src/lxml/parser.pxi lxml/branch/iterparse/src/lxml/xmlparser.pxd Log: iterparse implementation (passes ET's selftests) Modified: lxml/branch/iterparse/selftest.py ============================================================================== --- lxml/branch/iterparse/selftest.py (original) +++ lxml/branch/iterparse/selftest.py Wed Jun 21 23:26:00 2006 @@ -306,6 +306,73 @@ ## ## """ +def iterparse(): + """ + Test iterparse interface. + + >>> iterparse = ElementTree.iterparse + + >>> context = iterparse("samples/simple.xml") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end empty-element + end root + >>> context.root.tag + 'root' + + >>> context = iterparse("samples/simple-ns.xml") + >>> for action, elem in context: + ... print action, elem.tag + end {namespace}element + end {namespace}element + end {namespace}empty-element + end {namespace}root + + >>> events = () + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = () + >>> context = iterparse("samples/simple.xml", events=events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = ("start", "end") + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> events = ("start", "end", "start-ns", "end-ns") + >>> context = iterparse("samples/simple-ns.xml", events) + >>> for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + start-ns ('', 'namespace') + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + end-ns None + + """ + ## def fancyparsefile(): ## """ ## Test the "fancy" parser. Modified: lxml/branch/iterparse/src/lxml/etree.pyx ============================================================================== --- lxml/branch/iterparse/src/lxml/etree.pyx (original) +++ lxml/branch/iterparse/src/lxml/etree.pyx Wed Jun 21 23:26:00 2006 @@ -1693,6 +1693,7 @@ include "docloader.pxi" # Support for custom document loaders include "parser.pxi" # XML Parser include "serializer.pxi" # XML output functions +include "iterparse.pxi" # incremental XML parsing include "xmlid.pxi" # XMLID and IDDict include "extensions.pxi" # XPath/XSLT extension functions include "xpath.pxi" # XPath evaluation Added: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- (empty file) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Wed Jun 21 23:26:00 2006 @@ -0,0 +1,181 @@ +# iterparse -- incremental parsing + +cdef int __ITERPARSE_CHUNK_SIZE +__ITERPARSE_CHUNK_SIZE = 16384 + +ctypedef enum IterparseEventFilter: + ITERPARSE_FILTER_START = 1 + ITERPARSE_FILTER_END = 2 + ITERPARSE_FILTER_START_NS = 4 + ITERPARSE_FILTER_END_NS = 8 + +cdef class _IterparseResolverContext(_ResolverContext): + cdef xmlparser.startElementNsSAX2Func _origSaxStart + cdef xmlparser.endElementNsSAX2Func _origSaxEnd + cdef object _root + cdef object _event_filter + cdef object _events + cdef object _event_index + cdef object _append_event + cdef object _node_stack + cdef object _append_node + cdef object _pop_node + + def __init__(self, *args): + _ResolverContext.__init__(self, *args) + self._node_stack = [] + self._append_node = self._node_stack.append + self._pop_node = self._node_stack.pop + self._events = [] + self._append_event = self._events.append + self._event_index = 0 + + cdef void _wrapCallbacks(self, xmlparser.xmlSAXHandler* sax): + self._origSaxStart = sax.startElementNs + sax.startElementNs = _saxStart + self._origSaxEnd = sax.endElementNs + sax.endElementNs = _saxEnd + + cdef void _setEventFilter(self, events): + self._event_filter = 0 + if 'start' in events: + self._event_filter = self._event_filter | ITERPARSE_FILTER_START + if 'end' in events: + self._event_filter = self._event_filter | ITERPARSE_FILTER_END + if 'start-ns' in events: + self._event_filter = self._event_filter | ITERPARSE_FILTER_START_NS + if 'end-ns' in events: + self._event_filter = self._event_filter | ITERPARSE_FILTER_END_NS + + cdef void startNode(self, xmlNode* c_node): + cdef xmlNs* c_ns + if self._event_filter & ITERPARSE_FILTER_START_NS or \ + self._event_filter & ITERPARSE_FILTER_END_NS: + c_ns = c_node.nsDef + ns_tuples = [] + while c_ns is not NULL: + if c_ns.prefix is NULL: + prefix = '' + else: + prefix = funicode(c_ns.prefix) + ns_tuple = (prefix, funicode(c_ns.href)) + if self._event_filter & ITERPARSE_FILTER_START_NS: + self._append_event(("start-ns", ns_tuple)) + ns_tuples.append(ns_tuple) + c_ns = c_ns.next + ns_tuples.reverse() + else: + ns_tuples = None + node = _elementFactory(None, c_node) + if self._root is None: + self._root = node + self._append_node((node, ns_tuples)) + if self._event_filter & ITERPARSE_FILTER_START: + self._append_event(("start", node)) + + cdef void endNode(self, xmlNode* c_node): + cdef _NodeBase node + node, ns_tuples = self._pop_node() + assert node._c_node is c_node + if self._event_filter & ITERPARSE_FILTER_END: + self._append_event(("end", node)) + + if self._event_filter & ITERPARSE_FILTER_END_NS: + for ns_tuple in ns_tuples: + self._append_event(("end-ns", None)) # ns_tuple)) + +cdef void _pushSaxStartEvent(xmlparser.xmlParserCtxt* c_ctxt, xmlNode* c_node): + cdef _IterparseResolverContext context + context = <_IterparseResolverContext>c_ctxt._private + context.startNode(c_node) + +cdef void _pushSaxEndEvent(xmlparser.xmlParserCtxt* c_ctxt, xmlNode* c_node): + cdef _IterparseResolverContext context + context = <_IterparseResolverContext>c_ctxt._private + context.endNode(c_node) + +cdef xmlparser.startElementNsSAX2Func _getOrigStart(xmlparser.xmlParserCtxt* c_ctxt): + return (<_IterparseResolverContext>c_ctxt._private)._origSaxStart + +cdef xmlparser.endElementNsSAX2Func _getOrigEnd(xmlparser.xmlParserCtxt* c_ctxt): + return (<_IterparseResolverContext>c_ctxt._private)._origSaxEnd + +cdef void _saxStart(void* ctxt, char* localname, char* prefix, char* URI, + int nb_namespaces, char** namespaces, + int nb_attributes, int nb_defaulted, char** attributes): + # no Python in here! + cdef xmlparser.xmlParserCtxt* c_ctxt + cdef xmlparser.startElementNsSAX2Func origStart + c_ctxt = ctxt + origStart = _getOrigStart(c_ctxt) + origStart(ctxt, localname, prefix, URI, nb_namespaces, namespaces, + nb_attributes, nb_defaulted, attributes) + _pushSaxStartEvent(c_ctxt, c_ctxt.node) + +cdef void _saxEnd(void* ctxt, char* localname, char* prefix, char* URI): + # no Python in here! + cdef xmlparser.xmlParserCtxt* c_ctxt + cdef xmlparser.endElementNsSAX2Func origEnd + c_ctxt = ctxt + _pushSaxEndEvent(c_ctxt, c_ctxt.node) + origEnd = _getOrigEnd(c_ctxt) + origEnd(ctxt, localname, prefix, URI) + +cdef class iterparse(_BaseParser): + cdef object _source + cdef readonly object root + def __init__(self, source, events=("end",)): + cdef _IterparseResolverContext context + cdef char* c_filename + if not hasattr(source, 'read'): + filename = source + source = open(source, 'rb') + else: + filename = _getFilenameForFile(source) + if filename is not None: + c_filename = filename + else: + c_filename = NULL + + self._source = source + _BaseParser.__init__(self) + + # wrap original SAX2 callbacks + context = <_IterparseResolverContext>self._context + context._wrapCallbacks(self._parser_ctxt.sax) + context._setEventFilter(events) + xmlparser.xmlCtxtResetPush(self._parser_ctxt, NULL, 0, c_filename, NULL) + + def __iter__(self): + return self + + def __next__(self): + cdef _IterparseResolverContext context + if self._source is None: + raise StopIteration + context = <_IterparseResolverContext>self._context + if python.PyList_GET_SIZE(context._events) > context._event_index: + item = python.PyList_GET_ITEM(context._events, context._event_index) + context._event_index = context._event_index + 1 + return item + + del context._events[:] + while python.PyList_GET_SIZE(context._events) == 0: + data = self._source.read(__ITERPARSE_CHUNK_SIZE) + if not python.PyString_Check(data): + #xmlparser.xmlParseChunk(self._parser_ctxt, NULL, 0, 1) + self._source = None + raise TypeError, "reading file objects must return plain strings" + elif data: + xmlparser.xmlParseChunk(self._parser_ctxt, _cstr(data), + python.PyString_GET_SIZE(data), 0) + else: + xmlparser.xmlParseChunk(self._parser_ctxt, NULL, 0, 1) + self._source = None + break + if python.PyList_GET_SIZE(context._events) == 0: + self.root = context._root + raise StopIteration + + context._event_index = 1 + return python.PyList_GET_ITEM(context._events, 0) Modified: lxml/branch/iterparse/src/lxml/parser.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/parser.pxi (original) +++ lxml/branch/iterparse/src/lxml/parser.pxi Wed Jun 21 23:26:00 2006 @@ -13,6 +13,7 @@ ctypedef enum LxmlParserType: LXML_XML_PARSER LXML_HTML_PARSER + LXML_ITERPARSE_PARSER cdef class _ParserContext: # Global parser context to share the string dictionary. @@ -343,12 +344,15 @@ elif isinstance(self, XMLParser): self._parser_type = LXML_XML_PARSER pctxt = xmlparser.xmlNewParserCtxt() + elif isinstance(self, iterparse): + self._parser_type = LXML_ITERPARSE_PARSER + pctxt = xmlparser.xmlNewParserCtxt() else: raise TypeError, "This class cannot be instantiated" self._parser_ctxt = pctxt if pctxt is NULL: raise ParserError, "Failed to create parser context" - if thread is None: + if thread is None or self._parser_type == LXML_ITERPARSE_PARSER: # no threading self._lockParser = self.__dummy self._unlockParser = self.__dummy @@ -358,7 +362,10 @@ self._unlockParser = lock.release self._error_log = _ErrorLog() self.resolvers = _ResolverRegistry() - self._context = _ResolverContext(self.resolvers) + if self._parser_type == LXML_ITERPARSE_PARSER: + self._context = _IterparseResolverContext(self.resolvers) + else: + self._context = _ResolverContext(self.resolvers) pctxt._private = self._context def __dealloc__(self): Modified: lxml/branch/iterparse/src/lxml/xmlparser.pxd ============================================================================== --- lxml/branch/iterparse/src/lxml/xmlparser.pxd (original) +++ lxml/branch/iterparse/src/lxml/xmlparser.pxd Wed Jun 21 23:26:00 2006 @@ -1,7 +1,24 @@ -from tree cimport xmlDoc, xmlDict +from tree cimport xmlDoc, xmlNode, xmlDict from tree cimport xmlInputReadCallback, xmlInputCloseCallback from xmlerror cimport xmlError + +cdef extern from "libxml/parser.h": + ctypedef void (*startElementNsSAX2Func)(void* ctx, + char* localname, + char* prefix, + char* URI, + int nb_namespaces, + char** namespaces, + int nb_attributes, + int nb_defaulted, + char** attributes) + + ctypedef void (*endElementNsSAX2Func)(void* ctx, + char* localname, + char* prefix, + char* URI) + cdef extern from "libxml/tree.h": ctypedef struct xmlParserInput ctypedef struct xmlParserInputBuffer: @@ -9,6 +26,10 @@ xmlInputReadCallback readcallback xmlInputCloseCallback closecallback + ctypedef struct xmlSAXHandler: + startElementNsSAX2Func startElementNs + endElementNsSAX2Func endElementNs + cdef extern from "libxml/xmlIO.h": cdef xmlParserInputBuffer* xmlAllocParserInputBuffer(int enc) @@ -27,6 +48,8 @@ int recovery int options xmlError lastError + xmlNode* node + xmlSAXHandler* sax ctypedef enum xmlParserOption: XML_PARSE_RECOVER = 1 # recover on errors @@ -72,6 +95,20 @@ char* buffer, int size, char* filename, char* encoding, int options) +# iterparse: + + cdef xmlParserCtxt* xmlCreatePushParserCtxt(xmlSAXHandler* sax, + void* user_data, + char* chunk, + int size, + char* filename) + + cdef int xmlCtxtResetPush(xmlParserCtxt* ctxt, + char* chunk, + int size, + char* filename, + char* encoding) + # entity loaders: ctypedef xmlParserInput* (*xmlExternalEntityLoader)(char * URL, From scoder at codespeak.net Wed Jun 21 23:47:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 23:47:41 +0200 (CEST) Subject: [Lxml-checkins] r29107 - lxml/branch/iterparse/src/lxml/tests Message-ID: <20060621214741.DF11910071@code0.codespeak.net> Author: scoder Date: Wed Jun 21 23:47:40 2006 New Revision: 29107 Modified: lxml/branch/iterparse/src/lxml/tests/test_elementtree.py Log: test cases for iterparse() Modified: lxml/branch/iterparse/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/branch/iterparse/src/lxml/tests/test_elementtree.py (original) +++ lxml/branch/iterparse/src/lxml/tests/test_elementtree.py Wed Jun 21 23:47:40 2006 @@ -1754,7 +1754,55 @@ self.assert_(tostring(b) == 'Foo' or tostring(b) == 'Foo') - + + def test_iterparse(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f) + self.assertEquals(None, + iterator.root) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('end', root[0]), ('end', root[1]), ('end', root)], + events) + + def test_iterparse_start(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, events=('start',)) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('start', root), ('start', root[0]), ('start', root[1])], + events) + + def test_iterparse_start_end(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, events=('start','end')) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('start', root), ('start', root[0]), ('end', root[0]), + ('start', root[1]), ('end', root[1]), ('end', root)], + events) + + def test_iterparse_clear(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f) + for event, elem in iterator: + elem.clear() + + root = iterator.root + self.assertEquals(0, + len(root)) + def test_parse_file(self): parse = self.etree.parse # from file From scoder at codespeak.net Wed Jun 21 23:58:45 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Wed, 21 Jun 2006 23:58:45 +0200 (CEST) Subject: [Lxml-checkins] r29108 - lxml/branch/iterparse Message-ID: <20060621215845.117FC1006F@code0.codespeak.net> Author: scoder Date: Wed Jun 21 23:58:44 2006 New Revision: 29108 Modified: lxml/branch/iterparse/CHANGES.txt Log: updated CHANGES.txt for iterparse() Modified: lxml/branch/iterparse/CHANGES.txt ============================================================================== --- lxml/branch/iterparse/CHANGES.txt (original) +++ lxml/branch/iterparse/CHANGES.txt Wed Jun 21 23:58:44 2006 @@ -7,6 +7,8 @@ Features added -------------- +* ElementTree compatible iterparse() module function + * Element.nsmap property returns a mapping of all namespace prefixes known at the Element to their namespace URI From scoder at codespeak.net Thu Jun 22 00:12:34 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 00:12:34 +0200 (CEST) Subject: [Lxml-checkins] r29109 - lxml/branch/iterparse/src/lxml/tests Message-ID: <20060621221234.893071006F@code0.codespeak.net> Author: scoder Date: Thu Jun 22 00:12:27 2006 New Revision: 29109 Modified: lxml/branch/iterparse/src/lxml/tests/test_elementtree.py Log: test case for iterparse+getiterator Modified: lxml/branch/iterparse/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/branch/iterparse/src/lxml/tests/test_elementtree.py (original) +++ lxml/branch/iterparse/src/lxml/tests/test_elementtree.py Thu Jun 22 00:12:27 2006 @@ -1803,6 +1803,17 @@ self.assertEquals(0, len(root)) + def test_iterparse_getiterator(self): + iterparse = self.etree.iterparse + f = StringIO('') + + counts = [] + for event, elem in iterparse(f): + counts.append(len(list(elem.getiterator()))) + self.assertEquals( + [1,2,1,4], + counts) + def test_parse_file(self): parse = self.etree.parse # from file From scoder at codespeak.net Thu Jun 22 08:23:40 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 08:23:40 +0200 (CEST) Subject: [Lxml-checkins] r29113 - lxml/trunk/src/lxml Message-ID: <20060622062340.7A95A1006F@code0.codespeak.net> Author: scoder Date: Thu Jun 22 08:23:38 2006 New Revision: 29113 Modified: lxml/trunk/src/lxml/xmlerror.pxd lxml/trunk/src/lxml/xmlerror.pxi Log: updated error constants for libxml2 2.6.26 Modified: lxml/trunk/src/lxml/xmlerror.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxd (original) +++ lxml/trunk/src/lxml/xmlerror.pxd Thu Jun 22 08:23:38 2006 @@ -610,6 +610,7 @@ XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 XML_SCHEMAV_CVC_IDC = 1877 # 1877 XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 + XML_SCHEMAV_MISC = 1879 # 1879 XML_XPTR_UNKNOWN_SCHEME = 1900 XML_XPTR_CHILDSEQ_START = 1901 # 1901 XML_XPTR_EVAL_FAILED = 1902 # 1902 Modified: lxml/trunk/src/lxml/xmlerror.pxi ============================================================================== --- lxml/trunk/src/lxml/xmlerror.pxi (original) +++ lxml/trunk/src/lxml/xmlerror.pxi Thu Jun 22 08:23:38 2006 @@ -1049,6 +1049,7 @@ SCHEMAV_CVC_TYPE_2=1876 SCHEMAV_CVC_IDC=1877 SCHEMAV_CVC_WILDCARD=1878 +SCHEMAV_MISC=1879 XPTR_UNKNOWN_SCHEME=1900 XPTR_CHILDSEQ_START=1901 XPTR_EVAL_FAILED=1902 @@ -1073,9 +1074,9 @@ SCHEMAP_SRC_RESOLVE=3004 SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE=3005 SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE=3006 -SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 """, """\ +SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 SCHEMAP_ST_PROPS_CORRECT_1=3008 SCHEMAP_ST_PROPS_CORRECT_2=3009 SCHEMAP_ST_PROPS_CORRECT_3=3010 @@ -1134,10 +1135,10 @@ SCHEMAP_COS_CT_EXTENDS_1_1=3063 SCHEMAP_SRC_IMPORT_1_1=3064 SCHEMAP_SRC_IMPORT_1_2=3065 -SCHEMAP_SRC_IMPORT_2=3066 -SCHEMAP_SRC_IMPORT_2_1=3067 """, """\ +SCHEMAP_SRC_IMPORT_2=3066 +SCHEMAP_SRC_IMPORT_2_1=3067 SCHEMAP_SRC_IMPORT_2_2=3068 SCHEMAP_INTERNAL=3069 SCHEMAP_NOT_DETERMINISTIC=3070 From scoder at codespeak.net Thu Jun 22 08:25:19 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 08:25:19 +0200 (CEST) Subject: [Lxml-checkins] r29114 - lxml/branch/lxml-1.0/src/lxml Message-ID: <20060622062519.703031006F@code0.codespeak.net> Author: scoder Date: Thu Jun 22 08:25:18 2006 New Revision: 29114 Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi Log: updated error constants for libxml2 2.6.26 Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxd Thu Jun 22 08:25:18 2006 @@ -610,6 +610,7 @@ XML_SCHEMAV_CVC_TYPE_2 = 1876 # 1876 XML_SCHEMAV_CVC_IDC = 1877 # 1877 XML_SCHEMAV_CVC_WILDCARD = 1878 # 1878 + XML_SCHEMAV_MISC = 1879 # 1879 XML_XPTR_UNKNOWN_SCHEME = 1900 XML_XPTR_CHILDSEQ_START = 1901 # 1901 XML_XPTR_EVAL_FAILED = 1902 # 1902 Modified: lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/xmlerror.pxi Thu Jun 22 08:25:18 2006 @@ -1040,6 +1040,7 @@ SCHEMAV_CVC_TYPE_2=1876 SCHEMAV_CVC_IDC=1877 SCHEMAV_CVC_WILDCARD=1878 +SCHEMAV_MISC=1879 XPTR_UNKNOWN_SCHEME=1900 XPTR_CHILDSEQ_START=1901 XPTR_EVAL_FAILED=1902 @@ -1064,9 +1065,9 @@ SCHEMAP_SRC_RESOLVE=3004 SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE=3005 SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE=3006 -SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 """, """\ +SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES=3007 SCHEMAP_ST_PROPS_CORRECT_1=3008 SCHEMAP_ST_PROPS_CORRECT_2=3009 SCHEMAP_ST_PROPS_CORRECT_3=3010 @@ -1125,10 +1126,10 @@ SCHEMAP_COS_CT_EXTENDS_1_1=3063 SCHEMAP_SRC_IMPORT_1_1=3064 SCHEMAP_SRC_IMPORT_1_2=3065 -SCHEMAP_SRC_IMPORT_2=3066 -SCHEMAP_SRC_IMPORT_2_1=3067 """, """\ +SCHEMAP_SRC_IMPORT_2=3066 +SCHEMAP_SRC_IMPORT_2_1=3067 SCHEMAP_SRC_IMPORT_2_2=3068 SCHEMAP_INTERNAL=3069 SCHEMAP_NOT_DETERMINISTIC=3070 From scoder at codespeak.net Thu Jun 22 08:35:37 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 08:35:37 +0200 (CEST) Subject: [Lxml-checkins] r29115 - lxml/branch/iterparse/src/lxml Message-ID: <20060622063537.C86C810071@code0.codespeak.net> Author: scoder Date: Thu Jun 22 08:35:36 2006 New Revision: 29115 Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi Log: small cleanup in iterparse(), docstring Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Thu Jun 22 08:35:36 2006 @@ -49,8 +49,8 @@ cdef void startNode(self, xmlNode* c_node): cdef xmlNs* c_ns - if self._event_filter & ITERPARSE_FILTER_START_NS or \ - self._event_filter & ITERPARSE_FILTER_END_NS: + if self._event_filter & \ + (ITERPARSE_FILTER_START_NS | ITERPARSE_FILTER_END_NS): c_ns = c_node.nsDef ns_tuples = [] while c_ns is not NULL: @@ -122,6 +122,15 @@ origEnd(ctxt, localname, prefix, URI) cdef class iterparse(_BaseParser): + """Incremental parser. Parses XML into a tree and generates tuples + (event, element) in a SAX-like fashion. ``event`` is any of 'start', + 'end', 'start-ns', 'end-ns'. + + For 'start' and 'end', ``element`` is the Element that the parser just + found opening or closing. For 'start-ns', it is a tuple (prefix, URI) of + a new namespace declaration. For 'end-ns', it is simply None. Note that + all start and end events are guaranteed to be properly nested. + """ cdef object _source cdef readonly object root def __init__(self, source, events=("end",)): From scoder at codespeak.net Thu Jun 22 09:06:00 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 09:06:00 +0200 (CEST) Subject: [Lxml-checkins] r29116 - in lxml/branch/iterparse: doc src/lxml src/lxml/tests Message-ID: <20060622070600.6441E10071@code0.codespeak.net> Author: scoder Date: Thu Jun 22 09:05:58 2006 New Revision: 29116 Modified: lxml/branch/iterparse/doc/compatibility.txt lxml/branch/iterparse/src/lxml/iterparse.pxi lxml/branch/iterparse/src/lxml/tests/test_etree.py Log: raise parser exceptions in iterparse() Modified: lxml/branch/iterparse/doc/compatibility.txt ============================================================================== --- lxml/branch/iterparse/doc/compatibility.txt (original) +++ lxml/branch/iterparse/doc/compatibility.txt Thu Jun 22 09:05:58 2006 @@ -87,6 +87,10 @@ API. In general, etree tries to avoid AssertionErrors in favour of being more specific about the reason for the exception. +* When parsing fails in ``iterparse()``, ElementTree raises an ExpatError + instead of a SyntaxError. lxml.etree follows the other parts of the parser + API and raises an (XML)SyntaxError. + * ElementTree has a bug when serializing an empty Comment (no text argument given) to XML, etree serializes this successfully. Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Thu Jun 22 09:05:58 2006 @@ -12,10 +12,11 @@ cdef class _IterparseResolverContext(_ResolverContext): cdef xmlparser.startElementNsSAX2Func _origSaxStart cdef xmlparser.endElementNsSAX2Func _origSaxEnd - cdef object _root + cdef _Element _root + cdef _Document _doc cdef object _event_filter cdef object _events - cdef object _event_index + cdef int _event_index cdef object _append_event cdef object _node_stack cdef object _append_node @@ -49,6 +50,7 @@ cdef void startNode(self, xmlNode* c_node): cdef xmlNs* c_ns + cdef _Element node if self._event_filter & \ (ITERPARSE_FILTER_START_NS | ITERPARSE_FILTER_END_NS): c_ns = c_node.nsDef @@ -66,7 +68,9 @@ ns_tuples.reverse() else: ns_tuples = None - node = _elementFactory(None, c_node) + if self._doc is None: + self._doc = _documentFactory(c_node.doc, None) + node = _elementFactory(self._doc, c_node) if self._root is None: self._root = node self._append_node((node, ns_tuples)) @@ -74,7 +78,7 @@ self._append_event(("start", node)) cdef void endNode(self, xmlNode* c_node): - cdef _NodeBase node + cdef _Element node node, ns_tuples = self._pop_node() assert node._c_node is c_node if self._event_filter & ITERPARSE_FILTER_END: @@ -132,17 +136,18 @@ all start and end events are guaranteed to be properly nested. """ cdef object _source + cdef object _filename cdef readonly object root def __init__(self, source, events=("end",)): cdef _IterparseResolverContext context cdef char* c_filename if not hasattr(source, 'read'): - filename = source + self._filename = source source = open(source, 'rb') else: - filename = _getFilenameForFile(source) - if filename is not None: - c_filename = filename + self._filename = _getFilenameForFile(source) + if self._filename is not None: + c_filename = self._filename else: c_filename = NULL @@ -160,6 +165,8 @@ def __next__(self): cdef _IterparseResolverContext context + cdef int error + cdef char* c_filename if self._source is None: raise StopIteration context = <_IterparseResolverContext>self._context @@ -169,19 +176,28 @@ return item del context._events[:] - while python.PyList_GET_SIZE(context._events) == 0: + error = 0 + while error == 0 and python.PyList_GET_SIZE(context._events) == 0: data = self._source.read(__ITERPARSE_CHUNK_SIZE) if not python.PyString_Check(data): #xmlparser.xmlParseChunk(self._parser_ctxt, NULL, 0, 1) self._source = None raise TypeError, "reading file objects must return plain strings" elif data: - xmlparser.xmlParseChunk(self._parser_ctxt, _cstr(data), - python.PyString_GET_SIZE(data), 0) + error = xmlparser.xmlParseChunk( + self._parser_ctxt, _cstr(data), + python.PyString_GET_SIZE(data), 0) else: - xmlparser.xmlParseChunk(self._parser_ctxt, NULL, 0, 1) + error = xmlparser.xmlParseChunk(self._parser_ctxt, NULL, 0, 1) self._source = None break + if error != 0: + self._source = None + if self._filename is not None: + c_filename = self._filename + else: + c_filename = NULL + _raiseParseError(self._parser_ctxt, c_filename) if python.PyList_GET_SIZE(context._events) == 0: self.root = context._root raise StopIteration Modified: lxml/branch/iterparse/src/lxml/tests/test_etree.py ============================================================================== --- lxml/branch/iterparse/src/lxml/tests/test_etree.py (original) +++ lxml/branch/iterparse/src/lxml/tests/test_etree.py Thu Jun 22 09:05:58 2006 @@ -74,6 +74,12 @@ self.assertRaises(SyntaxError, parse, f) f.close() + def test_iterparse_broken(self): + iterparse = self.etree.iterparse + f = StringIO('') + # ET raises ExpatError, lxml raises XMLSyntaxError + self.assertRaises(self.etree.XMLSyntaxError, list, iterparse(f)) + def test_resolve_string_dtd(self): parse = self.etree.parse parser = self.etree.XMLParser(dtd_validation=True) From scoder at codespeak.net Thu Jun 22 09:42:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 09:42:31 +0200 (CEST) Subject: [Lxml-checkins] r29117 - lxml/branch/iterparse Message-ID: <20060622074231.E70CC10071@code0.codespeak.net> Author: scoder Date: Thu Jun 22 09:42:30 2006 New Revision: 29117 Modified: lxml/branch/iterparse/bench.py Log: support starting benchmark from serialized XML data, new benchmark for plain parser performance Modified: lxml/branch/iterparse/bench.py ============================================================================== --- lxml/branch/iterparse/bench.py (original) +++ lxml/branch/iterparse/bench.py Thu Jun 22 09:42:30 2006 @@ -14,14 +14,15 @@ 'bla3' : _TEXT } -def with_attributes(use_attributes): +def with_attributes(*use_attributes): "Decorator for benchmarks that use attributes" - value = {False : 0, True : 1}[ bool(use_attributes) ] + vmap = {False : 0, True : 1} + values = [ vmap[bool(v)] for v in use_attributes ] def set_value(function): try: - function.ATTRIBUTES.add(value) + function.ATTRIBUTES.update(values) except AttributeError: - function.ATTRIBUTES = set([value]) + function.ATTRIBUTES = set(values) return function return set_value @@ -43,12 +44,18 @@ return set_value def onlylib(*libs): + "Decorator to restrict benchmarks to specific libraries" def set_libs(function): if libs: function.LIBS = libs return function return set_libs +def serialized(function): + "Decorator for benchmarks that require serialized XML data" + function.STRING = True + return function + class SkippedTest(Exception): pass @@ -72,9 +79,13 @@ deepcopy = copy.deepcopy def set_property(root, fname): setattr(self, fname, lambda : deepcopy(root)) + xml = self._serialize_tree(root) + setattr(self, fname + '_xml', lambda : xml) else: def set_property(root, fname): setattr(self, fname, self.et_make_clone_factory(root)) + xml = self._serialize_tree(root) + setattr(self, fname + '_xml', lambda : xml) attribute_list = list(izip(count(), ({}, _ATTRIBUTES))) text_list = list(izip(count(), (None, _TEXT, _UTEXT))) @@ -94,8 +105,14 @@ def _tree_builder_name(self, tree, tn, an): return '_root%d_T%d_A%d' % (tree, tn, an) - def tree_builder(self, tree, tn, an): - return getattr(self, self._tree_builder_name(tree, tn, an)) + def tree_builder(self, tree, tn, an, serial): + name = self._tree_builder_name(tree, tn, an) + if serial: + name += '_xml' + return getattr(self, name) + + def _serialize_tree(self, root): + return self.etree.tostring(root, 'UTF-8') def et_make_clone_factory(self, elem): def generate_elem(append, elem, level): @@ -227,10 +244,13 @@ arg_count = 1 tree_tuples = self._permutations(all_trees, arg_count) + serialized = getattr(method, 'STRING', False) + for tree_tuple in tree_tuples: for tn in sorted(getattr(method, 'TEXT', (0,))): for an in sorted(getattr(method, 'ATTRIBUTES', (0,))): - benchmarks.append((name, method_call, tree_tuple, tn, an)) + benchmarks.append((name, method_call, tree_tuple, + tn, an, serialized)) return benchmarks @@ -263,27 +283,23 @@ for child in reversed(root): pass - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_tostring_utf8(self, root): self.etree.tostring(root, 'UTF-8') - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_tostring_utf16(self, root): self.etree.tostring(root, 'UTF-16') - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_tostring_utf8_unicode_XML(self, root): xml = unicode(self.etree.tostring(root, 'UTF-8'), 'UTF-8') self.etree.XML(xml) - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_write_utf8_parse_stringIO(self, root): f = StringIO() @@ -291,6 +307,13 @@ f.seek(0) self.etree.parse(f) + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_parse_stringIO(self, root_xml): + f = StringIO(root_xml) + self.etree.parse(f) + def bench_append_from_document(self, root1, root2): # == "1,2 2,3 1,3 3,1 3,2 2,1" # trees 1 and 2, or 2 and 3, or ... for el in root2: @@ -643,14 +666,14 @@ for bs in benchmarks ] import time - def run_bench(suite, method_name, method_call, tree_set, tn, an): + def run_bench(suite, method_name, method_call, tree_set, tn, an, serial): if method_call is None: raise SkippedTest current_time = time.time call_repeat = range(10) - tree_builders = [ suite.tree_builder(tree, tn, an) + tree_builders = [ suite.tree_builder(tree, tn, an, serial) for tree in tree_set ] times = [] @@ -670,10 +693,11 @@ del args return times - def build_treeset_name(trees, tn, an): + def build_treeset_name(trees, tn, an, serialized): text = {0:'-', 1:'S', 2:'U'}[tn] attr = {0:'-', 1:'A'}[an] - return "%s%s T%s" % (text, attr, ',T'.join(imap(str, trees))[:6]) + ser = {True:'X', False:'T'}[serialized] + return "%s%s%s T%s" % (text, attr, ser, ',T'.join(imap(str, trees))[:6]) print "Running benchmark on", ', '.join(b.lib_name @@ -685,7 +709,7 @@ print "%-3s: " % b.lib_name, for an in (0,1): for tn in (0,1,2): - print ' %s ' % build_treeset_name((), tn, an)[:2], + print ' %s ' % build_treeset_name((), tn, an, False)[:2], print for i, tree_times in enumerate(b.setup_times): print " T%d:" % (i+1), ' '.join("%6.4f" % t for t in tree_times) @@ -699,7 +723,7 @@ for bench_calls in izip(*benchmarks): for lib, (bench, benchmark_setup) in enumerate(izip(benchmark_suites, bench_calls)): bench_name = benchmark_setup[0] - tree_set_name = build_treeset_name(*benchmark_setup[-3:]) + tree_set_name = build_treeset_name(*benchmark_setup[-4:]) print "%-3s: %-28s" % (bench.lib_name, bench_name[6:34]), print "(%-10s)" % tree_set_name, sys.stdout.flush() From scoder at codespeak.net Thu Jun 22 10:32:37 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 10:32:37 +0200 (CEST) Subject: [Lxml-checkins] r29121 - lxml/branch/iterparse Message-ID: <20060622083237.33D671006F@code0.codespeak.net> Author: scoder Date: Thu Jun 22 10:32:36 2006 New Revision: 29121 Modified: lxml/branch/iterparse/bench.py Log: benchmarks for iterparse() and XML() Modified: lxml/branch/iterparse/bench.py ============================================================================== --- lxml/branch/iterparse/bench.py (original) +++ lxml/branch/iterparse/bench.py Thu Jun 22 10:32:36 2006 @@ -314,6 +314,28 @@ f = StringIO(root_xml) self.etree.parse(f) + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_XML(self, root_xml): + self.etree.XML(root_xml) + + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_iterparse_stringIO(self, root_xml): + f = StringIO(root_xml) + for event, element in self.etree.iterparse(f): + pass + + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_iterparse_stringIO_clear(self, root_xml): + f = StringIO(root_xml) + for event, element in self.etree.iterparse(f): + element.clear() + def bench_append_from_document(self, root1, root2): # == "1,2 2,3 1,3 3,1 3,2 2,1" # trees 1 and 2, or 2 and 3, or ... for el in root2: From scoder at codespeak.net Thu Jun 22 11:13:22 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 11:13:22 +0200 (CEST) Subject: [Lxml-checkins] r29124 - lxml/branch/iterparse/doc Message-ID: <20060622091322.B075B1006F@code0.codespeak.net> Author: scoder Date: Thu Jun 22 11:13:21 2006 New Revision: 29124 Modified: lxml/branch/iterparse/doc/performance.txt Log: updated benchmark results in doc/performance.txt Modified: lxml/branch/iterparse/doc/performance.txt ============================================================================== --- lxml/branch/iterparse/doc/performance.txt (original) +++ lxml/branch/iterparse/doc/performance.txt Thu Jun 22 11:13:21 2006 @@ -1,16 +1,15 @@ Benchmarks and speed ==================== -As an XML library, lxml.etree is very fast. It is also slow. As with -all software, it depends on what you do with it. Rest assured that -lxml is fast enough for most applications, so lxml is probably fast -enough for yours. +As an XML library, lxml.etree is very fast. It is also slow. As with all +software, it depends on what you do with it. Rest assured that lxml is fast +enough for most applications, so lxml is probably somewhere between 'fast +enough' and 'the best choice' for yours. This text describes where lxml.etree (lxe) excels, gives hints on some performance traps and compares the overall performance to the original -ElementTree_ (ET) and cElementTree_ (cET) libraries by Fredrik Lundh. -The cElementTree library is a fast C-implementation of the original -ElementTree. +ElementTree_ (ET) and cElementTree_ (cET) libraries by Fredrik Lundh. The +cElementTree library is a fast C-implementation of the original ElementTree. .. _ElementTree: http://effbot.org/zone/element-index.htm .. _cElementTree: http://effbot.org/zone/celementtree.htm @@ -67,9 +66,20 @@ ET : tostring_utf8 (S- T3) 87.1525 msec/pass For parsing, the difference between the libraries is smaller. The (c)ET -libraries use the expat parser, which is known to be fast and similar in -performance to the libxml2 parser. If you take a complete serialize-parse -cycle, the numbers will look similar to these:: +libraries use the expat parser, which is known to be extremely fast:: + + lxe: parse_stringIO (SA T2) 197.7678 msec/pass + cET: parse_stringIO (SA T2) 38.9390 msec/pass + ET : parse_stringIO (SA T2) 364.3468 msec/pass + + lxe: parse_stringIO (UA T3) 48.6735 msec/pass + cET: parse_stringIO (UA T3) 39.7455 msec/pass + ET : parse_stringIO (UA T3) 237.9971 msec/pass + +The expat parser allows cET to be up to 80% faster than lxml on plain parser +performance. The same applies to the ``iterparse()`` function. However, if +you take a complete serialize-parse cycle, the numbers will look similar to +these:: lxe: write_utf8_parse_stringIO (S- T1) 187.0444 msec/pass cET: write_utf8_parse_stringIO (S- T1) 828.4068 msec/pass @@ -79,8 +89,10 @@ cET: write_utf8_parse_stringIO (UA T2) 927.2374 msec/pass ET : write_utf8_parse_stringIO (UA T2) 1297.9678 msec/pass -So, lxml also wins this contest, but considering the previous numbers on -serialization, cET comes rather close in plain parser performance. +For applications that require a high parser throughput and do little +serialization, cET is the best choice. Also for iterparse applications that +extract small amounts of data from large XML data sets. If it comes to +round-trip performance, however, lxml tends to be 3-4 times faster in total. The ElementTree API From scoder at codespeak.net Thu Jun 22 12:22:07 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 12:22:07 +0200 (CEST) Subject: [Lxml-checkins] r29127 - in lxml/branch/iterparse/src/lxml: . tests Message-ID: <20060622102207.ED59E10064@code0.codespeak.net> Author: scoder Date: Thu Jun 22 12:22:06 2006 New Revision: 29127 Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi lxml/branch/iterparse/src/lxml/tests/test_etree.py Log: filter iterparse() events by tag names Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Thu Jun 22 12:22:06 2006 @@ -21,6 +21,9 @@ cdef object _node_stack cdef object _append_node cdef object _pop_node + cdef object _tag_tuple + cdef char* _tag_href + cdef char* _tag_name def __init__(self, *args): _ResolverContext.__init__(self, *args) @@ -32,12 +35,13 @@ self._event_index = 0 cdef void _wrapCallbacks(self, xmlparser.xmlSAXHandler* sax): + "wrap original SAX2 callbacks" self._origSaxStart = sax.startElementNs sax.startElementNs = _saxStart self._origSaxEnd = sax.endElementNs sax.endElementNs = _saxEnd - cdef void _setEventFilter(self, events): + cdef void _setEventFilter(self, events, tag): self._event_filter = 0 if 'start' in events: self._event_filter = self._event_filter | ITERPARSE_FILTER_START @@ -48,6 +52,21 @@ if 'end-ns' in events: self._event_filter = self._event_filter | ITERPARSE_FILTER_END_NS + if tag is None or tag == '*': + self._tag_href = NULL + self._tag_name = NULL + else: + self._tag_tuple = _getNsTag(tag) + href, name = self._tag_tuple + if href is None or href == '*': + self._tag_href = NULL + else: + self._tag_href = _cstr(href) + if name is None or name == '*': + self._tag_name = NULL + else: + self._tag_name = _cstr(name) + cdef void startNode(self, xmlNode* c_node): cdef xmlNs* c_ns cdef _Element node @@ -75,14 +94,18 @@ self._root = node self._append_node((node, ns_tuples)) if self._event_filter & ITERPARSE_FILTER_START: - self._append_event(("start", node)) + if (self._tag_name is NULL and self._tag_href is NULL) or \ + _tagMatches(c_node, self._tag_href, self._tag_name): + self._append_event(("start", node)) cdef void endNode(self, xmlNode* c_node): cdef _Element node node, ns_tuples = self._pop_node() assert node._c_node is c_node if self._event_filter & ITERPARSE_FILTER_END: - self._append_event(("end", node)) + if (self._tag_name is NULL and self._tag_href is NULL) or \ + _tagMatches(c_node, self._tag_href, self._tag_name): + self._append_event(("end", node)) if self._event_filter & ITERPARSE_FILTER_END_NS: for ns_tuple in ns_tuples: @@ -134,11 +157,20 @@ found opening or closing. For 'start-ns', it is a tuple (prefix, URI) of a new namespace declaration. For 'end-ns', it is simply None. Note that all start and end events are guaranteed to be properly nested. + + The keyword argument ``events`` specifies a sequence of event type names + that should be generated. By default, only 'end' events will be + generated. + + The additional ``tag`` argument restricts the 'start' and 'end' events to + those elements that match the given tag. By default, events are generated + for all elements. Note that the 'start-ns' and 'end-ns' events are not + impacted by this restriction. """ cdef object _source cdef object _filename cdef readonly object root - def __init__(self, source, events=("end",)): + def __init__(self, source, events=("end",), tag=None): cdef _IterparseResolverContext context cdef char* c_filename if not hasattr(source, 'read'): @@ -154,10 +186,9 @@ self._source = source _BaseParser.__init__(self) - # wrap original SAX2 callbacks context = <_IterparseResolverContext>self._context context._wrapCallbacks(self._parser_ctxt.sax) - context._setEventFilter(events) + context._setEventFilter(events, tag) xmlparser.xmlCtxtResetPush(self._parser_ctxt, NULL, 0, c_filename, NULL) def __iter__(self): Modified: lxml/branch/iterparse/src/lxml/tests/test_etree.py ============================================================================== --- lxml/branch/iterparse/src/lxml/tests/test_etree.py (original) +++ lxml/branch/iterparse/src/lxml/tests/test_etree.py Thu Jun 22 12:22:06 2006 @@ -80,6 +80,27 @@ # ET raises ExpatError, lxml raises XMLSyntaxError self.assertRaises(self.etree.XMLSyntaxError, list, iterparse(f)) + def test_iterparse_tag(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, tag="b", events=('start', 'end')) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('start', root[0]), ('end', root[0])], + events) + + def test_iterparse_tag_all(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, tag="*", events=('start', 'end')) + events = list(iterator) + self.assertEquals( + 8, + len(events)) + def test_resolve_string_dtd(self): parse = self.etree.parse parser = self.etree.XMLParser(dtd_validation=True) From scoder at codespeak.net Thu Jun 22 13:04:15 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 13:04:15 +0200 (CEST) Subject: [Lxml-checkins] r29130 - lxml/branch/iterparse/src/lxml Message-ID: <20060622110415.3FFB210069@code0.codespeak.net> Author: scoder Date: Thu Jun 22 13:04:14 2006 New Revision: 29130 Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi Log: major cleanup in iterparse() Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Thu Jun 22 13:04:14 2006 @@ -66,50 +66,49 @@ self._tag_name = NULL else: self._tag_name = _cstr(name) + if self._tag_href is NULL and self._tag_name is NULL: + self._tag_tuple = None cdef void startNode(self, xmlNode* c_node): cdef xmlNs* c_ns cdef _Element node - if self._event_filter & \ - (ITERPARSE_FILTER_START_NS | ITERPARSE_FILTER_END_NS): + if self._event_filter & ITERPARSE_FILTER_START_NS: c_ns = c_node.nsDef - ns_tuples = [] while c_ns is not NULL: if c_ns.prefix is NULL: prefix = '' else: prefix = funicode(c_ns.prefix) ns_tuple = (prefix, funicode(c_ns.href)) - if self._event_filter & ITERPARSE_FILTER_START_NS: - self._append_event(("start-ns", ns_tuple)) - ns_tuples.append(ns_tuple) + self._append_event(("start-ns", ns_tuple)) c_ns = c_ns.next - ns_tuples.reverse() - else: - ns_tuples = None if self._doc is None: self._doc = _documentFactory(c_node.doc, None) - node = _elementFactory(self._doc, c_node) - if self._root is None: - self._root = node - self._append_node((node, ns_tuples)) - if self._event_filter & ITERPARSE_FILTER_START: - if (self._tag_name is NULL and self._tag_href is NULL) or \ - _tagMatches(c_node, self._tag_href, self._tag_name): + self._root = self._doc.getroot() + if self._tag_tuple is None or \ + _tagMatches(c_node, self._tag_href, self._tag_name): + node = _elementFactory(self._doc, c_node) + if self._event_filter & ITERPARSE_FILTER_END: + self._append_node(node) + if self._event_filter & ITERPARSE_FILTER_START: self._append_event(("start", node)) cdef void endNode(self, xmlNode* c_node): cdef _Element node - node, ns_tuples = self._pop_node() - assert node._c_node is c_node + cdef xmlNs* c_ns if self._event_filter & ITERPARSE_FILTER_END: - if (self._tag_name is NULL and self._tag_href is NULL) or \ + if self._tag_tuple is None or \ _tagMatches(c_node, self._tag_href, self._tag_name): + node = self._pop_node() + assert node._c_node is c_node self._append_event(("end", node)) if self._event_filter & ITERPARSE_FILTER_END_NS: - for ns_tuple in ns_tuples: - self._append_event(("end-ns", None)) # ns_tuple)) + c_ns = c_node.nsDef + event = ("end-ns", None) + while c_ns is not NULL: + self._append_event(event) + c_ns = c_ns.next cdef void _pushSaxStartEvent(xmlparser.xmlParserCtxt* c_ctxt, xmlNode* c_node): cdef _IterparseResolverContext context From scoder at codespeak.net Thu Jun 22 14:53:47 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 14:53:47 +0200 (CEST) Subject: [Lxml-checkins] r29135 - lxml/branch/iterparse/src/lxml Message-ID: <20060622125347.49CB110060@code0.codespeak.net> Author: scoder Date: Thu Jun 22 14:53:46 2006 New Revision: 29135 Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi Log: only override SAX event callbacks when we actually need to Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Thu Jun 22 14:53:46 2006 @@ -37,9 +37,18 @@ cdef void _wrapCallbacks(self, xmlparser.xmlSAXHandler* sax): "wrap original SAX2 callbacks" self._origSaxStart = sax.startElementNs - sax.startElementNs = _saxStart + # only override start event handler if needed + if self._event_filter == 0 or \ + self._event_filter & \ + (ITERPARSE_FILTER_START | ITERPARSE_FILTER_START_NS): + sax.startElementNs = _saxStart + self._origSaxEnd = sax.endElementNs - sax.endElementNs = _saxEnd + # only override end event handler if needed + if self._event_filter == 0 or \ + self._event_filter & \ + (ITERPARSE_FILTER_END | ITERPARSE_FILTER_END_NS): + sax.endElementNs = _saxEnd cdef void _setEventFilter(self, events, tag): self._event_filter = 0 @@ -99,8 +108,15 @@ if self._event_filter & ITERPARSE_FILTER_END: if self._tag_tuple is None or \ _tagMatches(c_node, self._tag_href, self._tag_name): - node = self._pop_node() - assert node._c_node is c_node + if self._event_filter & \ + (ITERPARSE_FILTER_START | ITERPARSE_FILTER_START_NS): + node = self._pop_node() + assert node._c_node is c_node + else: + if self._doc is None: + self._doc = _documentFactory(c_node.doc, None) + self._root = self._doc.getroot() + node = _elementFactory(self._doc, c_node) self._append_event(("end", node)) if self._event_filter & ITERPARSE_FILTER_END_NS: @@ -186,8 +202,8 @@ _BaseParser.__init__(self) context = <_IterparseResolverContext>self._context - context._wrapCallbacks(self._parser_ctxt.sax) context._setEventFilter(events, tag) + context._wrapCallbacks(self._parser_ctxt.sax) xmlparser.xmlCtxtResetPush(self._parser_ctxt, NULL, 0, c_filename, NULL) def __iter__(self): From scoder at codespeak.net Thu Jun 22 14:54:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 14:54:56 +0200 (CEST) Subject: [Lxml-checkins] r29136 - lxml/branch/iterparse/src/lxml/tests Message-ID: <20060622125456.622D210060@code0.codespeak.net> Author: scoder Date: Thu Jun 22 14:54:55 2006 New Revision: 29136 Modified: lxml/branch/iterparse/src/lxml/tests/test_elementtree.py Log: test case for iterparse() with namespaces and adding namespaced attribute Modified: lxml/branch/iterparse/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/branch/iterparse/src/lxml/tests/test_elementtree.py (original) +++ lxml/branch/iterparse/src/lxml/tests/test_elementtree.py Thu Jun 22 14:54:55 2006 @@ -1803,6 +1803,32 @@ self.assertEquals(0, len(root)) + def test_iterparse_attrib_ns(self): + iterparse = self.etree.iterparse + f = StringIO('') + + attr_name = '{testns}bla' + events = [] + iterator = iterparse(f, events=('start','end','start-ns','end-ns')) + for event, elem in iterator: + events.append(event) + if event == 'start': + if elem.tag != '{ns1}a': + elem.set(attr_name, 'value') + + self.assertEquals( + ['start-ns', 'start', 'start', 'start-ns', 'start', + 'end', 'end-ns', 'end', 'end', 'end-ns'], + events) + + root = iterator.root + self.assertEquals( + None, + root.get(attr_name)) + self.assertEquals( + 'value', + root[0].get(attr_name)) + def test_iterparse_getiterator(self): iterparse = self.etree.iterparse f = StringIO('') From scoder at codespeak.net Thu Jun 22 15:34:23 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 15:34:23 +0200 (CEST) Subject: [Lxml-checkins] r29141 - lxml/branch/iterparse/src/lxml Message-ID: <20060622133423.9079D10064@code0.codespeak.net> Author: scoder Date: Thu Jun 22 15:34:22 2006 New Revision: 29141 Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi Log: more small cleanups in iterparse() Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Thu Jun 22 15:34:22 2006 @@ -1,6 +1,6 @@ # iterparse -- incremental parsing -cdef int __ITERPARSE_CHUNK_SIZE +cdef object __ITERPARSE_CHUNK_SIZE __ITERPARSE_CHUNK_SIZE = 16384 ctypedef enum IterparseEventFilter: @@ -18,8 +18,7 @@ cdef object _events cdef int _event_index cdef object _append_event - cdef object _node_stack - cdef object _append_node + cdef object _push_node cdef object _pop_node cdef object _tag_tuple cdef char* _tag_href @@ -27,9 +26,9 @@ def __init__(self, *args): _ResolverContext.__init__(self, *args) - self._node_stack = [] - self._append_node = self._node_stack.append - self._pop_node = self._node_stack.pop + node_stack = [] + self._push_node = node_stack.append + self._pop_node = node_stack.pop self._events = [] self._append_event = self._events.append self._event_index = 0 @@ -43,12 +42,12 @@ (ITERPARSE_FILTER_START | ITERPARSE_FILTER_START_NS): sax.startElementNs = _saxStart - self._origSaxEnd = sax.endElementNs + self._origSaxEnd = sax.endElementNs # only override end event handler if needed if self._event_filter == 0 or \ self._event_filter & \ (ITERPARSE_FILTER_END | ITERPARSE_FILTER_END_NS): - sax.endElementNs = _saxEnd + sax.endElementNs = _saxEnd cdef void _setEventFilter(self, events, tag): self._event_filter = 0 @@ -98,7 +97,7 @@ _tagMatches(c_node, self._tag_href, self._tag_name): node = _elementFactory(self._doc, c_node) if self._event_filter & ITERPARSE_FILTER_END: - self._append_node(node) + self._push_node(node) if self._event_filter & ITERPARSE_FILTER_START: self._append_event(("start", node)) @@ -223,7 +222,7 @@ del context._events[:] error = 0 - while error == 0 and python.PyList_GET_SIZE(context._events) == 0: + while python.PyList_GET_SIZE(context._events) == 0 and error == 0: data = self._source.read(__ITERPARSE_CHUNK_SIZE) if not python.PyString_Check(data): #xmlparser.xmlParseChunk(self._parser_ctxt, NULL, 0, 1) From scoder at codespeak.net Thu Jun 22 19:15:23 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 19:15:23 +0200 (CEST) Subject: [Lxml-checkins] r29157 - lxml/branch/iterparse/doc Message-ID: <20060622171523.A1C2910070@code0.codespeak.net> Author: scoder Date: Thu Jun 22 19:15:22 2006 New Revision: 29157 Modified: lxml/branch/iterparse/doc/performance.txt Log: TOC in performance.txt Modified: lxml/branch/iterparse/doc/performance.txt ============================================================================== --- lxml/branch/iterparse/doc/performance.txt (original) +++ lxml/branch/iterparse/doc/performance.txt Thu Jun 22 19:15:22 2006 @@ -1,4 +1,4 @@ -Benchmarks and speed +Benchmarks and Speed ==================== As an XML library, lxml.etree is very fast. It is also slow. As with all @@ -30,6 +30,14 @@ small tree, slightly broader than deep. Most benchmarks run in a loop over all children of the tree root. +.. contents:: +.. + 1 Bad things first + 2 Parsing and Serialising + 3 The ElementTree API + 4 Tree traversal + 5 XPath + Bad things first ---------------- From scoder at codespeak.net Thu Jun 22 21:14:39 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Thu, 22 Jun 2006 21:14:39 +0200 (CEST) Subject: [Lxml-checkins] r29172 - lxml/trunk Message-ID: <20060622191439.7001110060@code0.codespeak.net> Author: scoder Date: Thu Jun 22 21:14:38 2006 New Revision: 29172 Modified: lxml/trunk/CREDITS.txt Log: updated CHANGES.txt for Andreas Modified: lxml/trunk/CREDITS.txt ============================================================================== --- lxml/trunk/CREDITS.txt (original) +++ lxml/trunk/CREDITS.txt Thu Jun 22 21:14:38 2006 @@ -28,11 +28,13 @@ Trent Mick - setup.py patch +Andreas Pakulat - rpath linking support, doc improvements + Steve Howe - Windows builds David Sankel - building statically on Windows -Noah Slater - lots of bug squeezing +Noah Slater - bug squeezing Duncan Booth - bugfixing From scoder at codespeak.net Fri Jun 23 08:23:02 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 08:23:02 +0200 (CEST) Subject: [Lxml-checkins] r29190 - in lxml/trunk: . src/lxml Message-ID: <20060623062302.7431610063@code0.codespeak.net> Author: scoder Date: Fri Jun 23 08:22:58 2006 New Revision: 29190 Modified: lxml/trunk/CHANGES.txt lxml/trunk/src/lxml/python.pxd Log: handle exceptions in Python API list functions Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 23 08:22:58 2006 @@ -38,6 +38,8 @@ Bugs fixed ---------- +* Rare exceptions in Python list functions were not handled + * Parsing accepted unicode strings with XML encoding declaration in certain cases Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Fri Jun 23 08:22:58 2006 @@ -30,16 +30,16 @@ cdef object PyNumber_Int(object value) cdef Py_ssize_t PyList_GET_SIZE(object l) - cdef int PyList_Append(object l, object obj) - cdef int PyList_Reverse(object l) - cdef int PyList_Insert(object l, Py_ssize_t index, object o) + cdef int PyList_Append(object l, object obj) except -1 + cdef int PyList_Reverse(object l) except -1 + cdef int PyList_Insert(object l, Py_ssize_t index, object o) except -1 cdef object PyList_GET_ITEM(object l, Py_ssize_t index) - cdef int PyDict_SetItemString(object d, char* key, object value) - cdef int PyDict_SetItem(object d, object key, object value) + cdef int PyDict_SetItemString(object d, char* key, object value) except -1 + cdef int PyDict_SetItem(object d, object key, object value) except -1 cdef PyObject* PyDict_GetItemString(object d, char* key) cdef PyObject* PyDict_GetItem(object d, object key) - cdef int PyDict_DelItem(object d, object key) - cdef int PyDict_Clear(object d) + cdef int PyDict_DelItem(object d, object key) except -1 + cdef void PyDict_Clear(object d) cdef object PyDict_Copy(object d) cdef Py_ssize_t PyDict_Size(object d) cdef object PyList_AsTuple(object o) From scoder at codespeak.net Fri Jun 23 08:23:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 08:23:56 +0200 (CEST) Subject: [Lxml-checkins] r29191 - in lxml/branch/lxml-1.0: . src/lxml Message-ID: <20060623062356.052B810063@code0.codespeak.net> Author: scoder Date: Fri Jun 23 08:23:52 2006 New Revision: 29191 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/src/lxml/python.pxd Log: merge from trunk: handle exceptions in Python API list functions Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Fri Jun 23 08:23:52 2006 @@ -10,6 +10,8 @@ Bugs fixed ---------- +* Rare exceptions in Python list functions were not handled + * Parsing accepted unicode strings with XML encoding declaration in certain cases Modified: lxml/branch/lxml-1.0/src/lxml/python.pxd ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/python.pxd (original) +++ lxml/branch/lxml-1.0/src/lxml/python.pxd Fri Jun 23 08:23:52 2006 @@ -29,16 +29,16 @@ cdef object PyNumber_Int(object value) cdef Py_ssize_t PyList_GET_SIZE(object l) - cdef int PyList_Append(object l, object obj) - cdef int PyList_Reverse(object l) - cdef int PyList_Insert(object l, Py_ssize_t index, object o) + cdef int PyList_Append(object l, object obj) except -1 + cdef int PyList_Reverse(object l) except -1 + cdef int PyList_Insert(object l, Py_ssize_t index, object o) except -1 cdef object PyList_GET_ITEM(object l, Py_ssize_t index) - cdef int PyDict_SetItemString(object d, char* key, object value) - cdef int PyDict_SetItem(object d, object key, object value) + cdef int PyDict_SetItemString(object d, char* key, object value) except -1 + cdef int PyDict_SetItem(object d, object key, object value) except -1 cdef PyObject* PyDict_GetItemString(object d, char* key) cdef PyObject* PyDict_GetItem(object d, object key) - cdef int PyDict_DelItem(object d, object key) - cdef int PyDict_Clear(object d) + cdef int PyDict_DelItem(object d, object key) except -1 + cdef void PyDict_Clear(object d) cdef Py_ssize_t PyDict_Size(object d) cdef object PyList_AsTuple(object o) cdef object PySequence_List(object o) From scoder at codespeak.net Fri Jun 23 08:24:54 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 08:24:54 +0200 (CEST) Subject: [Lxml-checkins] r29192 - in lxml/branch/iterparse: . src/lxml Message-ID: <20060623062454.215E210063@code0.codespeak.net> Author: scoder Date: Fri Jun 23 08:24:50 2006 New Revision: 29192 Modified: lxml/branch/iterparse/CHANGES.txt lxml/branch/iterparse/src/lxml/python.pxd Log: merge from trunk: handle exceptions in Python API list functions Modified: lxml/branch/iterparse/CHANGES.txt ============================================================================== --- lxml/branch/iterparse/CHANGES.txt (original) +++ lxml/branch/iterparse/CHANGES.txt Fri Jun 23 08:24:50 2006 @@ -40,6 +40,8 @@ Bugs fixed ---------- +* Rare exceptions in Python list functions were not handled + * Parsing accepted unicode strings with XML encoding declaration in certain cases Modified: lxml/branch/iterparse/src/lxml/python.pxd ============================================================================== --- lxml/branch/iterparse/src/lxml/python.pxd (original) +++ lxml/branch/iterparse/src/lxml/python.pxd Fri Jun 23 08:24:50 2006 @@ -30,16 +30,16 @@ cdef object PyNumber_Int(object value) cdef Py_ssize_t PyList_GET_SIZE(object l) - cdef int PyList_Append(object l, object obj) - cdef int PyList_Reverse(object l) - cdef int PyList_Insert(object l, Py_ssize_t index, object o) + cdef int PyList_Append(object l, object obj) except -1 + cdef int PyList_Reverse(object l) except -1 + cdef int PyList_Insert(object l, Py_ssize_t index, object o) except -1 cdef object PyList_GET_ITEM(object l, Py_ssize_t index) - cdef int PyDict_SetItemString(object d, char* key, object value) - cdef int PyDict_SetItem(object d, object key, object value) + cdef int PyDict_SetItemString(object d, char* key, object value) except -1 + cdef int PyDict_SetItem(object d, object key, object value) except -1 cdef PyObject* PyDict_GetItemString(object d, char* key) cdef PyObject* PyDict_GetItem(object d, object key) - cdef int PyDict_DelItem(object d, object key) - cdef int PyDict_Clear(object d) + cdef int PyDict_DelItem(object d, object key) except -1 + cdef void PyDict_Clear(object d) cdef object PyDict_Copy(object d) cdef Py_ssize_t PyDict_Size(object d) cdef object PyList_AsTuple(object o) From scoder at codespeak.net Fri Jun 23 11:09:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 11:09:38 +0200 (CEST) Subject: [Lxml-checkins] r29202 - lxml/trunk/doc Message-ID: <20060623090938.36AF010072@code0.codespeak.net> Author: scoder Date: Fri Jun 23 11:09:36 2006 New Revision: 29202 Modified: lxml/trunk/doc/api.txt Log: api.txt: el.iterancestors() and el.iterdescendants() Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Fri Jun 23 11:09:36 2006 @@ -53,6 +53,7 @@ >>> b = etree.SubElement(root, "b") >>> c = etree.SubElement(root, "c") >>> d = etree.SubElement(root, "d") + >>> e = etree.SubElement(d, "e") >>> b.getparent() == root True >>> print b.getnext().tag @@ -60,12 +61,17 @@ >>> print c.getprevious().tag b -You can also iterate over the siblings of an element:: +You can also iterate over the siblings, ancestors and descendants of an +element, as defined by the respective XPath axes:: >>> [ el.tag for el in a.itersiblings() ] ['b', 'c', 'd'] >>> [ el.tag for el in c.itersiblings(preceding=True) ] ['b', 'a'] + >>> [ el.tag for el in e.iterancestors() ] + ['d', 'root'] + >>> [ el.tag for el in root.iterdescendants() ] + ['a', 'b', 'c', 'd', 'e'] Elements always live within a document context in lxml. This implies that there is also a notion of an absolute document root. You can retrieve an @@ -82,7 +88,7 @@ >>> print tree.getroot().tag d >>> print etree.tostring(tree) - + All operations that you run on such an ElementTree (like XPath, XSLT, etc.) will understand the explicitly chosen root as root node of a document. They From scoder at codespeak.net Fri Jun 23 11:10:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 11:10:08 +0200 (CEST) Subject: [Lxml-checkins] r29203 - lxml/branch/iterparse/doc Message-ID: <20060623091008.A1A2C10076@code0.codespeak.net> Author: scoder Date: Fri Jun 23 11:10:07 2006 New Revision: 29203 Modified: lxml/branch/iterparse/doc/api.txt Log: merged in doc updates from trunk Modified: lxml/branch/iterparse/doc/api.txt ============================================================================== --- lxml/branch/iterparse/doc/api.txt (original) +++ lxml/branch/iterparse/doc/api.txt Fri Jun 23 11:10:07 2006 @@ -53,6 +53,7 @@ >>> b = etree.SubElement(root, "b") >>> c = etree.SubElement(root, "c") >>> d = etree.SubElement(root, "d") + >>> e = etree.SubElement(d, "e") >>> b.getparent() == root True >>> print b.getnext().tag @@ -60,12 +61,17 @@ >>> print c.getprevious().tag b -You can also iterate over the siblings of an element:: +You can also iterate over the siblings, ancestors and descendants of an +element, as defined by the respective XPath axes:: >>> [ el.tag for el in a.itersiblings() ] ['b', 'c', 'd'] >>> [ el.tag for el in c.itersiblings(preceding=True) ] ['b', 'a'] + >>> [ el.tag for el in e.iterancestors() ] + ['d', 'root'] + >>> [ el.tag for el in root.iterdescendants() ] + ['a', 'b', 'c', 'd', 'e'] Elements always live within a document context in lxml. This implies that there is also a notion of an absolute document root. You can retrieve an @@ -82,7 +88,7 @@ >>> print tree.getroot().tag d >>> print etree.tostring(tree) - + All operations that you run on such an ElementTree (like XPath, XSLT, etc.) will understand the explicitly chosen root as root node of a document. They From scoder at codespeak.net Fri Jun 23 11:56:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 11:56:41 +0200 (CEST) Subject: [Lxml-checkins] r29206 - in lxml/branch/iterparse: . doc src/lxml src/lxml/tests Message-ID: <20060623095641.039BF10072@code0.codespeak.net> Author: scoder Date: Fri Jun 23 11:56:36 2006 New Revision: 29206 Modified: lxml/branch/iterparse/CHANGES.txt lxml/branch/iterparse/doc/api.txt lxml/branch/iterparse/src/lxml/iterparse.pxi lxml/branch/iterparse/src/lxml/python.pxd lxml/branch/iterparse/src/lxml/tests/test_etree.py Log: iterwalk() module level function, doctests for iterwalk() and iterparse() Modified: lxml/branch/iterparse/CHANGES.txt ============================================================================== --- lxml/branch/iterparse/CHANGES.txt (original) +++ lxml/branch/iterparse/CHANGES.txt Fri Jun 23 11:56:36 2006 @@ -7,7 +7,9 @@ Features added -------------- -* ElementTree compatible iterparse() module function +* Module level ``iterwalk()`` function as 'iterparse' for trees + +* ElementTree compatible ``iterparse()`` module function * Element.nsmap property returns a mapping of all namespace prefixes known at the Element to their namespace URI Modified: lxml/branch/iterparse/doc/api.txt ============================================================================== --- lxml/branch/iterparse/doc/api.txt (original) +++ lxml/branch/iterparse/doc/api.txt Fri Jun 23 11:56:36 2006 @@ -7,18 +7,18 @@ .. contents:: .. - 1 lxml.etree - 2 Trees and Documents - 3 Parsers - 4 Error handling on exceptions - 5 Python unicode strings - 6 XPath - 7 XSLT - 8 RelaxNG - 9 XMLSchema - 10 xinclude - 11 write_c14n on ElementTree - + 1 lxml.etree + 2 Trees and Documents + 3 Parsers + 4 iterparse and iterwalk + 5 Error handling on exceptions + 6 Python unicode strings + 7 XPath + 8 XSLT + 9 RelaxNG + 10 XMLSchema + 11 xinclude + 12 write_c14n on ElementTree lxml.etree ---------- @@ -171,6 +171,114 @@ ascii +iterparse and iterwalk +---------------------- + +As known from ElementTree, the ``iterparse()`` utility function returns an +iterator that generates parser events for an XML file (or file-like object), +while building the tree. The values are tuples ``(event-type, object)``. The +event types are 'start', 'end', 'start-ns' and 'end-ns'. + +The 'start' and 'end' events represent opening and closing elements and are +accompanied by the respective element. By default, only 'end' events are +generated:: + + >>> xml = '''\ + ... + ... text + ... texttail + ... + ... + ... ''' + + >>> context = etree.iterparse(StringIO(xml)) + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end {testns}empty-element + end root + +The resulting tree is available through the ``root`` property of the iterator:: + + >>> context.root.tag + 'root' + +The other types can be activated with the ``events`` keyword argument:: + + >>> events = ("start", "end") + >>> context = etree.iterparse(StringIO(xml), events=events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start {testns}empty-element + end {testns}empty-element + end root + +You can modify the element and its descendants when handling the 'end' event. +To save memory, for example, you can remove subtrees that are no longer +needed:: + + >>> context = etree.iterparse(StringIO(xml)) + >>> for action, elem in context: + ... print len(elem), + ... elem.clear() + 0 0 0 3 + >>> context.root.getchildren() + [] + +During the 'start' event, the descendants and following siblings are not yet +available. Note that you should not modify or move the ancestors or siblings +of the element during either of the two events. You should also avoid moving +the element itself. + +The 'start-ns' and 'end-ns' events notify about namespace declarations and +generate tuples ``(prefix, URI)``:: + + >>> events = ("start-ns", "end-ns") + >>> context = etree.iterparse(StringIO(xml), events=events) + >>> for action, obj in context: + ... print action, obj + start-ns ('', 'testns') + end-ns None + +It is common practice to use a list as namespace stack and pop the last entry +on the 'end-ns' event. + +lxml.etree supports two extensions compared to ElementTree. It accepts a +``tag`` keyword argument just like ``element.getiterator(tag)``. This +restricts events to a specific tag or namespace. + + >>> context = etree.iterparse(StringIO(xml), tag="element") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + + >>> events = ("start", "end") + >>> context = etree.iterparse(StringIO(xml), events=events, tag="{testns}*") + >>> for action, elem in context: + ... print action, elem.tag + start {testns}empty-element + end {testns}empty-element + +The second extension is the ``iterwalk()`` function. It behaves exactly like +``iterparse()``, but works on Elements and ElementTrees:: + + >>> root = context.root + >>> context = etree.iterwalk(root, events=events, tag="element") + >>> for action, elem in context: + ... print action, elem.tag + start element + end element + start element + end element + + Error handling on exceptions ---------------------------- Modified: lxml/branch/iterparse/src/lxml/iterparse.pxi ============================================================================== --- lxml/branch/iterparse/src/lxml/iterparse.pxi (original) +++ lxml/branch/iterparse/src/lxml/iterparse.pxi Fri Jun 23 11:56:36 2006 @@ -9,16 +9,62 @@ ITERPARSE_FILTER_START_NS = 4 ITERPARSE_FILTER_END_NS = 8 +cdef int _buildIterparseEventFilter(events): + cdef int event_filter + event_filter = 0 + if 'start' in events: + event_filter = event_filter | ITERPARSE_FILTER_START + if 'end' in events: + event_filter = event_filter | ITERPARSE_FILTER_END + if 'start-ns' in events: + event_filter = event_filter | ITERPARSE_FILTER_START_NS + if 'end-ns' in events: + event_filter = event_filter | ITERPARSE_FILTER_END_NS + return event_filter + +cdef int _countNsDefs(xmlNode* c_node): + cdef xmlNs* c_ns + cdef int count + count = 0 + c_ns = c_node.nsDef + while c_ns is not NULL: + count = count + 1 + c_ns = c_ns.next + return count + +cdef int _appendStartNsEvents(xmlNode* c_node, event_list): + cdef xmlNs* c_ns + cdef int count + count = 0 + c_ns = c_node.nsDef + while c_ns is not NULL: + if c_ns.prefix is NULL: + prefix = '' + else: + prefix = funicode(c_ns.prefix) + ns_tuple = (prefix, funicode(c_ns.href)) + python.PyList_Append(event_list, ("start-ns", ns_tuple)) + count = count + 1 + c_ns = c_ns.next + return count + +cdef void _appendEndNsEvents(xmlNode* c_node, event_list): + cdef xmlNs* c_ns + c_ns = c_node.nsDef + event = ("end-ns", None) + while c_ns is not NULL: + python.PyList_Append(event_list, event) + c_ns = c_ns.next + cdef class _IterparseResolverContext(_ResolverContext): cdef xmlparser.startElementNsSAX2Func _origSaxStart cdef xmlparser.endElementNsSAX2Func _origSaxEnd cdef _Element _root cdef _Document _doc - cdef object _event_filter + cdef int _event_filter cdef object _events cdef int _event_index - cdef object _append_event - cdef object _push_node + cdef object _node_stack cdef object _pop_node cdef object _tag_tuple cdef char* _tag_href @@ -26,11 +72,9 @@ def __init__(self, *args): _ResolverContext.__init__(self, *args) - node_stack = [] - self._push_node = node_stack.append - self._pop_node = node_stack.pop + self._node_stack = [] + self._pop_node = self._node_stack.pop self._events = [] - self._append_event = self._events.append self._event_index = 0 cdef void _wrapCallbacks(self, xmlparser.xmlSAXHandler* sax): @@ -50,16 +94,7 @@ sax.endElementNs = _saxEnd cdef void _setEventFilter(self, events, tag): - self._event_filter = 0 - if 'start' in events: - self._event_filter = self._event_filter | ITERPARSE_FILTER_START - if 'end' in events: - self._event_filter = self._event_filter | ITERPARSE_FILTER_END - if 'start-ns' in events: - self._event_filter = self._event_filter | ITERPARSE_FILTER_START_NS - if 'end-ns' in events: - self._event_filter = self._event_filter | ITERPARSE_FILTER_END_NS - + self._event_filter = _buildIterparseEventFilter(events) if tag is None or tag == '*': self._tag_href = NULL self._tag_name = NULL @@ -81,15 +116,7 @@ cdef xmlNs* c_ns cdef _Element node if self._event_filter & ITERPARSE_FILTER_START_NS: - c_ns = c_node.nsDef - while c_ns is not NULL: - if c_ns.prefix is NULL: - prefix = '' - else: - prefix = funicode(c_ns.prefix) - ns_tuple = (prefix, funicode(c_ns.href)) - self._append_event(("start-ns", ns_tuple)) - c_ns = c_ns.next + _appendStartNsEvents(c_node, self._events) if self._doc is None: self._doc = _documentFactory(c_node.doc, None) self._root = self._doc.getroot() @@ -97,9 +124,9 @@ _tagMatches(c_node, self._tag_href, self._tag_name): node = _elementFactory(self._doc, c_node) if self._event_filter & ITERPARSE_FILTER_END: - self._push_node(node) + python.PyList_Append(self._node_stack, node) if self._event_filter & ITERPARSE_FILTER_START: - self._append_event(("start", node)) + python.PyList_Append(self._events, ("start", node)) cdef void endNode(self, xmlNode* c_node): cdef _Element node @@ -116,14 +143,10 @@ self._doc = _documentFactory(c_node.doc, None) self._root = self._doc.getroot() node = _elementFactory(self._doc, c_node) - self._append_event(("end", node)) + python.PyList_Append(self._events, ("end", node)) if self._event_filter & ITERPARSE_FILTER_END_NS: - c_ns = c_node.nsDef - event = ("end-ns", None) - while c_ns is not NULL: - self._append_event(event) - c_ns = c_ns.next + _appendEndNsEvents(c_node, self._events) cdef void _pushSaxStartEvent(xmlparser.xmlParserCtxt* c_ctxt, xmlNode* c_node): cdef _IterparseResolverContext context @@ -249,3 +272,122 @@ context._event_index = 1 return python.PyList_GET_ITEM(context._events, 0) + + +cdef class iterwalk: + """A tree walker that generates ``iterparse()`` events from an existing + tree as if it was parsing XML data. + """ + cdef object _node_stack + cdef object _pop_node + cdef int _index + cdef object _events + cdef object _pop_event + cdef int _event_filter + cdef object _tag_tuple + cdef char* _tag_href + cdef char* _tag_name + + def __init__(self, element_or_tree, events=("end",), tag=None): + cdef _NodeBase root + cdef int ns_count + root = _rootNodeOrRaise(element_or_tree) + self._event_filter = _buildIterparseEventFilter(events) + self._setTagFilter(tag) + self._node_stack = [] + self._pop_node = self._node_stack.pop + self._events = [] + self._pop_event = self._events.pop + + if self._event_filter != 0: + self._index = 0 + ns_count = self._start_node(root) + python.PyList_Append(self._node_stack, (root, ns_count)) + else: + self._index = -1 + + cdef void _setTagFilter(self, tag): + if tag is None or tag == '*': + self._tag_href = NULL + self._tag_name = NULL + else: + self._tag_tuple = _getNsTag(tag) + href, name = self._tag_tuple + if href is None or href == '*': + self._tag_href = NULL + else: + self._tag_href = _cstr(href) + if name is None or name == '*': + self._tag_name = NULL + else: + self._tag_name = _cstr(name) + if self._tag_href is NULL and self._tag_name is NULL: + self._tag_tuple = None + + def __iter__(self): + return self + + def __next__(self): + cdef _NodeBase node + cdef _NodeBase next_node + cdef int ns_count + if python.PyList_GET_SIZE(self._events): + return self._pop_event(0) + ns_count = 0 + # find next node + while self._index >= 0: + node_tuple = python.PyList_GET_ITEM(self._node_stack, self._index) + python.Py_INCREF(node_tuple) # fix borrowed reference for Pyrex! + node = python.PyTuple_GET_ITEM(node_tuple, 0) + python.Py_INCREF(node) # fix borrowed reference for Pyrex! + if node: + # try children + next_node = node[0] + else: + # back off + next_node = None + while next_node is None: + # back off through parents + self._index = self._index - 1 + node = self._end_node() + if self._index < 0: + break + next_node = node.getnext() + if next_node is not None: + if self._event_filter & (ITERPARSE_FILTER_START | \ + ITERPARSE_FILTER_START_NS): + ns_count = self._start_node(next_node) + elif self._event_filter & ITERPARSE_FILTER_END_NS: + ns_count = _countNsDefs(next_node._c_node) + python.PyList_Append(self._node_stack, (next_node, ns_count)) + self._index = self._index + 1 + if python.PyList_GET_SIZE(self._events): + return self._pop_event(0) + raise StopIteration + + cdef int _start_node(self, _NodeBase node): + cdef int ns_count + if self._event_filter & ITERPARSE_FILTER_START_NS: + ns_count = _appendStartNsEvents(node._c_node, self._events) + elif self._event_filter & ITERPARSE_FILTER_END_NS: + ns_count = _countNsDefs(node._c_node) + else: + ns_count = 0 + if self._event_filter & ITERPARSE_FILTER_START: + if self._tag_tuple is None or \ + _tagMatches(node._c_node, self._tag_href, self._tag_name): + python.PyList_Append(self._events, ("start", node)) + return ns_count + + cdef _NodeBase _end_node(self): + cdef _NodeBase node + node, ns_count = self._pop_node() + if self._event_filter & ITERPARSE_FILTER_END: + if self._tag_tuple is None or \ + _tagMatches(node._c_node, self._tag_href, self._tag_name): + python.PyList_Append(self._events, ("end", node)) + if self._event_filter & ITERPARSE_FILTER_END_NS: + event = ("end-ns", None) + for i from 0 <= i < ns_count: + python.PyList_Append(self._events, event) + return node Modified: lxml/branch/iterparse/src/lxml/python.pxd ============================================================================== --- lxml/branch/iterparse/src/lxml/python.pxd (original) +++ lxml/branch/iterparse/src/lxml/python.pxd Fri Jun 23 11:56:36 2006 @@ -6,7 +6,9 @@ ctypedef int size_t ctypedef int Py_ssize_t cdef int INT_MAX - + + cdef void Py_INCREF(object o) + cdef FILE* PyFile_AsFile(object p) cdef int PyFile_Check(object p) cdef object PyFile_Name(object p) Modified: lxml/branch/iterparse/src/lxml/tests/test_etree.py ============================================================================== --- lxml/branch/iterparse/src/lxml/tests/test_etree.py (original) +++ lxml/branch/iterparse/src/lxml/tests/test_etree.py Fri Jun 23 11:56:36 2006 @@ -101,6 +101,103 @@ 8, len(events)) + def test_iterwalk_tag(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, tag="b", events=('start', 'end')) + events = list(iterator) + self.assertEquals( + [('start', root[0]), ('end', root[0])], + events) + + def test_iterwalk_tag_all(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, tag="*", events=('start', 'end')) + events = list(iterator) + self.assertEquals( + 8, + len(events)) + + def test_iterwalk(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + events = list(iterwalk(root)) + self.assertEquals( + [('end', root[0]), ('end', root[1]), ('end', root)], + events) + + def test_iterwalk_start(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, events=('start',)) + events = list(iterator) + self.assertEquals( + [('start', root), ('start', root[0]), ('start', root[1])], + events) + + def test_iterwalk_start_end(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, events=('start','end')) + events = list(iterator) + self.assertEquals( + [('start', root), ('start', root[0]), ('end', root[0]), + ('start', root[1]), ('end', root[1]), ('end', root)], + events) + + def test_iterwalk_clear(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root) + for event, elem in iterator: + elem.clear() + + self.assertEquals(0, + len(root)) + + def test_iterwalk_attrib_ns(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + attr_name = '{testns}bla' + events = [] + iterator = iterwalk(root, events=('start','end','start-ns','end-ns')) + for event, elem in iterator: + events.append(event) + if event == 'start': + if elem.tag != '{ns1}a': + elem.set(attr_name, 'value') + + self.assertEquals( + ['start-ns', 'start', 'start', 'start-ns', 'start', + 'end', 'end-ns', 'end', 'end', 'end-ns'], + events) + + self.assertEquals( + None, + root.get(attr_name)) + self.assertEquals( + 'value', + root[0].get(attr_name)) + + def test_iterwalk_getiterator(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + counts = [] + for event, elem in iterwalk(root): + counts.append(len(list(elem.getiterator()))) + self.assertEquals( + [1,2,1,4], + counts) + def test_resolve_string_dtd(self): parse = self.etree.parse parser = self.etree.XMLParser(dtd_validation=True) From scoder at codespeak.net Fri Jun 23 12:01:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 12:01:38 +0200 (CEST) Subject: [Lxml-checkins] r29208 - in lxml/trunk: . doc src/lxml src/lxml/tests Message-ID: <20060623100138.97B5E10071@code0.codespeak.net> Author: scoder Date: Fri Jun 23 12:01:34 2006 New Revision: 29208 Added: lxml/trunk/src/lxml/iterparse.pxi - copied unchanged from r29207, lxml/branch/iterparse/src/lxml/iterparse.pxi Modified: lxml/trunk/CHANGES.txt lxml/trunk/bench.py lxml/trunk/doc/api.txt lxml/trunk/doc/compatibility.txt lxml/trunk/doc/performance.txt lxml/trunk/selftest.py lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/parser.pxi lxml/trunk/src/lxml/python.pxd lxml/trunk/src/lxml/tests/test_elementtree.py lxml/trunk/src/lxml/tests/test_etree.py lxml/trunk/src/lxml/xmlparser.pxd Log: merge of iterparse branch: iterparse and iterwalk functions Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 23 12:01:34 2006 @@ -7,6 +7,10 @@ Features added -------------- +* Module level ``iterwalk()`` function as 'iterparse' for trees + +* ElementTree compatible ``iterparse()`` module function + * Element.nsmap property returns a mapping of all namespace prefixes known at the Element to their namespace URI Modified: lxml/trunk/bench.py ============================================================================== --- lxml/trunk/bench.py (original) +++ lxml/trunk/bench.py Fri Jun 23 12:01:34 2006 @@ -14,14 +14,15 @@ 'bla3' : _TEXT } -def with_attributes(use_attributes): +def with_attributes(*use_attributes): "Decorator for benchmarks that use attributes" - value = {False : 0, True : 1}[ bool(use_attributes) ] + vmap = {False : 0, True : 1} + values = [ vmap[bool(v)] for v in use_attributes ] def set_value(function): try: - function.ATTRIBUTES.add(value) + function.ATTRIBUTES.update(values) except AttributeError: - function.ATTRIBUTES = set([value]) + function.ATTRIBUTES = set(values) return function return set_value @@ -43,12 +44,18 @@ return set_value def onlylib(*libs): + "Decorator to restrict benchmarks to specific libraries" def set_libs(function): if libs: function.LIBS = libs return function return set_libs +def serialized(function): + "Decorator for benchmarks that require serialized XML data" + function.STRING = True + return function + class SkippedTest(Exception): pass @@ -72,9 +79,13 @@ deepcopy = copy.deepcopy def set_property(root, fname): setattr(self, fname, lambda : deepcopy(root)) + xml = self._serialize_tree(root) + setattr(self, fname + '_xml', lambda : xml) else: def set_property(root, fname): setattr(self, fname, self.et_make_clone_factory(root)) + xml = self._serialize_tree(root) + setattr(self, fname + '_xml', lambda : xml) attribute_list = list(izip(count(), ({}, _ATTRIBUTES))) text_list = list(izip(count(), (None, _TEXT, _UTEXT))) @@ -94,8 +105,14 @@ def _tree_builder_name(self, tree, tn, an): return '_root%d_T%d_A%d' % (tree, tn, an) - def tree_builder(self, tree, tn, an): - return getattr(self, self._tree_builder_name(tree, tn, an)) + def tree_builder(self, tree, tn, an, serial): + name = self._tree_builder_name(tree, tn, an) + if serial: + name += '_xml' + return getattr(self, name) + + def _serialize_tree(self, root): + return self.etree.tostring(root, 'UTF-8') def et_make_clone_factory(self, elem): def generate_elem(append, elem, level): @@ -227,10 +244,13 @@ arg_count = 1 tree_tuples = self._permutations(all_trees, arg_count) + serialized = getattr(method, 'STRING', False) + for tree_tuple in tree_tuples: for tn in sorted(getattr(method, 'TEXT', (0,))): for an in sorted(getattr(method, 'ATTRIBUTES', (0,))): - benchmarks.append((name, method_call, tree_tuple, tn, an)) + benchmarks.append((name, method_call, tree_tuple, + tn, an, serialized)) return benchmarks @@ -263,27 +283,23 @@ for child in reversed(root): pass - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_tostring_utf8(self, root): self.etree.tostring(root, 'UTF-8') - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_tostring_utf16(self, root): self.etree.tostring(root, 'UTF-16') - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_tostring_utf8_unicode_XML(self, root): xml = unicode(self.etree.tostring(root, 'UTF-8'), 'UTF-8') self.etree.XML(xml) - @with_attributes(True) - @with_attributes(False) + @with_attributes(True, False) @with_text(text=True, utext=True) def bench_write_utf8_parse_stringIO(self, root): f = StringIO() @@ -291,6 +307,35 @@ f.seek(0) self.etree.parse(f) + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_parse_stringIO(self, root_xml): + f = StringIO(root_xml) + self.etree.parse(f) + + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_XML(self, root_xml): + self.etree.XML(root_xml) + + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_iterparse_stringIO(self, root_xml): + f = StringIO(root_xml) + for event, element in self.etree.iterparse(f): + pass + + @with_attributes(True, False) + @with_text(text=True, utext=True) + @serialized + def bench_iterparse_stringIO_clear(self, root_xml): + f = StringIO(root_xml) + for event, element in self.etree.iterparse(f): + element.clear() + def bench_append_from_document(self, root1, root2): # == "1,2 2,3 1,3 3,1 3,2 2,1" # trees 1 and 2, or 2 and 3, or ... for el in root2: @@ -643,14 +688,14 @@ for bs in benchmarks ] import time - def run_bench(suite, method_name, method_call, tree_set, tn, an): + def run_bench(suite, method_name, method_call, tree_set, tn, an, serial): if method_call is None: raise SkippedTest current_time = time.time call_repeat = range(10) - tree_builders = [ suite.tree_builder(tree, tn, an) + tree_builders = [ suite.tree_builder(tree, tn, an, serial) for tree in tree_set ] times = [] @@ -670,10 +715,11 @@ del args return times - def build_treeset_name(trees, tn, an): + def build_treeset_name(trees, tn, an, serialized): text = {0:'-', 1:'S', 2:'U'}[tn] attr = {0:'-', 1:'A'}[an] - return "%s%s T%s" % (text, attr, ',T'.join(imap(str, trees))[:6]) + ser = {True:'X', False:'T'}[serialized] + return "%s%s%s T%s" % (text, attr, ser, ',T'.join(imap(str, trees))[:6]) print "Running benchmark on", ', '.join(b.lib_name @@ -685,7 +731,7 @@ print "%-3s: " % b.lib_name, for an in (0,1): for tn in (0,1,2): - print ' %s ' % build_treeset_name((), tn, an)[:2], + print ' %s ' % build_treeset_name((), tn, an, False)[:2], print for i, tree_times in enumerate(b.setup_times): print " T%d:" % (i+1), ' '.join("%6.4f" % t for t in tree_times) @@ -699,7 +745,7 @@ for bench_calls in izip(*benchmarks): for lib, (bench, benchmark_setup) in enumerate(izip(benchmark_suites, bench_calls)): bench_name = benchmark_setup[0] - tree_set_name = build_treeset_name(*benchmark_setup[-3:]) + tree_set_name = build_treeset_name(*benchmark_setup[-4:]) print "%-3s: %-28s" % (bench.lib_name, bench_name[6:34]), print "(%-10s)" % tree_set_name, sys.stdout.flush() Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Fri Jun 23 12:01:34 2006 @@ -7,18 +7,18 @@ .. contents:: .. - 1 lxml.etree - 2 Trees and Documents - 3 Parsers - 4 Error handling on exceptions - 5 Python unicode strings - 6 XPath - 7 XSLT - 8 RelaxNG - 9 XMLSchema - 10 xinclude - 11 write_c14n on ElementTree - + 1 lxml.etree + 2 Trees and Documents + 3 Parsers + 4 iterparse and iterwalk + 5 Error handling on exceptions + 6 Python unicode strings + 7 XPath + 8 XSLT + 9 RelaxNG + 10 XMLSchema + 11 xinclude + 12 write_c14n on ElementTree lxml.etree ---------- @@ -171,6 +171,114 @@ ascii +iterparse and iterwalk +---------------------- + +As known from ElementTree, the ``iterparse()`` utility function returns an +iterator that generates parser events for an XML file (or file-like object), +while building the tree. The values are tuples ``(event-type, object)``. The +event types are 'start', 'end', 'start-ns' and 'end-ns'. + +The 'start' and 'end' events represent opening and closing elements and are +accompanied by the respective element. By default, only 'end' events are +generated:: + + >>> xml = '''\ + ... + ... text + ... texttail + ... + ... + ... ''' + + >>> context = etree.iterparse(StringIO(xml)) + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end {testns}empty-element + end root + +The resulting tree is available through the ``root`` property of the iterator:: + + >>> context.root.tag + 'root' + +The other types can be activated with the ``events`` keyword argument:: + + >>> events = ("start", "end") + >>> context = etree.iterparse(StringIO(xml), events=events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start {testns}empty-element + end {testns}empty-element + end root + +You can modify the element and its descendants when handling the 'end' event. +To save memory, for example, you can remove subtrees that are no longer +needed:: + + >>> context = etree.iterparse(StringIO(xml)) + >>> for action, elem in context: + ... print len(elem), + ... elem.clear() + 0 0 0 3 + >>> context.root.getchildren() + [] + +During the 'start' event, the descendants and following siblings are not yet +available. Note that you should not modify or move the ancestors or siblings +of the element during either of the two events. You should also avoid moving +the element itself. + +The 'start-ns' and 'end-ns' events notify about namespace declarations and +generate tuples ``(prefix, URI)``:: + + >>> events = ("start-ns", "end-ns") + >>> context = etree.iterparse(StringIO(xml), events=events) + >>> for action, obj in context: + ... print action, obj + start-ns ('', 'testns') + end-ns None + +It is common practice to use a list as namespace stack and pop the last entry +on the 'end-ns' event. + +lxml.etree supports two extensions compared to ElementTree. It accepts a +``tag`` keyword argument just like ``element.getiterator(tag)``. This +restricts events to a specific tag or namespace. + + >>> context = etree.iterparse(StringIO(xml), tag="element") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + + >>> events = ("start", "end") + >>> context = etree.iterparse(StringIO(xml), events=events, tag="{testns}*") + >>> for action, elem in context: + ... print action, elem.tag + start {testns}empty-element + end {testns}empty-element + +The second extension is the ``iterwalk()`` function. It behaves exactly like +``iterparse()``, but works on Elements and ElementTrees:: + + >>> root = context.root + >>> context = etree.iterwalk(root, events=events, tag="element") + >>> for action, elem in context: + ... print action, elem.tag + start element + end element + start element + end element + + Error handling on exceptions ---------------------------- Modified: lxml/trunk/doc/compatibility.txt ============================================================================== --- lxml/trunk/doc/compatibility.txt (original) +++ lxml/trunk/doc/compatibility.txt Fri Jun 23 12:01:34 2006 @@ -87,6 +87,10 @@ API. In general, etree tries to avoid AssertionErrors in favour of being more specific about the reason for the exception. +* When parsing fails in ``iterparse()``, ElementTree raises an ExpatError + instead of a SyntaxError. lxml.etree follows the other parts of the parser + API and raises an (XML)SyntaxError. + * ElementTree has a bug when serializing an empty Comment (no text argument given) to XML, etree serializes this successfully. Modified: lxml/trunk/doc/performance.txt ============================================================================== --- lxml/trunk/doc/performance.txt (original) +++ lxml/trunk/doc/performance.txt Fri Jun 23 12:01:34 2006 @@ -1,16 +1,15 @@ -Benchmarks and speed +Benchmarks and Speed ==================== -As an XML library, lxml.etree is very fast. It is also slow. As with -all software, it depends on what you do with it. Rest assured that -lxml is fast enough for most applications, so lxml is probably fast -enough for yours. +As an XML library, lxml.etree is very fast. It is also slow. As with all +software, it depends on what you do with it. Rest assured that lxml is fast +enough for most applications, so lxml is probably somewhere between 'fast +enough' and 'the best choice' for yours. This text describes where lxml.etree (lxe) excels, gives hints on some performance traps and compares the overall performance to the original -ElementTree_ (ET) and cElementTree_ (cET) libraries by Fredrik Lundh. -The cElementTree library is a fast C-implementation of the original -ElementTree. +ElementTree_ (ET) and cElementTree_ (cET) libraries by Fredrik Lundh. The +cElementTree library is a fast C-implementation of the original ElementTree. .. _ElementTree: http://effbot.org/zone/element-index.htm .. _cElementTree: http://effbot.org/zone/celementtree.htm @@ -31,6 +30,14 @@ small tree, slightly broader than deep. Most benchmarks run in a loop over all children of the tree root. +.. contents:: +.. + 1 Bad things first + 2 Parsing and Serialising + 3 The ElementTree API + 4 Tree traversal + 5 XPath + Bad things first ---------------- @@ -67,9 +74,20 @@ ET : tostring_utf8 (S- T3) 87.1525 msec/pass For parsing, the difference between the libraries is smaller. The (c)ET -libraries use the expat parser, which is known to be fast and similar in -performance to the libxml2 parser. If you take a complete serialize-parse -cycle, the numbers will look similar to these:: +libraries use the expat parser, which is known to be extremely fast:: + + lxe: parse_stringIO (SA T2) 197.7678 msec/pass + cET: parse_stringIO (SA T2) 38.9390 msec/pass + ET : parse_stringIO (SA T2) 364.3468 msec/pass + + lxe: parse_stringIO (UA T3) 48.6735 msec/pass + cET: parse_stringIO (UA T3) 39.7455 msec/pass + ET : parse_stringIO (UA T3) 237.9971 msec/pass + +The expat parser allows cET to be up to 80% faster than lxml on plain parser +performance. The same applies to the ``iterparse()`` function. However, if +you take a complete serialize-parse cycle, the numbers will look similar to +these:: lxe: write_utf8_parse_stringIO (S- T1) 187.0444 msec/pass cET: write_utf8_parse_stringIO (S- T1) 828.4068 msec/pass @@ -79,8 +97,10 @@ cET: write_utf8_parse_stringIO (UA T2) 927.2374 msec/pass ET : write_utf8_parse_stringIO (UA T2) 1297.9678 msec/pass -So, lxml also wins this contest, but considering the previous numbers on -serialization, cET comes rather close in plain parser performance. +For applications that require a high parser throughput and do little +serialization, cET is the best choice. Also for iterparse applications that +extract small amounts of data from large XML data sets. If it comes to +round-trip performance, however, lxml tends to be 3-4 times faster in total. The ElementTree API Modified: lxml/trunk/selftest.py ============================================================================== --- lxml/trunk/selftest.py (original) +++ lxml/trunk/selftest.py Fri Jun 23 12:01:34 2006 @@ -306,6 +306,73 @@ ## ## """ +def iterparse(): + """ + Test iterparse interface. + + >>> iterparse = ElementTree.iterparse + + >>> context = iterparse("samples/simple.xml") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end empty-element + end root + >>> context.root.tag + 'root' + + >>> context = iterparse("samples/simple-ns.xml") + >>> for action, elem in context: + ... print action, elem.tag + end {namespace}element + end {namespace}element + end {namespace}empty-element + end {namespace}root + + >>> events = () + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = () + >>> context = iterparse("samples/simple.xml", events=events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = ("start", "end") + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> events = ("start", "end", "start-ns", "end-ns") + >>> context = iterparse("samples/simple-ns.xml", events) + >>> for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + start-ns ('', 'namespace') + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + end-ns None + + """ + ## def fancyparsefile(): ## """ ## Test the "fancy" parser. Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Fri Jun 23 12:01:34 2006 @@ -1693,6 +1693,7 @@ include "docloader.pxi" # Support for custom document loaders include "parser.pxi" # XML Parser include "serializer.pxi" # XML output functions +include "iterparse.pxi" # incremental XML parsing include "xmlid.pxi" # XMLID and IDDict include "extensions.pxi" # XPath/XSLT extension functions include "xpath.pxi" # XPath evaluation Modified: lxml/trunk/src/lxml/parser.pxi ============================================================================== --- lxml/trunk/src/lxml/parser.pxi (original) +++ lxml/trunk/src/lxml/parser.pxi Fri Jun 23 12:01:34 2006 @@ -13,6 +13,7 @@ ctypedef enum LxmlParserType: LXML_XML_PARSER LXML_HTML_PARSER + LXML_ITERPARSE_PARSER cdef class _ParserContext: # Global parser context to share the string dictionary. @@ -343,12 +344,15 @@ elif isinstance(self, XMLParser): self._parser_type = LXML_XML_PARSER pctxt = xmlparser.xmlNewParserCtxt() + elif isinstance(self, iterparse): + self._parser_type = LXML_ITERPARSE_PARSER + pctxt = xmlparser.xmlNewParserCtxt() else: raise TypeError, "This class cannot be instantiated" self._parser_ctxt = pctxt if pctxt is NULL: raise ParserError, "Failed to create parser context" - if thread is None: + if thread is None or self._parser_type == LXML_ITERPARSE_PARSER: # no threading self._lockParser = self.__dummy self._unlockParser = self.__dummy @@ -358,7 +362,10 @@ self._unlockParser = lock.release self._error_log = _ErrorLog() self.resolvers = _ResolverRegistry() - self._context = _ResolverContext(self.resolvers) + if self._parser_type == LXML_ITERPARSE_PARSER: + self._context = _IterparseResolverContext(self.resolvers) + else: + self._context = _ResolverContext(self.resolvers) pctxt._private = self._context def __dealloc__(self): Modified: lxml/trunk/src/lxml/python.pxd ============================================================================== --- lxml/trunk/src/lxml/python.pxd (original) +++ lxml/trunk/src/lxml/python.pxd Fri Jun 23 12:01:34 2006 @@ -6,7 +6,9 @@ ctypedef int size_t ctypedef int Py_ssize_t cdef int INT_MAX - + + cdef void Py_INCREF(object o) + cdef FILE* PyFile_AsFile(object p) cdef int PyFile_Check(object p) cdef object PyFile_Name(object p) Modified: lxml/trunk/src/lxml/tests/test_elementtree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_elementtree.py (original) +++ lxml/trunk/src/lxml/tests/test_elementtree.py Fri Jun 23 12:01:34 2006 @@ -1754,7 +1754,92 @@ self.assert_(tostring(b) == 'Foo' or tostring(b) == 'Foo') - + + def test_iterparse(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f) + self.assertEquals(None, + iterator.root) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('end', root[0]), ('end', root[1]), ('end', root)], + events) + + def test_iterparse_start(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, events=('start',)) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('start', root), ('start', root[0]), ('start', root[1])], + events) + + def test_iterparse_start_end(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, events=('start','end')) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('start', root), ('start', root[0]), ('end', root[0]), + ('start', root[1]), ('end', root[1]), ('end', root)], + events) + + def test_iterparse_clear(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f) + for event, elem in iterator: + elem.clear() + + root = iterator.root + self.assertEquals(0, + len(root)) + + def test_iterparse_attrib_ns(self): + iterparse = self.etree.iterparse + f = StringIO('') + + attr_name = '{testns}bla' + events = [] + iterator = iterparse(f, events=('start','end','start-ns','end-ns')) + for event, elem in iterator: + events.append(event) + if event == 'start': + if elem.tag != '{ns1}a': + elem.set(attr_name, 'value') + + self.assertEquals( + ['start-ns', 'start', 'start', 'start-ns', 'start', + 'end', 'end-ns', 'end', 'end', 'end-ns'], + events) + + root = iterator.root + self.assertEquals( + None, + root.get(attr_name)) + self.assertEquals( + 'value', + root[0].get(attr_name)) + + def test_iterparse_getiterator(self): + iterparse = self.etree.iterparse + f = StringIO('') + + counts = [] + for event, elem in iterparse(f): + counts.append(len(list(elem.getiterator()))) + self.assertEquals( + [1,2,1,4], + counts) + def test_parse_file(self): parse = self.etree.parse # from file Modified: lxml/trunk/src/lxml/tests/test_etree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_etree.py (original) +++ lxml/trunk/src/lxml/tests/test_etree.py Fri Jun 23 12:01:34 2006 @@ -74,6 +74,130 @@ self.assertRaises(SyntaxError, parse, f) f.close() + def test_iterparse_broken(self): + iterparse = self.etree.iterparse + f = StringIO('') + # ET raises ExpatError, lxml raises XMLSyntaxError + self.assertRaises(self.etree.XMLSyntaxError, list, iterparse(f)) + + def test_iterparse_tag(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, tag="b", events=('start', 'end')) + events = list(iterator) + root = iterator.root + self.assertEquals( + [('start', root[0]), ('end', root[0])], + events) + + def test_iterparse_tag_all(self): + iterparse = self.etree.iterparse + f = StringIO('') + + iterator = iterparse(f, tag="*", events=('start', 'end')) + events = list(iterator) + self.assertEquals( + 8, + len(events)) + + def test_iterwalk_tag(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, tag="b", events=('start', 'end')) + events = list(iterator) + self.assertEquals( + [('start', root[0]), ('end', root[0])], + events) + + def test_iterwalk_tag_all(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, tag="*", events=('start', 'end')) + events = list(iterator) + self.assertEquals( + 8, + len(events)) + + def test_iterwalk(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + events = list(iterwalk(root)) + self.assertEquals( + [('end', root[0]), ('end', root[1]), ('end', root)], + events) + + def test_iterwalk_start(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, events=('start',)) + events = list(iterator) + self.assertEquals( + [('start', root), ('start', root[0]), ('start', root[1])], + events) + + def test_iterwalk_start_end(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root, events=('start','end')) + events = list(iterator) + self.assertEquals( + [('start', root), ('start', root[0]), ('end', root[0]), + ('start', root[1]), ('end', root[1]), ('end', root)], + events) + + def test_iterwalk_clear(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + iterator = iterwalk(root) + for event, elem in iterator: + elem.clear() + + self.assertEquals(0, + len(root)) + + def test_iterwalk_attrib_ns(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + attr_name = '{testns}bla' + events = [] + iterator = iterwalk(root, events=('start','end','start-ns','end-ns')) + for event, elem in iterator: + events.append(event) + if event == 'start': + if elem.tag != '{ns1}a': + elem.set(attr_name, 'value') + + self.assertEquals( + ['start-ns', 'start', 'start', 'start-ns', 'start', + 'end', 'end-ns', 'end', 'end', 'end-ns'], + events) + + self.assertEquals( + None, + root.get(attr_name)) + self.assertEquals( + 'value', + root[0].get(attr_name)) + + def test_iterwalk_getiterator(self): + iterwalk = self.etree.iterwalk + root = self.etree.XML('') + + counts = [] + for event, elem in iterwalk(root): + counts.append(len(list(elem.getiterator()))) + self.assertEquals( + [1,2,1,4], + counts) + def test_resolve_string_dtd(self): parse = self.etree.parse parser = self.etree.XMLParser(dtd_validation=True) Modified: lxml/trunk/src/lxml/xmlparser.pxd ============================================================================== --- lxml/trunk/src/lxml/xmlparser.pxd (original) +++ lxml/trunk/src/lxml/xmlparser.pxd Fri Jun 23 12:01:34 2006 @@ -1,7 +1,24 @@ -from tree cimport xmlDoc, xmlDict +from tree cimport xmlDoc, xmlNode, xmlDict from tree cimport xmlInputReadCallback, xmlInputCloseCallback from xmlerror cimport xmlError + +cdef extern from "libxml/parser.h": + ctypedef void (*startElementNsSAX2Func)(void* ctx, + char* localname, + char* prefix, + char* URI, + int nb_namespaces, + char** namespaces, + int nb_attributes, + int nb_defaulted, + char** attributes) + + ctypedef void (*endElementNsSAX2Func)(void* ctx, + char* localname, + char* prefix, + char* URI) + cdef extern from "libxml/tree.h": ctypedef struct xmlParserInput ctypedef struct xmlParserInputBuffer: @@ -9,6 +26,10 @@ xmlInputReadCallback readcallback xmlInputCloseCallback closecallback + ctypedef struct xmlSAXHandler: + startElementNsSAX2Func startElementNs + endElementNsSAX2Func endElementNs + cdef extern from "libxml/xmlIO.h": cdef xmlParserInputBuffer* xmlAllocParserInputBuffer(int enc) @@ -27,6 +48,8 @@ int recovery int options xmlError lastError + xmlNode* node + xmlSAXHandler* sax ctypedef enum xmlParserOption: XML_PARSE_RECOVER = 1 # recover on errors @@ -72,6 +95,20 @@ char* buffer, int size, char* filename, char* encoding, int options) +# iterparse: + + cdef xmlParserCtxt* xmlCreatePushParserCtxt(xmlSAXHandler* sax, + void* user_data, + char* chunk, + int size, + char* filename) + + cdef int xmlCtxtResetPush(xmlParserCtxt* ctxt, + char* chunk, + int size, + char* filename, + char* encoding) + # entity loaders: ctypedef xmlParserInput* (*xmlExternalEntityLoader)(char * URL, From scoder at codespeak.net Fri Jun 23 12:50:01 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 12:50:01 +0200 (CEST) Subject: [Lxml-checkins] r29218 - lxml/trunk/src/lxml Message-ID: <20060623105001.612F710078@code0.codespeak.net> Author: scoder Date: Fri Jun 23 12:49:57 2006 New Revision: 29218 Modified: lxml/trunk/src/lxml/iterparse.pxi Log: made iterparse() more robust against namespace updates before the SAX end event Modified: lxml/trunk/src/lxml/iterparse.pxi ============================================================================== --- lxml/trunk/src/lxml/iterparse.pxi (original) +++ lxml/trunk/src/lxml/iterparse.pxi Fri Jun 23 12:49:57 2006 @@ -48,14 +48,6 @@ c_ns = c_ns.next return count -cdef void _appendEndNsEvents(xmlNode* c_node, event_list): - cdef xmlNs* c_ns - c_ns = c_node.nsDef - event = ("end-ns", None) - while c_ns is not NULL: - python.PyList_Append(event_list, event) - c_ns = c_ns.next - cdef class _IterparseResolverContext(_ResolverContext): cdef xmlparser.startElementNsSAX2Func _origSaxStart cdef xmlparser.endElementNsSAX2Func _origSaxEnd @@ -64,6 +56,8 @@ cdef int _event_filter cdef object _events cdef int _event_index + cdef object _ns_stack + cdef object _pop_ns cdef object _node_stack cdef object _pop_node cdef object _tag_tuple @@ -72,6 +66,8 @@ def __init__(self, *args): _ResolverContext.__init__(self, *args) + self._ns_stack = [] + self._pop_ns = self._ns_stack.pop self._node_stack = [] self._pop_node = self._node_stack.pop self._events = [] @@ -82,15 +78,16 @@ self._origSaxStart = sax.startElementNs # only override start event handler if needed if self._event_filter == 0 or \ - self._event_filter & \ - (ITERPARSE_FILTER_START | ITERPARSE_FILTER_START_NS): + self._event_filter & (ITERPARSE_FILTER_START | \ + ITERPARSE_FILTER_START_NS | \ + ITERPARSE_FILTER_END_NS): sax.startElementNs = _saxStart self._origSaxEnd = sax.endElementNs # only override end event handler if needed if self._event_filter == 0 or \ - self._event_filter & \ - (ITERPARSE_FILTER_END | ITERPARSE_FILTER_END_NS): + self._event_filter & (ITERPARSE_FILTER_END | \ + ITERPARSE_FILTER_END_NS): sax.endElementNs = _saxEnd cdef void _setEventFilter(self, events, tag): @@ -113,10 +110,15 @@ self._tag_tuple = None cdef void startNode(self, xmlNode* c_node): - cdef xmlNs* c_ns cdef _Element node + cdef xmlNs* c_ns + cdef int ns_count if self._event_filter & ITERPARSE_FILTER_START_NS: - _appendStartNsEvents(c_node, self._events) + ns_count = _appendStartNsEvents(c_node, self._events) + elif self._event_filter & ITERPARSE_FILTER_END_NS: + ns_count = _countNsDefs(c_node) + if self._event_filter & ITERPARSE_FILTER_END_NS: + python.PyList_Append(self._ns_stack, ns_count) if self._doc is None: self._doc = _documentFactory(c_node.doc, None) self._root = self._doc.getroot() @@ -131,11 +133,13 @@ cdef void endNode(self, xmlNode* c_node): cdef _Element node cdef xmlNs* c_ns + cdef int ns_count if self._event_filter & ITERPARSE_FILTER_END: if self._tag_tuple is None or \ _tagMatches(c_node, self._tag_href, self._tag_name): - if self._event_filter & \ - (ITERPARSE_FILTER_START | ITERPARSE_FILTER_START_NS): + if self._event_filter & (ITERPARSE_FILTER_START | \ + ITERPARSE_FILTER_START_NS | \ + ITERPARSE_FILTER_END_NS): node = self._pop_node() assert node._c_node is c_node else: @@ -146,7 +150,12 @@ python.PyList_Append(self._events, ("end", node)) if self._event_filter & ITERPARSE_FILTER_END_NS: - _appendEndNsEvents(c_node, self._events) + ns_count = self._pop_ns() + if ns_count > 0: + event = ("end-ns", None) + for i from 0 <= i < ns_count: + python.PyList_Append(self._events, event) + cdef void _pushSaxStartEvent(xmlparser.xmlParserCtxt* c_ctxt, xmlNode* c_node): cdef _IterparseResolverContext context From scoder at codespeak.net Fri Jun 23 13:38:02 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 13:38:02 +0200 (CEST) Subject: [Lxml-checkins] r29223 - lxml/trunk Message-ID: <20060623113802.BC5681007B@code0.codespeak.net> Author: scoder Date: Fri Jun 23 13:37:57 2006 New Revision: 29223 Modified: lxml/trunk/setup.py Log: support for --rpath option in setup.py Modified: lxml/trunk/setup.py ============================================================================== --- lxml/trunk/setup.py (original) +++ lxml/trunk/setup.py Fri Jun 23 13:37:57 2006 @@ -1,6 +1,9 @@ import sys, os, os.path, re setup_args = {} +ext_args = {} +DEFINES = [] + try: from setuptools import setup from setuptools.extension import Extension @@ -22,15 +25,39 @@ raise NotImplementedError, \ "Static build not configured, see doc/build.txt" +# This is called if the '--rpath' option is passed +def setupRpathBuild(xslt_libs, ext_args): + libdirs = [] + libs = [] + libflags = [] + rpathdirs = [] + for option in xslt_libs: + content = option[2:] + if option.startswith('-L'): + if not content.startswith('/usr'): + rpathdirs.append(content) + libdirs.append(content) + elif option.startswith('-l'): + libs.append(content) + else: + libflags.append(option) + + ext_args['libraries'] = libs + ext_args['library_dirs'] = libdirs + ext_args['extra_link_args'] = libflags + ext_args['runtime_library_dirs'] = rpathdirs + def flags(cmd): wf, rf, ef = os.popen3(cmd) - return rf.read().strip().split(' ') + return rf.read().split() def fix_alphabeta(version, alphabeta): if '.'+alphabeta in version: return version return version.replace(alphabeta, '.'+alphabeta) +# determine version number and create lxml-version.h + src_dir = os.path.join(os.getcwd(), os.path.dirname(sys.argv[0])) version = open(os.path.join(src_dir, 'version.txt')).read().strip() @@ -72,13 +99,13 @@ print "*NOTE*: Trying to build without Pyrex, needs pre-generated 'src/lxml/etree.c' !" sources = ["src/lxml/etree.c"] -try: +if '--static' in sys.argv: + # use the static setup as configured in setupStaticBuild sys.argv.remove('--static') -except ValueError: - # we are not compiling statically + cflags, xslt_libs = setupStaticBuild() +else: cflags = flags('xslt-config --cflags') xslt_libs = flags('xslt-config --libs') - # compile also against libexslt! for i, libname in enumerate(xslt_libs): if 'exslt' in libname: @@ -86,11 +113,14 @@ if 'xslt' in libname: xslt_libs.insert(i, libname.replace('xslt', 'exslt')) break -else: - # use the static setup as configured in setupStaticBuild - cflags, xslt_libs = setupStaticBuild() -DEFINES = [] + if '--rpath' in sys.argv: + # compile with --rpath under gcc + sys.argv.remove('--rpath') + setupRpathBuild(xslt_libs, ext_args) + else: + ext_args['extra_link_args'] = xslt_libs + try: sys.argv.remove('--without-assert') DEFINES.append( ('PYREX_WITHOUT_ASSERTIONS', None) ) @@ -101,11 +131,10 @@ "lxml.etree", sources = sources, extra_compile_args = ['-w'] + cflags, - extra_link_args = xslt_libs, - define_macros = DEFINES + define_macros = DEFINES, + **ext_args )] - # setup ChangeLog entry changelog_text = "" From scoder at codespeak.net Fri Jun 23 14:26:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 14:26:31 +0200 (CEST) Subject: [Lxml-checkins] r29239 - in lxml/trunk: . doc src/lxml src/lxml/tests Message-ID: <20060623122631.DF16110072@code0.codespeak.net> Author: scoder Date: Fri Jun 23 14:26:20 2006 New Revision: 29239 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/main.txt lxml/trunk/doc/namespace_extensions.txt lxml/trunk/src/lxml/nsclasses.pxi lxml/trunk/src/lxml/tests/test_nsclasses.py Log: allow setting global default element class Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Fri Jun 23 14:26:20 2006 @@ -7,6 +7,9 @@ Features added -------------- +* Support for setting a custom default Element class as opposed to namespace + specific classes (which still override the default class) + * Module level ``iterwalk()`` function as 'iterparse' for trees * ElementTree compatible ``iterparse()`` module function Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Fri Jun 23 14:26:20 2006 @@ -98,9 +98,9 @@ `c14n`_. Python code can be called from XPath expressions and XSLT stylesheets through the use of `extension functions`_. -In addition to the ElementTree API, lxml also features an API for -`implementing namespaces`_ using tag specific element classes. This is a -simple way to write arbitrary XML driven APIs on top of lxml. +In addition to the ElementTree API, lxml also features a sophisticated API for +`custom element classes`_. This is a simple way to write arbitrary XML driven +APIs on top of lxml. lxml also offers a `SAX compliant API`_, that works with the SAX support in the standard library. @@ -112,7 +112,7 @@ .. _`ElementTree compatibility overview`: compatibility.html .. _`extends this API`: api.html .. _`extension functions`: extensions.html -.. _`implementing namespaces`: namespace_extensions.html +.. _`custom element classes`: namespace_extensions.html .. _`SAX compliant API`: sax.html .. _XPath: http://www.w3.org/TR/xpath Modified: lxml/trunk/doc/namespace_extensions.txt ============================================================================== --- lxml/trunk/doc/namespace_extensions.txt (original) +++ lxml/trunk/doc/namespace_extensions.txt Fri Jun 23 14:26:20 2006 @@ -1,12 +1,11 @@ -================================================ -Implementing namespaces with the Namespace class -================================================ +Using custom Element classes in lxml +==================================== -lxml allows you to implement namespaces, in a rather literal sense. You can -write your own classes for Elements and have lxml use them for a specific tag -name in a specific namespace. +lxml has very sophisticated support for custom Element classes. You can +provide your own classes for Elements and have lxml use them by default or +only for a specific tag name in a specific namespace. -Custom Elements must inherit from the ``etree.ElementBase`` class, which +Custom Elements must inherit from the ``lxml.etree.ElementBase`` class, which provides the Element interface for subclasses:: >>> from lxml import etree @@ -17,15 +16,38 @@ This defines a new Element class ``HonkElement`` with a property ``honking``. -Note that you cannot (or rather must not) instantiate this class yourself. -lxml.etree will do that for you through its normal ElementTree API. To let -lxml know about it, you must register it with a namespace. +Note that you cannot (or rather *must not*) instantiate this class yourself. +lxml.etree will do that for you through its normal ElementTree API. + + +Changing the default element class +---------------------------------- +You can let lxml use your new class for every Element it generates:: + + >>> etree.setDefaultElementClass(HonkElement) + >>> el = etree.Element("myelement") + >>> print isinstance(el, HonkElement) + True + >>> el.honking + False + >>> el = etree.Element("myelement", honking='true') + >>> el.honking + True -The Namespace class -------------------- +To reset lxml.etree to the original element class, pass ``None`` or nothing:: -You can build a new namespace (or retrieve an existing one) by calling the + >>> etree.setDefaultElementClass() + >>> el = etree.Element("myelement") + >>> print isinstance(el, HonkElement) + False + + +Implementing namespaces +----------------------- + +lxml allows you to implement namespaces, in a rather literal sense. You can +build a new element namespace (or retrieve an existing one) by calling the Namespace class:: >>> namespace = etree.Namespace('http://hui.de/honk') Modified: lxml/trunk/src/lxml/nsclasses.pxi ============================================================================== --- lxml/trunk/src/lxml/nsclasses.pxi (original) +++ lxml/trunk/src/lxml/nsclasses.pxi Fri Jun 23 14:26:20 2006 @@ -1,6 +1,9 @@ # module-level API for namespace implementations -class NamespaceRegistryError(LxmlError): +class LxmlRegistryError(LxmlError): + pass + +class NamespaceRegistryError(LxmlRegistryError): pass cdef class ElementBase(_Element): @@ -13,6 +16,19 @@ ``_init(self)`` method that will be called after object creation. """ +def setDefaultElementClass(cls=None): + global __DEFAULT_ELEMENT_CLASS + if cls is None: + __DEFAULT_ELEMENT_CLASS = _Element + elif not python.PyType_Check(cls) or not issubclass(cls, ElementBase): + raise LxmlRegistryError, \ + "Registered element classes must be subtypes of ElementBase" + else: + __DEFAULT_ELEMENT_CLASS = cls + +cdef object __DEFAULT_ELEMENT_CLASS +__DEFAULT_ELEMENT_CLASS = _Element + cdef object __NAMESPACE_REGISTRIES __NAMESPACE_REGISTRIES = {} @@ -110,10 +126,9 @@ cdef class _ClassNamespaceRegistry(_NamespaceRegistry): "Dictionary-like registry for namespace implementation classes" def __setitem__(self, name, item): - if not python.PyType_Check(item) or \ - not issubclass(item, ElementBase): + if not python.PyType_Check(item) or not issubclass(item, ElementBase): raise NamespaceRegistryError, \ - "Registered item must be subtypes of ElementBase" + "Registered element classes must be subtypes of ElementBase" if name is not None: name = _utf8(name) self._entries[name] = item @@ -188,7 +203,7 @@ dict_result = python.PyDict_GetItem( __NAMESPACE_REGISTRIES, None) if dict_result is NULL: - return _Element + return __DEFAULT_ELEMENT_CLASS registry = <_NamespaceRegistry>dict_result classes = registry._entries @@ -205,4 +220,4 @@ if dict_result is not NULL: return dict_result else: - return _Element + return __DEFAULT_ELEMENT_CLASS Modified: lxml/trunk/src/lxml/tests/test_nsclasses.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_nsclasses.py (original) +++ lxml/trunk/src/lxml/tests/test_nsclasses.py Fri Jun 23 14:26:20 2006 @@ -67,7 +67,7 @@ etree.Namespace(u'ns11').clear() - def test_default_class(self): + def test_default_tagname(self): bluff_dict = { None : self.bluff_class, 'maeh' : self.maeh_class @@ -144,6 +144,25 @@ etree.Namespace(None).clear() etree.Namespace(u'ns30').clear() + def test_default_element_class(self): + class local_default_class(etree.ElementBase): + pass + + try: + etree.setDefaultElementClass(local_default_class) + self.assert_(isinstance(etree.Element("test"), + local_default_class)) + self.assert_(isinstance(etree.Element("{http://myns}test"), + local_default_class)) + + etree.setDefaultElementClass() + self.assertFalse(isinstance(etree.Element("test"), + local_default_class)) + self.assertFalse(isinstance(etree.Element("{http://myns}test"), + local_default_class)) + finally: + etree.setDefaultElementClass() + def test_suite(): suite = unittest.TestSuite() suite.addTests([unittest.makeSuite(ETreeNamespaceClassesTestCase)]) From scoder at codespeak.net Fri Jun 23 14:34:42 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Fri, 23 Jun 2006 14:34:42 +0200 (CEST) Subject: [Lxml-checkins] r29240 - lxml/trunk/doc Message-ID: <20060623123442.65C2910072@code0.codespeak.net> Author: scoder Date: Fri Jun 23 14:34:39 2006 New Revision: 29240 Modified: lxml/trunk/doc/namespace_extensions.txt Log: clarification on combining namespaced custom classes with setting the default class Modified: lxml/trunk/doc/namespace_extensions.txt ============================================================================== --- lxml/trunk/doc/namespace_extensions.txt (original) +++ lxml/trunk/doc/namespace_extensions.txt Fri Jun 23 14:34:39 2006 @@ -178,3 +178,6 @@ Traceback (most recent call last): ... AttributeError: 'HonkNSElement' object has no attribute 'honking' + +Note that you can also combine this with the global default class. Namespace +specific classes will simply override the less specific default. From scoder at codespeak.net Sat Jun 24 15:27:42 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sat, 24 Jun 2006 15:27:42 +0200 (CEST) Subject: [Lxml-checkins] r29295 - in lxml/trunk: doc src/lxml Message-ID: <20060624132742.D2A2510075@code0.codespeak.net> Author: scoder Date: Sat Jun 24 15:27:40 2006 New Revision: 29295 Modified: lxml/trunk/doc/namespace_extensions.txt lxml/trunk/src/lxml/nsclasses.pxi Log: doc updates Modified: lxml/trunk/doc/namespace_extensions.txt ============================================================================== --- lxml/trunk/doc/namespace_extensions.txt (original) +++ lxml/trunk/doc/namespace_extensions.txt Sat Jun 24 15:27:40 2006 @@ -32,6 +32,8 @@ >>> el.honking False >>> el = etree.Element("myelement", honking='true') + >>> print etree.tostring(el) + >>> el.honking True Modified: lxml/trunk/src/lxml/nsclasses.pxi ============================================================================== --- lxml/trunk/src/lxml/nsclasses.pxi (original) +++ lxml/trunk/src/lxml/nsclasses.pxi Sat Jun 24 15:27:40 2006 @@ -7,7 +7,7 @@ pass cdef class ElementBase(_Element): - """All classes in namespace implementations must inherit from this one. + """All custom Element classes must inherit from this one. Note that subclasses *must not* override __init__ or __new__ as it is absolutely undefined when these objects will be created or destroyed. All From scoder at codespeak.net Sun Jun 25 23:46:49 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Sun, 25 Jun 2006 23:46:49 +0200 (CEST) Subject: [Lxml-checkins] r29334 - in lxml/trunk: . doc src/lxml src/lxml/tests Message-ID: <20060625214649.EBAB51007A@code0.codespeak.net> Author: scoder Date: Sun Jun 25 23:46:46 2006 New Revision: 29334 Modified: lxml/trunk/CHANGES.txt lxml/trunk/doc/api.txt lxml/trunk/src/lxml/etree.pyx lxml/trunk/src/lxml/tests/test_etree.py Log: new Element.iterchildren(reversed=False), all Element.iter*() methods support additional 'tag' keyword argument Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Sun Jun 25 23:46:46 2006 @@ -36,9 +36,15 @@ * Element.iterancestors() iterates over the ancestors of an element (from parent to parent) - * Element.itersiblings() iterates over the siblings of an element in either + * Element.itersiblings() iterates over either the following or preceding + siblings of an element + + * Element.iterchildren() iterates over the children of an element in either direction + * All iterators support the ``tag`` keyword argument to restrict the + generated elements + * Element.getnext() and Element.getprevious() return the direct siblings of an element Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Sun Jun 25 23:46:46 2006 @@ -7,18 +7,18 @@ .. contents:: .. - 1 lxml.etree - 2 Trees and Documents - 3 Parsers - 4 iterparse and iterwalk - 5 Error handling on exceptions - 6 Python unicode strings - 7 XPath - 8 XSLT - 9 RelaxNG - 10 XMLSchema - 11 xinclude - 12 write_c14n on ElementTree + 1 lxml.etree + 2 Documents, Trees and Iteration + 3 Parsers + 4 iterparse and iterwalk + 5 Error handling on exceptions + 6 Python unicode strings + 7 XPath + 8 XSLT + 9 RelaxNG + 10 XMLSchema + 11 xinclude + 12 write_c14n on ElementTree lxml.etree ---------- @@ -42,8 +42,8 @@ >>> from StringIO import StringIO -Trees and Documents -------------------- +Documents, Trees and Iteration +------------------------------ Compared to the original ElementTree API, lxml.etree has an extended tree model. It knows about parents and siblings of elements:: @@ -61,9 +61,20 @@ >>> print c.getprevious().tag b -You can also iterate over the siblings, ancestors and descendants of an -element, as defined by the respective XPath axes:: +The ElementTree API makes Elements iterable to supports iteration over their +children:: + >>> [ el.tag for el in root ] + ['a', 'b', 'c', 'd'] + +lxml.etree also supports this, but additionally features an extended API for +iteration over the children, following/preceding siblings, ancestors and +descendants of an element, as defined by the respective XPath axes:: + + >>> [ el.tag for el in root.iterchildren() ] + ['a', 'b', 'c', 'd'] + >>> [ el.tag for el in root.iterchildren(reversed=True) ] + ['d', 'c', 'b', 'a'] >>> [ el.tag for el in a.itersiblings() ] ['b', 'c', 'd'] >>> [ el.tag for el in c.itersiblings(preceding=True) ] @@ -73,8 +84,16 @@ >>> [ el.tag for el in root.iterdescendants() ] ['a', 'b', 'c', 'd', 'e'] -Elements always live within a document context in lxml. This implies that -there is also a notion of an absolute document root. You can retrieve an +All of these iterators support an additional ``tag`` keyword argument that +filters the generated elements by tag name:: + + >>> [ el.tag for el in root.iterchildren(tag='a') ] + ['a'] + >>> [ el.tag for el in root.iterdescendants(tag='d') ] + ['d'] + +In lxml.etree, Elements always live within a document context. This implies +that there is also a notion of an absolute document root. You can retrieve an ElementTree for the root node of a document from any of its elements:: >>> tree = d.getroottree() @@ -101,7 +120,7 @@ The rule is that all operations that are applied to Elements use either the Element itself as reference point, or the absolute root of the document that -contains this Element. +contains this Element (e.g. for absolute XPath expressions). Parsers Modified: lxml/trunk/src/lxml/etree.pyx ============================================================================== --- lxml/trunk/src/lxml/etree.pyx (original) +++ lxml/trunk/src/lxml/etree.pyx Sun Jun 25 23:46:46 2006 @@ -1044,27 +1044,41 @@ return _elementFactory(self._doc, c_node) return None - def itersiblings(self, preceding=False): + def itersiblings(self, preceding=False, tag=None): """Iterate over the following or preceding siblings of this element. The direction is determined by the 'preceding' keyword which defaults - to False, i.e. forward iteration over the following siblings.""" - return SiblingsIterator(self, preceding) + to False, i.e. forward iteration over the following siblings. The + generated elements can be restricted to a specific tag name with the + 'tag' keyword. + """ + return SiblingsIterator(self, preceding, tag) - def iterancestors(self): + def iterancestors(self, tag=None): """Iterate over the ancestors of this element (from parent to parent). + + The generated elements can be restricted to a specific tag name with + the 'tag' keyword. """ - return AncestorsIterator(self) + return AncestorsIterator(self, tag) - def iterdescendants(self): + def iterdescendants(self, tag=None): """Iterate over the descendants of this element in document order. As opposed to getiterator(), this iterator does not yield the element - itself. + itself. The generated elements can be restricted to a specific tag + name with the 'tag' keyword. + """ + return ElementDepthFirstIterator(self, tag, False) + + def iterchildren(self, reversed=False, tag=None): + """Iterate over the children of this element. + + As opposed to using normal iteration on this element, the generated + elements can be restricted to a specific tag name with the 'tag' + keyword and reversed with the 'reversed' keyword. """ - iterator = ElementDepthFirstIterator(self) - iterator.next() - return iterator + return ElementChildIterator(self, reversed, tag) def getroottree(self): """Return an ElementTree for the root node of the document that @@ -1350,7 +1364,25 @@ ctypedef xmlNode* (*_node_to_node_function)(xmlNode*) -cdef class _ElementIterator: +cdef class _ElementTagMatcher: + cdef object _pystrings + cdef char* _href + cdef char* _name + cdef _initTagMatch(self, tag): + if tag is None: + self._href = NULL + self._name = NULL + else: + self._pystrings = _getNsTag(tag) + if self._pystrings[0] is None: + self._href = NULL + else: + self._href = _cstr(self._pystrings[0]) + self._name = _cstr(self._pystrings[1]) + if self._name[0] == c'*' and self._name[1] == c'\0': + self._name = NULL + +cdef class _ElementIterator(_ElementTagMatcher): # we keep Python references here to control GC cdef _NodeBase _node cdef _node_to_node_function _next_element @@ -1360,6 +1392,9 @@ cdef void _storeNext(self, _NodeBase node): cdef xmlNode* c_node c_node = self._next_element(node._c_node) + while c_node is not NULL and \ + not _tagMatches(c_node, self._href, self._name): + c_node = self._next_element(c_node) if c_node is NULL: self._node = None else: @@ -1378,14 +1413,19 @@ cdef class ElementChildIterator(_ElementIterator): "Iterates over the children of an element." - def __init__(self, _NodeBase node not None, reversed=False): + def __init__(self, _NodeBase node not None, reversed=False, tag=None): cdef xmlNode* c_node + self._initTagMatch(tag) if reversed: c_node = _findChildBackwards(node._c_node, 0) self._next_element = _previousElement else: c_node = _findChildForwards(node._c_node, 0) self._next_element = _nextElement + if tag is not None: + while c_node is not NULL and \ + not _tagMatches(c_node, self._href, self._name): + c_node = self._next_element(c_node) if c_node is not NULL: # store Python ref: self._node = _elementFactory(node._doc, c_node) @@ -1395,7 +1435,8 @@ You can pass the boolean keyword ``preceding`` to specify the direction. """ - def __init__(self, _NodeBase node not None, preceding=False): + def __init__(self, _NodeBase node not None, preceding=False, tag=None): + self._initTagMatch(tag) if preceding: self._next_element = _previousElement else: @@ -1404,17 +1445,21 @@ cdef class AncestorsIterator(_ElementIterator): "Iterates over the ancestors of an element (from parent to parent)." - def __init__(self, _NodeBase node not None): + def __init__(self, _NodeBase node not None, tag=None): + self._initTagMatch(tag) self._next_element = _parentElement self._storeNext(node) -cdef class ElementDepthFirstIterator: +cdef class ElementDepthFirstIterator(_ElementTagMatcher): """Iterates over an element and its sub-elements in document order (depth first pre-order). If the optional 'tag' argument is not None, it returns only the elements that match the respective name and namespace. + The optional boolean 'inclusive' argument defaults to True and can be set + to False to exclude the start element itself. + Note that the behaviour of this iterator is completely undefined if the tree it traverses is modified during iteration. """ @@ -1422,27 +1467,15 @@ # keep next node to return and a depth counter in the tree cdef _NodeBase _next_node cdef _NodeBase _top_node - cdef object _pystrings - cdef char* _href - cdef char* _name - def __init__(self, _NodeBase node not None, tag=None): + def __init__(self, _NodeBase node not None, tag=None, inclusive=True): self._top_node = node self._next_node = node - if tag is None: - self._href = NULL - self._name = NULL - else: - self._pystrings = _getNsTag(tag) - if self._pystrings[0] is None: - self._href = NULL - else: - self._href = _cstr(self._pystrings[0]) - self._name = _cstr(self._pystrings[1]) - if self._name[0] == c'*' and self._name[1] == c'\0': - self._name = NULL - if not _tagMatches(node._c_node, self._href, self._name): - # this cannot raise StopIteration, self._next_node != None - self.next() + self._initTagMatch(tag) + if tag is not None and \ + not _tagMatches(node._c_node, self._href, self._name) or \ + not inclusive: + # this cannot raise StopIteration, self._next_node != None + self.next() def __iter__(self): return self Modified: lxml/trunk/src/lxml/tests/test_etree.py ============================================================================== --- lxml/trunk/src/lxml/tests/test_etree.py (original) +++ lxml/trunk/src/lxml/tests/test_etree.py Sun Jun 25 23:46:46 2006 @@ -398,6 +398,42 @@ b, d.getparent()) + def test_iterchildren(self): + XML = self.etree.XML + + root = XML('TwoHm') + result = [] + for el in root.iterchildren(): + result.append(el.tag) + self.assertEquals(['one', 'two', 'three'], result) + + def test_iterchildren_reversed(self): + XML = self.etree.XML + + root = XML('TwoHm') + result = [] + for el in root.iterchildren(reversed=True): + result.append(el.tag) + self.assertEquals(['three', 'two', 'one'], result) + + def test_iterchildren_tag(self): + XML = self.etree.XML + + root = XML('TwoHmBla') + result = [] + for el in root.iterchildren(tag='two'): + result.append(el.text) + self.assertEquals(['Two', 'Bla'], result) + + def test_iterchildren_tag_reversed(self): + XML = self.etree.XML + + root = XML('TwoHmBla') + result = [] + for el in root.iterchildren(reversed=True, tag='two'): + result.append(el.text) + self.assertEquals(['Bla', 'Two'], result) + def test_iterancestors(self): Element = self.etree.Element SubElement = self.etree.SubElement @@ -419,6 +455,56 @@ [b, a], list(d.iterancestors())) + def test_iterancestors_tag(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + self.assertEquals( + [a], + list(d.iterancestors(tag='a'))) + + def test_iterdescendants(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + e = SubElement(c, 'e') + + self.assertEquals( + [b, d, c, e], + list(a.iterdescendants())) + self.assertEquals( + [], + list(d.iterdescendants())) + + def test_iterdescendants_tag(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + e = SubElement(c, 'e') + + self.assertEquals( + [], + list(a.iterdescendants('a'))) + a2 = SubElement(e, 'a') + self.assertEquals( + [a2], + list(a.iterdescendants('a'))) + self.assertEquals( + [a2], + list(c.iterdescendants('a'))) + def test_getroottree(self): Element = self.etree.Element SubElement = self.etree.SubElement @@ -499,6 +585,27 @@ [], list(b.itersiblings(preceding=True))) + def test_itersiblings_tag(self): + Element = self.etree.Element + SubElement = self.etree.SubElement + + a = Element('a') + b = SubElement(a, 'b') + c = SubElement(a, 'c') + d = SubElement(b, 'd') + self.assertEquals( + [], + list(a.itersiblings(tag='XXX'))) + self.assertEquals( + [c], + list(b.itersiblings(tag='c'))) + self.assertEquals( + [b], + list(c.itersiblings(preceding=True, tag='b'))) + self.assertEquals( + [], + list(c.itersiblings(preceding=True, tag='c'))) + def test_parseid(self): parseid = self.etree.parseid XML = self.etree.XML From scoder at codespeak.net Mon Jun 26 00:16:08 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 26 Jun 2006 00:16:08 +0200 (CEST) Subject: [Lxml-checkins] r29335 - lxml/trunk/doc Message-ID: <20060625221608.59D281007A@code0.codespeak.net> Author: scoder Date: Mon Jun 26 00:16:03 2006 New Revision: 29335 Modified: lxml/trunk/doc/api.txt Log: cleanup in api.txt: split section on documents and iteration Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Mon Jun 26 00:16:03 2006 @@ -8,17 +8,18 @@ .. contents:: .. 1 lxml.etree - 2 Documents, Trees and Iteration - 3 Parsers - 4 iterparse and iterwalk - 5 Error handling on exceptions - 6 Python unicode strings - 7 XPath - 8 XSLT - 9 RelaxNG - 10 XMLSchema - 11 xinclude - 12 write_c14n on ElementTree + 2 Trees and Documents + 3 Iteration + 4 Parsers + 5 iterparse and iterwalk + 6 Error handling on exceptions + 7 Python unicode strings + 8 XPath + 9 XSLT + 10 RelaxNG + 11 XMLSchema + 12 xinclude + 13 write_c14n on ElementTree lxml.etree ---------- @@ -42,8 +43,8 @@ >>> from StringIO import StringIO -Documents, Trees and Iteration ------------------------------- +Trees and Documents +------------------- Compared to the original ElementTree API, lxml.etree has an extended tree model. It knows about parents and siblings of elements:: @@ -61,39 +62,8 @@ >>> print c.getprevious().tag b -The ElementTree API makes Elements iterable to supports iteration over their -children:: - - >>> [ el.tag for el in root ] - ['a', 'b', 'c', 'd'] - -lxml.etree also supports this, but additionally features an extended API for -iteration over the children, following/preceding siblings, ancestors and -descendants of an element, as defined by the respective XPath axes:: - - >>> [ el.tag for el in root.iterchildren() ] - ['a', 'b', 'c', 'd'] - >>> [ el.tag for el in root.iterchildren(reversed=True) ] - ['d', 'c', 'b', 'a'] - >>> [ el.tag for el in a.itersiblings() ] - ['b', 'c', 'd'] - >>> [ el.tag for el in c.itersiblings(preceding=True) ] - ['b', 'a'] - >>> [ el.tag for el in e.iterancestors() ] - ['d', 'root'] - >>> [ el.tag for el in root.iterdescendants() ] - ['a', 'b', 'c', 'd', 'e'] - -All of these iterators support an additional ``tag`` keyword argument that -filters the generated elements by tag name:: - - >>> [ el.tag for el in root.iterchildren(tag='a') ] - ['a'] - >>> [ el.tag for el in root.iterdescendants(tag='d') ] - ['d'] - -In lxml.etree, Elements always live within a document context. This implies -that there is also a notion of an absolute document root. You can retrieve an +Elements always live within a document context in lxml. This implies that +there is also a notion of an absolute document root. You can retrieve an ElementTree for the root node of a document from any of its elements:: >>> tree = d.getroottree() @@ -123,6 +93,54 @@ contains this Element (e.g. for absolute XPath expressions). +Iteration +--------- + +The ElementTree API makes Elements iterable to supports iteration over their +children. Using the tree defined above, we get:: + + >>> [ el.tag for el in root ] + ['a', 'b', 'c', 'd'] + +Tree traversal is commonly based on the ``element.getiterator()`` method:: + + >>> [ el.tag for el in root.getiterator() ] + ['root', 'a', 'b', 'c', 'd', 'e'] + +lxml.etree also supports this, but additionally features an extended API for +iteration over the children, following/preceding siblings, ancestors and +descendants of an element, as defined by the respective XPath axis:: + + >>> [ el.tag for el in root.iterchildren() ] + ['a', 'b', 'c', 'd'] + >>> [ el.tag for el in root.iterchildren(reversed=True) ] + ['d', 'c', 'b', 'a'] + >>> [ el.tag for el in b.itersiblings() ] + ['c', 'd'] + >>> [ el.tag for el in c.itersiblings(preceding=True) ] + ['b', 'a'] + >>> [ el.tag for el in e.iterancestors() ] + ['d', 'root'] + >>> [ el.tag for el in root.iterdescendants() ] + ['a', 'b', 'c', 'd', 'e'] + +Note how ``element.iterdescendants()`` does not include the element itself, as +opposed to ``element.getiterator()``. The latter effectively implements the +'descendant-or-self' axis in XPath. + +All of these iterators support an additional ``tag`` keyword argument that +filters the generated elements by tag name:: + + >>> [ el.tag for el in root.iterchildren(tag='a') ] + ['a'] + >>> [ el.tag for el in d.iterchildren(tag='a') ] + [] + >>> [ el.tag for el in root.iterdescendants(tag='d') ] + ['d'] + >>> [ el.tag for el in root.getiterator(tag='d') ] + ['d'] + + Parsers ------- From scoder at codespeak.net Mon Jun 26 00:24:46 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 26 Jun 2006 00:24:46 +0200 (CEST) Subject: [Lxml-checkins] r29336 - lxml/trunk/doc Message-ID: <20060625222446.AAFDE1007A@code0.codespeak.net> Author: scoder Date: Mon Jun 26 00:24:45 2006 New Revision: 29336 Modified: lxml/trunk/doc/api.txt Log: forward reference in docs Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Mon Jun 26 00:24:45 2006 @@ -140,6 +140,9 @@ >>> [ el.tag for el in root.getiterator(tag='d') ] ['d'] +See also the section on the utility functions ``iterparse()`` and +``iterwalk()`` below. + Parsers ------- From scoder at codespeak.net Mon Jun 26 21:32:31 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 26 Jun 2006 21:32:31 +0200 (CEST) Subject: [Lxml-checkins] r29370 - lxml/branch/lxml-1.0 Message-ID: <20060626193231.75E441007F@code0.codespeak.net> Author: scoder Date: Mon Jun 26 21:32:29 2006 New Revision: 29370 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/version.txt Log: version 1.0.2 Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Mon Jun 26 21:32:29 2006 @@ -1,11 +1,8 @@ lxml changelog ============== -current -======= - -Features added --------------- +1.0.2 (2006-06-26) +================== Bugs fixed ---------- Modified: lxml/branch/lxml-1.0/version.txt ============================================================================== --- lxml/branch/lxml-1.0/version.txt (original) +++ lxml/branch/lxml-1.0/version.txt Mon Jun 26 21:32:29 2006 @@ -1 +1 @@ -1.0.1 +1.0.2 From scoder at codespeak.net Mon Jun 26 21:43:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 26 Jun 2006 21:43:38 +0200 (CEST) Subject: [Lxml-checkins] r29372 - lxml/branch/lxml-1.0/doc Message-ID: <20060626194338.5833B10080@code0.codespeak.net> Author: scoder Date: Mon Jun 26 21:43:37 2006 New Revision: 29372 Modified: lxml/branch/lxml-1.0/doc/api.txt Log: copied 'Trees and Documents' section from trunk, stripped to match 1.0.2 status Modified: lxml/branch/lxml-1.0/doc/api.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/api.txt (original) +++ lxml/branch/lxml-1.0/doc/api.txt Mon Jun 26 21:43:37 2006 @@ -42,6 +42,55 @@ >>> from StringIO import StringIO +Trees and Documents +------------------- + +Compared to the original ElementTree API, lxml.etree has an extended tree +model. It knows about parents of elements:: + + >>> root = etree.Element("root") + >>> a = etree.SubElement(root, "a") + >>> b = etree.SubElement(root, "b") + >>> c = etree.SubElement(root, "c") + >>> d = etree.SubElement(root, "d") + >>> e = etree.SubElement(d, "e") + + >>> b.getparent() == root + True + +Elements always live within a document context in lxml. This implies that +there is also a notion of an absolute document root. You can retrieve an +ElementTree for the root node of a document from any of its elements:: + + >>> tree = d.getroottree() + >>> print tree.getroot().tag + root + +Note that this is different from wrapping an Element in an ElementTree. You +can use ElementTrees to create XML trees with an explicit root node:: + + >>> tree = etree.ElementTree(d) + >>> print tree.getroot().tag + d + >>> print etree.tostring(tree) + + +All operations that you run on such an ElementTree (like XPath, XSLT, etc.) +will understand the explicitly chosen root as root node of a document. They +will not see any elements outside the ElementTree. However, ElementTrees do +not modify their Elements:: + + >>> element = tree.getroot() + >>> print element.tag + d + >>> print element.getparent().tag + root + +The rule is that all operations that are applied to Elements use either the +Element itself as reference point, or the absolute root of the document that +contains this Element (e.g. for absolute XPath expressions). + + Parsers ------- From scoder at codespeak.net Mon Jun 26 21:47:41 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 26 Jun 2006 21:47:41 +0200 (CEST) Subject: [Lxml-checkins] r29374 - lxml/branch/lxml-1.0/doc Message-ID: <20060626194741.C48F610080@code0.codespeak.net> Author: scoder Date: Mon Jun 26 21:47:40 2006 New Revision: 29374 Modified: lxml/branch/lxml-1.0/doc/api.txt Log: extended doctest Modified: lxml/branch/lxml-1.0/doc/api.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/api.txt (original) +++ lxml/branch/lxml-1.0/doc/api.txt Mon Jun 26 21:47:40 2006 @@ -85,6 +85,8 @@ d >>> print element.getparent().tag root + >>> print element.getroottree().getroot().tag + root The rule is that all operations that are applied to Elements use either the Element itself as reference point, or the absolute root of the document that From scoder at codespeak.net Mon Jun 26 21:49:56 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Mon, 26 Jun 2006 21:49:56 +0200 (CEST) Subject: [Lxml-checkins] r29375 - lxml/trunk/doc Message-ID: <20060626194956.5BF7510081@code0.codespeak.net> Author: scoder Date: Mon Jun 26 21:49:55 2006 New Revision: 29375 Modified: lxml/trunk/doc/api.txt Log: merged in extended doctest from lxml 1.0.2 Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Mon Jun 26 21:49:55 2006 @@ -87,6 +87,8 @@ >>> element = tree.getroot() >>> print element.getparent().tag root + >>> print element.getroottree().getroot().tag + root The rule is that all operations that are applied to Elements use either the Element itself as reference point, or the absolute root of the document that From scoder at codespeak.net Tue Jun 27 07:20:25 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:20:25 +0200 (CEST) Subject: [Lxml-checkins] r29378 - lxml/branch/lxml-1.0/doc Message-ID: <20060627052025.799121007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:20:21 2006 New Revision: 29378 Modified: lxml/branch/lxml-1.0/doc/api.txt Log: clarification in api.txt Modified: lxml/branch/lxml-1.0/doc/api.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/api.txt (original) +++ lxml/branch/lxml-1.0/doc/api.txt Tue Jun 27 07:20:21 2006 @@ -90,7 +90,8 @@ The rule is that all operations that are applied to Elements use either the Element itself as reference point, or the absolute root of the document that -contains this Element (e.g. for absolute XPath expressions). +contains this Element (e.g. for absolute XPath expressions). All operations +on an ElementTree use its explicit root node as reference. Parsers From scoder at codespeak.net Tue Jun 27 07:21:38 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:21:38 +0200 (CEST) Subject: [Lxml-checkins] r29379 - lxml/trunk/doc Message-ID: <20060627052138.144931007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:21:35 2006 New Revision: 29379 Modified: lxml/trunk/doc/api.txt Log: clarification in api.txt Modified: lxml/trunk/doc/api.txt ============================================================================== --- lxml/trunk/doc/api.txt (original) +++ lxml/trunk/doc/api.txt Tue Jun 27 07:21:35 2006 @@ -85,6 +85,8 @@ not modify their Elements:: >>> element = tree.getroot() + >>> print element.tag + d >>> print element.getparent().tag root >>> print element.getroottree().getroot().tag @@ -92,7 +94,8 @@ The rule is that all operations that are applied to Elements use either the Element itself as reference point, or the absolute root of the document that -contains this Element (e.g. for absolute XPath expressions). +contains this Element (e.g. for absolute XPath expressions). All operations +on an ElementTree use its explicit root node as reference. Iteration From scoder at codespeak.net Tue Jun 27 07:32:05 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:32:05 +0200 (CEST) Subject: [Lxml-checkins] r29380 - in lxml/branch/lxml-1.0: . doc src/lxml src/lxml/tests Message-ID: <20060627053205.646B41007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:32:03 2006 New Revision: 29380 Modified: lxml/branch/lxml-1.0/CHANGES.txt lxml/branch/lxml-1.0/doc/main.txt lxml/branch/lxml-1.0/doc/namespace_extensions.txt lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi lxml/branch/lxml-1.0/src/lxml/tests/test_nsclasses.py Log: merge from trunk: support for custom default Element class Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Tue Jun 27 07:32:03 2006 @@ -4,6 +4,12 @@ 1.0.2 (2006-06-26) ================== +Features added +-------------- + +* Support for setting a custom default Element class as opposed to namespace + specific classes (which still override the default class) + Bugs fixed ---------- Modified: lxml/branch/lxml-1.0/doc/main.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/main.txt (original) +++ lxml/branch/lxml-1.0/doc/main.txt Tue Jun 27 07:32:03 2006 @@ -98,9 +98,9 @@ `c14n`_. Python code can be called from XPath expressions and XSLT stylesheets through the use of `extension functions`_. -In addition to the ElementTree API, lxml also features an API for -`implementing namespaces`_ using tag specific element classes. This is a -simple way to write arbitrary XML driven APIs on top of lxml. +In addition to the ElementTree API, lxml also features a sophisticated API for +`custom element classes`_. This is a simple way to write arbitrary XML driven +APIs on top of lxml. lxml also offers a `SAX compliant API`_, that works with the SAX support in the standard library. @@ -112,7 +112,7 @@ .. _`ElementTree compatibility overview`: compatibility.html .. _`extends this API`: api.html .. _`extension functions`: extensions.html -.. _`implementing namespaces`: namespace_extensions.html +.. _`custom element classes`: namespace_extensions.html .. _`SAX compliant API`: sax.html .. _XPath: http://www.w3.org/TR/xpath Modified: lxml/branch/lxml-1.0/doc/namespace_extensions.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/namespace_extensions.txt (original) +++ lxml/branch/lxml-1.0/doc/namespace_extensions.txt Tue Jun 27 07:32:03 2006 @@ -1,12 +1,12 @@ -================================================ -Implementing namespaces with the Namespace class -================================================ +==================================== +Using custom Element classes in lxml +==================================== + +lxml has very sophisticated support for custom Element classes. You can +provide your own classes for Elements and have lxml use them by default or +only for a specific tag name in a specific namespace. -lxml allows you to implement namespaces, in a rather literal sense. You can -write your own classes for Elements and have lxml use them for a specific tag -name in a specific namespace. - -Custom Elements must inherit from the ``etree.ElementBase`` class, which +Custom Elements must inherit from the ``lxml.etree.ElementBase`` class, which provides the Element interface for subclasses:: >>> from lxml import etree @@ -17,15 +17,40 @@ This defines a new Element class ``HonkElement`` with a property ``honking``. -Note that you cannot (or rather must not) instantiate this class yourself. -lxml.etree will do that for you through its normal ElementTree API. To let -lxml know about it, you must register it with a namespace. +Note that you cannot (or rather *must not*) instantiate this class yourself. +lxml.etree will do that for you through its normal ElementTree API. + + +Changing the default element class +---------------------------------- +You can let lxml use your new class for every Element it generates:: + + >>> etree.setDefaultElementClass(HonkElement) + >>> el = etree.Element("myelement") + >>> print isinstance(el, HonkElement) + True + >>> el.honking + False + >>> el = etree.Element("myelement", honking='true') + >>> print etree.tostring(el) + + >>> el.honking + True -The Namespace class -------------------- +To reset lxml.etree to the original element class, pass ``None`` or nothing:: -You can build a new namespace (or retrieve an existing one) by calling the + >>> etree.setDefaultElementClass() + >>> el = etree.Element("myelement") + >>> print isinstance(el, HonkElement) + False + + +Implementing namespaces +----------------------- + +lxml allows you to implement namespaces, in a rather literal sense. You can +build a new element namespace (or retrieve an existing one) by calling the Namespace class:: >>> namespace = etree.Namespace('http://hui.de/honk') @@ -156,3 +181,6 @@ Traceback (most recent call last): ... AttributeError: 'HonkNSElement' object has no attribute 'honking' + +Note that you can also combine this with the global default class. Namespace +specific classes will simply override the less specific default. Modified: lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi (original) +++ lxml/branch/lxml-1.0/src/lxml/nsclasses.pxi Tue Jun 27 07:32:03 2006 @@ -1,10 +1,13 @@ # module-level API for namespace implementations -class NamespaceRegistryError(LxmlError): +class LxmlRegistryError(LxmlError): + pass + +class NamespaceRegistryError(LxmlRegistryError): pass cdef class ElementBase(_Element): - """All classes in namespace implementations must inherit from this one. + """All custom Element classes must inherit from this one. Note that subclasses *must not* override __init__ or __new__ as it is absolutely undefined when these objects will be created or destroyed. All @@ -13,6 +16,19 @@ ``_init(self)`` method that will be called after object creation. """ +def setDefaultElementClass(cls=None): + global __DEFAULT_ELEMENT_CLASS + if cls is None: + __DEFAULT_ELEMENT_CLASS = _Element + elif not python.PyType_Check(cls) or not issubclass(cls, ElementBase): + raise LxmlRegistryError, \ + "Registered element classes must be subtypes of ElementBase" + else: + __DEFAULT_ELEMENT_CLASS = cls + +cdef object __DEFAULT_ELEMENT_CLASS +__DEFAULT_ELEMENT_CLASS = _Element + cdef object __NAMESPACE_REGISTRIES __NAMESPACE_REGISTRIES = {} @@ -110,10 +126,9 @@ cdef class _ClassNamespaceRegistry(_NamespaceRegistry): "Dictionary-like registry for namespace implementation classes" def __setitem__(self, name, item): - if not python.PyType_Check(item) or \ - not issubclass(item, ElementBase): + if not python.PyType_Check(item) or not issubclass(item, ElementBase): raise NamespaceRegistryError, \ - "Registered item must be subtypes of ElementBase" + "Registered element classes must be subtypes of ElementBase" if name is not None: name = _utf8(name) self._entries[name] = item @@ -188,7 +203,7 @@ dict_result = python.PyDict_GetItem( __NAMESPACE_REGISTRIES, None) if dict_result is NULL: - return _Element + return __DEFAULT_ELEMENT_CLASS registry = <_NamespaceRegistry>dict_result classes = registry._entries @@ -205,4 +220,4 @@ if dict_result is not NULL: return dict_result else: - return _Element + return __DEFAULT_ELEMENT_CLASS Modified: lxml/branch/lxml-1.0/src/lxml/tests/test_nsclasses.py ============================================================================== --- lxml/branch/lxml-1.0/src/lxml/tests/test_nsclasses.py (original) +++ lxml/branch/lxml-1.0/src/lxml/tests/test_nsclasses.py Tue Jun 27 07:32:03 2006 @@ -67,7 +67,7 @@ etree.Namespace(u'ns11').clear() - def test_default_class(self): + def test_default_tagname(self): bluff_dict = { None : self.bluff_class, 'maeh' : self.maeh_class @@ -144,6 +144,25 @@ etree.Namespace(None).clear() etree.Namespace(u'ns30').clear() + def test_default_element_class(self): + class local_default_class(etree.ElementBase): + pass + + try: + etree.setDefaultElementClass(local_default_class) + self.assert_(isinstance(etree.Element("test"), + local_default_class)) + self.assert_(isinstance(etree.Element("{http://myns}test"), + local_default_class)) + + etree.setDefaultElementClass() + self.assertFalse(isinstance(etree.Element("test"), + local_default_class)) + self.assertFalse(isinstance(etree.Element("{http://myns}test"), + local_default_class)) + finally: + etree.setDefaultElementClass() + def test_suite(): suite = unittest.TestSuite() suite.addTests([unittest.makeSuite(ETreeNamespaceClassesTestCase)]) From scoder at codespeak.net Tue Jun 27 07:42:16 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:42:16 +0200 (CEST) Subject: [Lxml-checkins] r29381 - lxml/branch/lxml-1.0 Message-ID: <20060627054216.D50641007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:42:15 2006 New Revision: 29381 Modified: lxml/branch/lxml-1.0/CHANGES.txt Log: removed reference to 1.0.beta version from CHANGES.txt - alpha/beta versions will no longer stay in that file after final release Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Tue Jun 27 07:42:15 2006 @@ -62,9 +62,6 @@ Features added -------------- -See also the features added for lxml 1.0beta to find out more about what's -new. - * Element.getiterator() and the findall() methods support finding arbitrary elements from a namespace (pattern ``{namespace}*``) @@ -86,62 +83,6 @@ * Comment texts can be changed through the API -Bugs fixed ----------- - -* Memory leak in Element.__setitem__ - -* Memory leak in Element.attrib.items() and Element.attrib.values() - -* Memory leak in XPath extension functions - -* Memory leak in unicode related setup code - -* Element now raises ValueError on empty tag names - -* Namespace fixing after moving elements between documents could fail if the - source document was freed too early - -* Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't') - didn't reset the namespace - -* Unknown constants from newer libxml2 versions could raise exceptions in the - error handlers - -* lxml.etree compiles much faster - -* On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail - in certain cases - -* Document reference in ElementTree objects was not updated when the root - element was moved to a different document - -* Running absolute XPath expressions on an Element now evaluates against the - root tree - -* Evaluating absolute XPath expressions (``/*``) on an ElementTree could fail - -* Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree - objects - -* Removed public function ``initThreadLogging()``, replaced by more general - ``initThread()`` which fixes a number of setup problems in threads - -* Memory leak when using iconv encoders in tostring/write - -* Deep copying Elements and ElementTrees maintains the document information - -* Serialization functions raise LookupError for unknown encodings - -* Memory deallocation crash resulting from deep copying elements - - -1.0.beta (2006-05-18) -===================== - -Features added --------------- - * Formatted output via ``pretty_print`` keyword in serialization functions * XSLT can block access to file system and network via ``XSLTAccessControl`` @@ -194,6 +135,52 @@ Bugs fixed ---------- +* Memory leak in Element.__setitem__ + +* Memory leak in Element.attrib.items() and Element.attrib.values() + +* Memory leak in XPath extension functions + +* Memory leak in unicode related setup code + +* Element now raises ValueError on empty tag names + +* Namespace fixing after moving elements between documents could fail if the + source document was freed too early + +* Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't') + didn't reset the namespace + +* Unknown constants from newer libxml2 versions could raise exceptions in the + error handlers + +* lxml.etree compiles much faster + +* On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail + in certain cases + +* Document reference in ElementTree objects was not updated when the root + element was moved to a different document + +* Running absolute XPath expressions on an Element now evaluates against the + root tree + +* Evaluating absolute XPath expressions (``/*``) on an ElementTree could fail + +* Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree + objects + +* Removed public function ``initThreadLogging()``, replaced by more general + ``initThread()`` which fixes a number of setup problems in threads + +* Memory leak when using iconv encoders in tostring/write + +* Deep copying Elements and ElementTrees maintains the document information + +* Serialization functions raise LookupError for unknown encodings + +* Memory deallocation crash resulting from deep copying elements + * Some ElementTree methods could crash if the root node was not initialized (neither file nor element passed to the constructor) @@ -209,6 +196,7 @@ * Calling ``document('')`` in XSLT failed to return the stylesheet + 0.9.2 (2006-05-10) ================== From scoder at codespeak.net Tue Jun 27 07:46:18 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:46:18 +0200 (CEST) Subject: [Lxml-checkins] r29382 - lxml/trunk Message-ID: <20060627054618.954811007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:46:17 2006 New Revision: 29382 Modified: lxml/trunk/CHANGES.txt Log: removed reference to 1.0.beta version from CHANGES.txt - alpha/beta versions will no longer stay in that file after final release Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Tue Jun 27 07:46:17 2006 @@ -1,3 +1,4 @@ +============== lxml changelog ============== @@ -7,9 +8,6 @@ Features added -------------- -* Support for setting a custom default Element class as opposed to namespace - specific classes (which still override the default class) - * Module level ``iterwalk()`` function as 'iterparse' for trees * ElementTree compatible ``iterparse()`` module function @@ -51,6 +49,19 @@ Bugs fixed ---------- + +1.0.2 (2006-06-27) +================== + +Features added +-------------- + +* Support for setting a custom default Element class as opposed to namespace + specific classes (which still override the default class) + +Bugs fixed +---------- + * Rare exceptions in Python list functions were not handled * Parsing accepted unicode strings with XML encoding declaration in certain @@ -100,9 +111,6 @@ Features added -------------- -See also the features added for lxml 1.0beta to find out more about what's -new. - * Element.getiterator() and the findall() methods support finding arbitrary elements from a namespace (pattern ``{namespace}*``) @@ -124,62 +132,6 @@ * Comment texts can be changed through the API -Bugs fixed ----------- - -* Memory leak in Element.__setitem__ - -* Memory leak in Element.attrib.items() and Element.attrib.values() - -* Memory leak in XPath extension functions - -* Memory leak in unicode related setup code - -* Element now raises ValueError on empty tag names - -* Namespace fixing after moving elements between documents could fail if the - source document was freed too early - -* Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't') - didn't reset the namespace - -* Unknown constants from newer libxml2 versions could raise exceptions in the - error handlers - -* lxml.etree compiles much faster - -* On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail - in certain cases - -* Document reference in ElementTree objects was not updated when the root - element was moved to a different document - -* Running absolute XPath expressions on an Element now evaluates against the - root tree - -* Evaluating absolute XPath expressions (``/*``) on an ElementTree could fail - -* Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree - objects - -* Removed public function ``initThreadLogging()``, replaced by more general - ``initThread()`` which fixes a number of setup problems in threads - -* Memory leak when using iconv encoders in tostring/write - -* Deep copying Elements and ElementTrees maintains the document information - -* Serialization functions raise LookupError for unknown encodings - -* Memory deallocation crash resulting from deep copying elements - - -1.0.beta (2006-05-18) -===================== - -Features added --------------- - * Formatted output via ``pretty_print`` keyword in serialization functions * XSLT can block access to file system and network via ``XSLTAccessControl`` @@ -232,6 +184,52 @@ Bugs fixed ---------- +* Memory leak in Element.__setitem__ + +* Memory leak in Element.attrib.items() and Element.attrib.values() + +* Memory leak in XPath extension functions + +* Memory leak in unicode related setup code + +* Element now raises ValueError on empty tag names + +* Namespace fixing after moving elements between documents could fail if the + source document was freed too early + +* Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't') + didn't reset the namespace + +* Unknown constants from newer libxml2 versions could raise exceptions in the + error handlers + +* lxml.etree compiles much faster + +* On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail + in certain cases + +* Document reference in ElementTree objects was not updated when the root + element was moved to a different document + +* Running absolute XPath expressions on an Element now evaluates against the + root tree + +* Evaluating absolute XPath expressions (``/*``) on an ElementTree could fail + +* Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree + objects + +* Removed public function ``initThreadLogging()``, replaced by more general + ``initThread()`` which fixes a number of setup problems in threads + +* Memory leak when using iconv encoders in tostring/write + +* Deep copying Elements and ElementTrees maintains the document information + +* Serialization functions raise LookupError for unknown encodings + +* Memory deallocation crash resulting from deep copying elements + * Some ElementTree methods could crash if the root node was not initialized (neither file nor element passed to the constructor) @@ -247,6 +245,7 @@ * Calling ``document('')`` in XSLT failed to return the stylesheet + 0.9.2 (2006-05-10) ================== From scoder at codespeak.net Tue Jun 27 07:46:47 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:46:47 +0200 (CEST) Subject: [Lxml-checkins] r29383 - lxml/branch/lxml-1.0 Message-ID: <20060627054647.4741F1007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:46:46 2006 New Revision: 29383 Modified: lxml/branch/lxml-1.0/CHANGES.txt Log: small release fixes in CHANGES.txt Modified: lxml/branch/lxml-1.0/CHANGES.txt ============================================================================== --- lxml/branch/lxml-1.0/CHANGES.txt (original) +++ lxml/branch/lxml-1.0/CHANGES.txt Tue Jun 27 07:46:46 2006 @@ -1,7 +1,8 @@ +============== lxml changelog ============== -1.0.2 (2006-06-26) +1.0.2 (2006-06-27) ================== Features added From scoder at codespeak.net Tue Jun 27 07:47:59 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 07:47:59 +0200 (CEST) Subject: [Lxml-checkins] r29384 - lxml/trunk/doc Message-ID: <20060627054759.B02DF1007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 07:47:58 2006 New Revision: 29384 Modified: lxml/trunk/doc/namespace_extensions.txt Log: small ReST fix Modified: lxml/trunk/doc/namespace_extensions.txt ============================================================================== --- lxml/trunk/doc/namespace_extensions.txt (original) +++ lxml/trunk/doc/namespace_extensions.txt Tue Jun 27 07:47:58 2006 @@ -1,3 +1,4 @@ +==================================== Using custom Element classes in lxml ==================================== From scoder at codespeak.net Tue Jun 27 08:00:09 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 08:00:09 +0200 (CEST) Subject: [Lxml-checkins] r29385 - lxml/branch/lxml-1.0 Message-ID: <20060627060009.1A1151007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 08:00:07 2006 New Revision: 29385 Modified: lxml/branch/lxml-1.0/TODO.txt Log: clean up in TODO.txt Modified: lxml/branch/lxml-1.0/TODO.txt ============================================================================== --- lxml/branch/lxml-1.0/TODO.txt (original) +++ lxml/branch/lxml-1.0/TODO.txt Tue Jun 27 08:00:07 2006 @@ -4,8 +4,6 @@ Exposing libxml2 functionalities -------------------------------- -* potential threading issues in XPath extension functions? - * See whether XInclude support can mimic ElementTree's API. * Test XML entities, also in an ElementTree context. @@ -15,9 +13,7 @@ * test namespaces more in-depth -* will namespaces nodes of unknown namespaces be added (and never freed?) - -* iterparse support would be nice. +* will namespace nodes of unknown namespaces be added (and never freed?) Top level --------- @@ -35,6 +31,8 @@ QName ----- +* expose prefix support? + Features -------- From scoder at codespeak.net Tue Jun 27 08:00:33 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 08:00:33 +0200 (CEST) Subject: [Lxml-checkins] r29386 - lxml/branch/lxml-1.0/doc Message-ID: <20060627060033.E86241007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 08:00:33 2006 New Revision: 29386 Modified: lxml/branch/lxml-1.0/doc/main.txt Log: updated main.txt to prepare release of 1.0.2 Modified: lxml/branch/lxml-1.0/doc/main.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/main.txt (original) +++ lxml/branch/lxml-1.0/doc/main.txt Tue Jun 27 08:00:33 2006 @@ -29,6 +29,8 @@ .. _`installation instructions`: installation.html +* `lxml 1.0.2`_, released 2006-06-27 (`changes for 1.0.2`_) + * `lxml 1.0.1`_, released 2006-06-09 (`changes for 1.0.1`_) * `lxml 1.0`_, released 2006-06-01 (`changes for 1.0`_) @@ -49,6 +51,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 1.0.2`: lxml-1.0.2.tgz .. _`lxml 1.0.1`: lxml-1.0.1.tgz .. _`lxml 1.0`: lxml-1.0.tgz .. _`lxml 0.9.2`: lxml-0.9.2.tgz @@ -60,6 +63,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`CHANGES for 1.0.2`: changes-1.0.2.html .. _`CHANGES for 1.0.1`: changes-1.0.1.html .. _`CHANGES for 1.0`: changes-1.0.html .. _`CHANGES for 0.9.2`: changes-0.9.2.html From scoder at codespeak.net Tue Jun 27 08:07:21 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 08:07:21 +0200 (CEST) Subject: [Lxml-checkins] r29387 - in lxml/trunk: . doc Message-ID: <20060627060721.B87501007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 08:07:20 2006 New Revision: 29387 Modified: lxml/trunk/TODO.txt lxml/trunk/doc/main.txt Log: release merges from 1.0.2 Modified: lxml/trunk/TODO.txt ============================================================================== --- lxml/trunk/TODO.txt (original) +++ lxml/trunk/TODO.txt Tue Jun 27 08:07:20 2006 @@ -4,8 +4,6 @@ Exposing libxml2 functionalities -------------------------------- -* potential threading issues in XPath extension functions? - * See whether XInclude support can mimic ElementTree's API. * Test XML entities, also in an ElementTree context. @@ -15,7 +13,7 @@ * test namespaces more in-depth -* will namespaces nodes of unknown namespaces be added (and never freed?) +* will namespace nodes of unknown namespaces be added (and never freed?) Top level --------- @@ -33,6 +31,8 @@ QName ----- +* expose prefix support? + Features -------- Modified: lxml/trunk/doc/main.txt ============================================================================== --- lxml/trunk/doc/main.txt (original) +++ lxml/trunk/doc/main.txt Tue Jun 27 08:07:20 2006 @@ -29,6 +29,8 @@ .. _`installation instructions`: installation.html +* `lxml 1.0.2`_, released 2006-06-27 (`changes for 1.0.2`_) + * `lxml 1.0.1`_, released 2006-06-09 (`changes for 1.0.1`_) * `lxml 1.0`_, released 2006-06-01 (`changes for 1.0`_) @@ -49,6 +51,7 @@ * `lxml 0.5`_, released 2005-04-08 +.. _`lxml 1.0.2`: lxml-1.0.2.tgz .. _`lxml 1.0.1`: lxml-1.0.1.tgz .. _`lxml 1.0`: lxml-1.0.tgz .. _`lxml 0.9.2`: lxml-0.9.2.tgz @@ -60,6 +63,7 @@ .. _`lxml 0.5.1`: lxml-0.5.1.tgz .. _`lxml 0.5`: lxml-0.5.tgz +.. _`CHANGES for 1.0.2`: changes-1.0.2.html .. _`CHANGES for 1.0.1`: changes-1.0.1.html .. _`CHANGES for 1.0`: changes-1.0.html .. _`CHANGES for 0.9.2`: changes-0.9.2.html From scoder at codespeak.net Tue Jun 27 09:59:55 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 09:59:55 +0200 (CEST) Subject: [Lxml-checkins] r29388 - lxml/trunk Message-ID: <20060627075955.0B92B1007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 09:59:53 2006 New Revision: 29388 Modified: lxml/trunk/CHANGES.txt Log: mark 1.1alpha release in CHANGES.txt Modified: lxml/trunk/CHANGES.txt ============================================================================== --- lxml/trunk/CHANGES.txt (original) +++ lxml/trunk/CHANGES.txt Tue Jun 27 09:59:53 2006 @@ -2,8 +2,8 @@ lxml changelog ============== -current -======= +1.1alpha (2006-06-27) +===================== Features added -------------- From scoder at codespeak.net Tue Jun 27 10:01:13 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 10:01:13 +0200 (CEST) Subject: [Lxml-checkins] r29389 - lxml/tag/lxml-1.1alpha Message-ID: <20060627080113.5FBA31007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 10:01:12 2006 New Revision: 29389 Added: lxml/tag/lxml-1.1alpha/ - copied from r29388, lxml/trunk/ Log: tagged lxml 1.1alpha From scoder at codespeak.net Tue Jun 27 10:01:59 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 10:01:59 +0200 (CEST) Subject: [Lxml-checkins] r29390 - lxml/tag/lxml-1.0.2 Message-ID: <20060627080159.EFAC01007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 10:01:58 2006 New Revision: 29390 Added: lxml/tag/lxml-1.0.2/ - copied from r29389, lxml/branch/lxml-1.0/ Log: tagged lxml 1.0.2 From scoder at codespeak.net Tue Jun 27 10:02:17 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 10:02:17 +0200 (CEST) Subject: [Lxml-checkins] r29391 - lxml/trunk/doc Message-ID: <20060627080217.E4AB91007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 10:02:16 2006 New Revision: 29391 Modified: lxml/trunk/doc/compatibility.txt lxml/trunk/doc/extensions.txt lxml/trunk/doc/namespace_extensions.txt Log: ReST fixes and typos Modified: lxml/trunk/doc/compatibility.txt ============================================================================== --- lxml/trunk/doc/compatibility.txt (original) +++ lxml/trunk/doc/compatibility.txt Tue Jun 27 10:02:16 2006 @@ -48,7 +48,7 @@ as this conflicts with the characteristic encoding of Python unicode strings. -* ElementTree allows you to place an Element in two different trees as the +* ElementTree allows you to place an Element in two different trees at the same time. Thus, this:: a = Element('a') Modified: lxml/trunk/doc/extensions.txt ============================================================================== --- lxml/trunk/doc/extensions.txt (original) +++ lxml/trunk/doc/extensions.txt Tue Jun 27 10:02:16 2006 @@ -20,6 +20,15 @@ ... return "Got %d arguments." % len(args) +.. contents:: +.. + 1 The FunctionNamespace + 2 Global prefix assignment + 3 Evaluators and XSLT + 4 Evaluator-local extensions + 5 What to return from a function + + The FunctionNamespace --------------------- Modified: lxml/trunk/doc/namespace_extensions.txt ============================================================================== --- lxml/trunk/doc/namespace_extensions.txt (original) +++ lxml/trunk/doc/namespace_extensions.txt Tue Jun 27 10:02:16 2006 @@ -20,6 +20,13 @@ Note that you cannot (or rather *must not*) instantiate this class yourself. lxml.etree will do that for you through its normal ElementTree API. +.. contents:: +.. + 1 Changing the default element class + 2 Implementing namespaces + 3 Element initialization + 4 Default implementations + Changing the default element class ---------------------------------- From scoder at codespeak.net Tue Jun 27 10:04:44 2006 From: scoder at codespeak.net (scoder at codespeak.net) Date: Tue, 27 Jun 2006 10:04:44 +0200 (CEST) Subject: [Lxml-checkins] r29392 - lxml/branch/lxml-1.0/doc Message-ID: <20060627080444.1FB581007C@code0.codespeak.net> Author: scoder Date: Tue Jun 27 10:04:42 2006 New Revision: 29392 Modified: lxml/branch/lxml-1.0/doc/compatibility.txt lxml/branch/lxml-1.0/doc/extensions.txt lxml/branch/lxml-1.0/doc/namespace_extensions.txt Log: merged in ReST fixes and typo fixes from trunk Modified: lxml/branch/lxml-1.0/doc/compatibility.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/compatibility.txt (original) +++ lxml/branch/lxml-1.0/doc/compatibility.txt Tue Jun 27 10:04:42 2006 @@ -48,7 +48,7 @@ as this conflicts with the characteristic encoding of Python unicode strings. -* ElementTree allows you to place an Element in two different trees as the +* ElementTree allows you to place an Element in two different trees at the same time. Thus, this:: a = Element('a') Modified: lxml/branch/lxml-1.0/doc/extensions.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/extensions.txt (original) +++ lxml/branch/lxml-1.0/doc/extensions.txt Tue Jun 27 10:04:42 2006 @@ -20,6 +20,15 @@ ... return "Got %d arguments." % len(args) +.. contents:: +.. + 1 The FunctionNamespace + 2 Global prefix assignment + 3 Evaluators and XSLT + 4 Evaluator-local extensions + 5 What to return from a function + + The FunctionNamespace --------------------- Modified: lxml/branch/lxml-1.0/doc/namespace_extensions.txt ============================================================================== --- lxml/branch/lxml-1.0/doc/namespace_extensions.txt (original) +++ lxml/branch/lxml-1.0/doc/namespace_extensions.txt Tue Jun 27 10:04:42 2006 @@ -20,6 +20,13 @@ Note that you cannot (or rather *must not*) instantiate this class yourself. lxml.etree will do that for you through its normal ElementTree API. +.. contents:: +.. + 1 Changing the default element class + 2 Implementing namespaces + 3 Element initialization + 4 Default implementations + Changing the default element class ----------------------------------