| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # ElementTree | 
					
						
							| 
									
										
											  
											
												Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r78838 | florent.xicluna | 2010-03-11 15:36:19 +0100 (jeu, 11 mar 2010) | 2 lines
  Issue #6472: The xml.etree package is updated to ElementTree 1.3.  The cElementTree module is updated too.
........
  r78839 | florent.xicluna | 2010-03-11 16:55:11 +0100 (jeu, 11 mar 2010) | 2 lines
  Fix repr of tree Element on windows.
........
  r78917 | florent.xicluna | 2010-03-13 12:18:49 +0100 (sam, 13 mar 2010) | 2 lines
  Move the xml test data to their own directory.
........
  r78919 | florent.xicluna | 2010-03-13 13:41:48 +0100 (sam, 13 mar 2010) | 2 lines
  Do not chdir when running test_xml_etree, and enhance the findfile helper.
........
  r78934 | florent.xicluna | 2010-03-13 18:56:19 +0100 (sam, 13 mar 2010) | 2 lines
  Update some parts of the xml.etree documentation.
........
  r78937 | florent.xicluna | 2010-03-13 21:30:15 +0100 (sam, 13 mar 2010) | 3 lines
  Add the keyword argument "method=None" to the .write() method and the tostring/tostringlist functions.
  Update the function, class and method signatures, according to the new convention.
........
											
										 
											2010-03-13 23:24:31 +00:00
										 |  |  | # $Id: ElementInclude.py 3375 2008-02-13 08:05:08Z fredrik $ | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # limited xinclude support for element trees | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # history: | 
					
						
							|  |  |  | # 2003-08-15 fl   created | 
					
						
							|  |  |  | # 2003-11-14 fl   fixed default loader | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright (c) 2003-2004 by Fredrik Lundh.  All rights reserved. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # fredrik@pythonware.com | 
					
						
							|  |  |  | # http://www.pythonware.com | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # -------------------------------------------------------------------- | 
					
						
							|  |  |  | # The ElementTree toolkit is | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
											  
											
												Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r78838 | florent.xicluna | 2010-03-11 15:36:19 +0100 (jeu, 11 mar 2010) | 2 lines
  Issue #6472: The xml.etree package is updated to ElementTree 1.3.  The cElementTree module is updated too.
........
  r78839 | florent.xicluna | 2010-03-11 16:55:11 +0100 (jeu, 11 mar 2010) | 2 lines
  Fix repr of tree Element on windows.
........
  r78917 | florent.xicluna | 2010-03-13 12:18:49 +0100 (sam, 13 mar 2010) | 2 lines
  Move the xml test data to their own directory.
........
  r78919 | florent.xicluna | 2010-03-13 13:41:48 +0100 (sam, 13 mar 2010) | 2 lines
  Do not chdir when running test_xml_etree, and enhance the findfile helper.
........
  r78934 | florent.xicluna | 2010-03-13 18:56:19 +0100 (sam, 13 mar 2010) | 2 lines
  Update some parts of the xml.etree documentation.
........
  r78937 | florent.xicluna | 2010-03-13 21:30:15 +0100 (sam, 13 mar 2010) | 3 lines
  Add the keyword argument "method=None" to the .write() method and the tostring/tostringlist functions.
  Update the function, class and method signatures, according to the new convention.
........
											
										 
											2010-03-13 23:24:31 +00:00
										 |  |  | # Copyright (c) 1999-2008 by Fredrik Lundh | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # By obtaining, using, and/or copying this software and/or its | 
					
						
							|  |  |  | # associated documentation, you agree that you have read, understood, | 
					
						
							|  |  |  | # and will comply with the following terms and conditions: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Permission to use, copy, modify, and distribute this software and | 
					
						
							|  |  |  | # its associated documentation for any purpose and without fee is | 
					
						
							|  |  |  | # hereby granted, provided that the above copyright notice appears in | 
					
						
							|  |  |  | # all copies, and that both that copyright notice and this permission | 
					
						
							|  |  |  | # notice appear in supporting documentation, and that the name of | 
					
						
							|  |  |  | # Secret Labs AB or the author not be used in advertising or publicity | 
					
						
							|  |  |  | # pertaining to distribution of the software without specific, written | 
					
						
							|  |  |  | # prior permission. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | 
					
						
							|  |  |  | # TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- | 
					
						
							|  |  |  | # ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR | 
					
						
							|  |  |  | # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY | 
					
						
							|  |  |  | # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | 
					
						
							|  |  |  | # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | 
					
						
							|  |  |  | # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | 
					
						
							|  |  |  | # OF THIS SOFTWARE. | 
					
						
							|  |  |  | # -------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-14 22:29:34 +00:00
										 |  |  | # Licensed to PSF under a Contributor Agreement. | 
					
						
							| 
									
										
											  
											
												Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r78838 | florent.xicluna | 2010-03-11 15:36:19 +0100 (jeu, 11 mar 2010) | 2 lines
  Issue #6472: The xml.etree package is updated to ElementTree 1.3.  The cElementTree module is updated too.
........
  r78839 | florent.xicluna | 2010-03-11 16:55:11 +0100 (jeu, 11 mar 2010) | 2 lines
  Fix repr of tree Element on windows.
........
  r78917 | florent.xicluna | 2010-03-13 12:18:49 +0100 (sam, 13 mar 2010) | 2 lines
  Move the xml test data to their own directory.
........
  r78919 | florent.xicluna | 2010-03-13 13:41:48 +0100 (sam, 13 mar 2010) | 2 lines
  Do not chdir when running test_xml_etree, and enhance the findfile helper.
........
  r78934 | florent.xicluna | 2010-03-13 18:56:19 +0100 (sam, 13 mar 2010) | 2 lines
  Update some parts of the xml.etree documentation.
........
  r78937 | florent.xicluna | 2010-03-13 21:30:15 +0100 (sam, 13 mar 2010) | 3 lines
  Add the keyword argument "method=None" to the .write() method and the tostring/tostringlist functions.
  Update the function, class and method signatures, according to the new convention.
........
											
										 
											2010-03-13 23:24:31 +00:00
										 |  |  | # See http://www.python.org/psf/license for licensing details. | 
					
						
							| 
									
										
										
										
											2005-12-14 22:29:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | ## | 
					
						
							|  |  |  | # Limited XInclude support for the ElementTree package. | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import copy | 
					
						
							| 
									
										
										
										
											2006-08-21 20:54:38 +00:00
										 |  |  | from . import ElementTree | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE = "{http://www.w3.org/2001/XInclude}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE_INCLUDE = XINCLUDE + "include" | 
					
						
							|  |  |  | XINCLUDE_FALLBACK = XINCLUDE + "fallback" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | # Fatal include error. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FatalIncludeError(SyntaxError): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | # Default loader.  This loader reads an included resource from disk. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @param href Resource reference. | 
					
						
							|  |  |  | # @param parse Parse mode.  Either "xml" or "text". | 
					
						
							| 
									
										
										
										
											2011-06-30 18:10:14 +02:00
										 |  |  | # @param encoding Optional text encoding (UTF-8 by default for "text"). | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | # @return The expanded resource.  If the parse mode is "xml", this | 
					
						
							|  |  |  | #    is an ElementTree instance.  If the parse mode is "text", this | 
					
						
							|  |  |  | #    is a Unicode string.  If the loader fails, it can return None | 
					
						
							| 
									
										
										
										
											2012-12-25 16:47:37 +02:00
										 |  |  | #    or raise an OSError exception. | 
					
						
							|  |  |  | # @throws OSError If the loader fails to load the resource. | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def default_loader(href, parse, encoding=None): | 
					
						
							|  |  |  |     if parse == "xml": | 
					
						
							| 
									
										
										
										
											2011-06-30 18:10:14 +02:00
										 |  |  |         file = open(href, 'rb') | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  |         data = ElementTree.parse(file).getroot() | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2011-06-30 18:10:14 +02:00
										 |  |  |         if not encoding: | 
					
						
							|  |  |  |             encoding = 'UTF-8' | 
					
						
							|  |  |  |         file = open(href, 'r', encoding=encoding) | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  |         data = file.read() | 
					
						
							|  |  |  |     file.close() | 
					
						
							|  |  |  |     return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | # Expand XInclude directives. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @param elem Root element. | 
					
						
							|  |  |  | # @param loader Optional resource loader.  If omitted, it defaults | 
					
						
							|  |  |  | #     to {@link default_loader}.  If given, it should be a callable | 
					
						
							|  |  |  | #     that implements the same interface as <b>default_loader</b>. | 
					
						
							|  |  |  | # @throws FatalIncludeError If the function fails to include a given | 
					
						
							|  |  |  | #     resource, or if the tree contains malformed XInclude elements. | 
					
						
							| 
									
										
										
										
											2012-12-25 16:47:37 +02:00
										 |  |  | # @throws OSError If the function fails to load a given resource. | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def include(elem, loader=None): | 
					
						
							|  |  |  |     if loader is None: | 
					
						
							|  |  |  |         loader = default_loader | 
					
						
							|  |  |  |     # look for xinclude elements | 
					
						
							|  |  |  |     i = 0 | 
					
						
							|  |  |  |     while i < len(elem): | 
					
						
							|  |  |  |         e = elem[i] | 
					
						
							|  |  |  |         if e.tag == XINCLUDE_INCLUDE: | 
					
						
							|  |  |  |             # process xinclude directive | 
					
						
							|  |  |  |             href = e.get("href") | 
					
						
							|  |  |  |             parse = e.get("parse", "xml") | 
					
						
							|  |  |  |             if parse == "xml": | 
					
						
							|  |  |  |                 node = loader(href, parse) | 
					
						
							|  |  |  |                 if node is None: | 
					
						
							|  |  |  |                     raise FatalIncludeError( | 
					
						
							|  |  |  |                         "cannot load %r as %r" % (href, parse) | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                 node = copy.copy(node) | 
					
						
							|  |  |  |                 if e.tail: | 
					
						
							|  |  |  |                     node.tail = (node.tail or "") + e.tail | 
					
						
							|  |  |  |                 elem[i] = node | 
					
						
							|  |  |  |             elif parse == "text": | 
					
						
							|  |  |  |                 text = loader(href, parse, e.get("encoding")) | 
					
						
							|  |  |  |                 if text is None: | 
					
						
							|  |  |  |                     raise FatalIncludeError( | 
					
						
							|  |  |  |                         "cannot load %r as %r" % (href, parse) | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                 if i: | 
					
						
							|  |  |  |                     node = elem[i-1] | 
					
						
							| 
									
										
										
										
											2010-08-08 23:08:41 +00:00
										 |  |  |                     node.tail = (node.tail or "") + text + (e.tail or "") | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     elem.text = (elem.text or "") + text + (e.tail or "") | 
					
						
							|  |  |  |                 del elem[i] | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 raise FatalIncludeError( | 
					
						
							|  |  |  |                     "unknown parse type in xi:include tag (%r)" % parse | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |         elif e.tag == XINCLUDE_FALLBACK: | 
					
						
							|  |  |  |             raise FatalIncludeError( | 
					
						
							|  |  |  |                 "xi:fallback tag must be child of xi:include (%r)" % e.tag | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             include(e, loader) | 
					
						
							|  |  |  |         i = i + 1 |