mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			346 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			346 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# xmlcore.etree test.  This file contains enough tests to make sure that
 | 
						|
# all included components work as they should.  For a more extensive
 | 
						|
# test suite, see the selftest script in the ElementTree distribution.
 | 
						|
 | 
						|
import doctest, sys
 | 
						|
 | 
						|
from test import test_support
 | 
						|
 | 
						|
from xmlcore.etree import ElementTree as ET
 | 
						|
 | 
						|
SAMPLE_XML = """
 | 
						|
<body>
 | 
						|
  <tag>text</tag>
 | 
						|
  <tag />
 | 
						|
  <section>
 | 
						|
    <tag>subtext</tag>
 | 
						|
  </section>
 | 
						|
</body>
 | 
						|
"""
 | 
						|
 | 
						|
SAMPLE_XML_NS = """
 | 
						|
<body xmlns="http://effbot.org/ns">
 | 
						|
  <tag>text</tag>
 | 
						|
  <tag />
 | 
						|
  <section>
 | 
						|
    <tag>subtext</tag>
 | 
						|
  </section>
 | 
						|
</body>
 | 
						|
"""
 | 
						|
 | 
						|
def sanity():
 | 
						|
    """
 | 
						|
    Import sanity.
 | 
						|
 | 
						|
    >>> from xmlcore.etree import ElementTree
 | 
						|
    >>> from xmlcore.etree import ElementInclude
 | 
						|
    >>> from xmlcore.etree import ElementPath
 | 
						|
    """
 | 
						|
 | 
						|
def check_method(method):
 | 
						|
    if not callable(method):
 | 
						|
        print method, "not callable"
 | 
						|
 | 
						|
def serialize(ET, elem, encoding=None):
 | 
						|
    import StringIO
 | 
						|
    file = StringIO.StringIO()
 | 
						|
    tree = ET.ElementTree(elem)
 | 
						|
    if encoding:
 | 
						|
        tree.write(file, encoding)
 | 
						|
    else:
 | 
						|
        tree.write(file)
 | 
						|
    return file.getvalue()
 | 
						|
 | 
						|
def summarize(elem):
 | 
						|
    return elem.tag
 | 
						|
 | 
						|
def summarize_list(seq):
 | 
						|
    return map(summarize, seq)
 | 
						|
 | 
						|
def interface():
 | 
						|
    """
 | 
						|
    Test element tree interface.
 | 
						|
 | 
						|
    >>> element = ET.Element("tag", key="value")
 | 
						|
    >>> tree = ET.ElementTree(element)
 | 
						|
 | 
						|
    Make sure all standard element methods exist.
 | 
						|
 | 
						|
    >>> check_method(element.append)
 | 
						|
    >>> check_method(element.insert)
 | 
						|
    >>> check_method(element.remove)
 | 
						|
    >>> check_method(element.getchildren)
 | 
						|
    >>> check_method(element.find)
 | 
						|
    >>> check_method(element.findall)
 | 
						|
    >>> check_method(element.findtext)
 | 
						|
    >>> check_method(element.clear)
 | 
						|
    >>> check_method(element.get)
 | 
						|
    >>> check_method(element.set)
 | 
						|
    >>> check_method(element.keys)
 | 
						|
    >>> check_method(element.items)
 | 
						|
    >>> check_method(element.getiterator)
 | 
						|
 | 
						|
    Basic method sanity checks.
 | 
						|
 | 
						|
    >>> serialize(ET, element) # 1
 | 
						|
    '<tag key="value" />'
 | 
						|
    >>> subelement = ET.Element("subtag")
 | 
						|
    >>> element.append(subelement)
 | 
						|
    >>> serialize(ET, element) #  2
 | 
						|
    '<tag key="value"><subtag /></tag>'
 | 
						|
    >>> element.insert(0, subelement)
 | 
						|
    >>> serialize(ET, element) # 3
 | 
						|
    '<tag key="value"><subtag /><subtag /></tag>'
 | 
						|
    >>> element.remove(subelement)
 | 
						|
    >>> serialize(ET, element) # 4
 | 
						|
    '<tag key="value"><subtag /></tag>'
 | 
						|
    >>> element.remove(subelement)
 | 
						|
    >>> serialize(ET, element) # 5
 | 
						|
    '<tag key="value" />'
 | 
						|
    >>> element.remove(subelement)
 | 
						|
    Traceback (most recent call last):
 | 
						|
    ValueError: list.remove(x): x not in list
 | 
						|
    >>> serialize(ET, element) # 6
 | 
						|
    '<tag key="value" />'
 | 
						|
    """
 | 
						|
 | 
						|
def find():
 | 
						|
    """
 | 
						|
    Test find methods (including xpath syntax).
 | 
						|
 | 
						|
    >>> elem = ET.XML(SAMPLE_XML)
 | 
						|
    >>> elem.find("tag").tag
 | 
						|
    'tag'
 | 
						|
    >>> ET.ElementTree(elem).find("tag").tag
 | 
						|
    'tag'
 | 
						|
    >>> elem.find("section/tag").tag
 | 
						|
    'tag'
 | 
						|
    >>> ET.ElementTree(elem).find("section/tag").tag
 | 
						|
    'tag'
 | 
						|
    >>> elem.findtext("tag")
 | 
						|
    'text'
 | 
						|
    >>> elem.findtext("tog")
 | 
						|
    >>> elem.findtext("tog", "default")
 | 
						|
    'default'
 | 
						|
    >>> ET.ElementTree(elem).findtext("tag")
 | 
						|
    'text'
 | 
						|
    >>> elem.findtext("section/tag")
 | 
						|
    'subtext'
 | 
						|
    >>> ET.ElementTree(elem).findtext("section/tag")
 | 
						|
    'subtext'
 | 
						|
    >>> summarize_list(elem.findall("tag"))
 | 
						|
    ['tag', 'tag']
 | 
						|
    >>> summarize_list(elem.findall("*"))
 | 
						|
    ['tag', 'tag', 'section']
 | 
						|
    >>> summarize_list(elem.findall(".//tag"))
 | 
						|
    ['tag', 'tag', 'tag']
 | 
						|
    >>> summarize_list(elem.findall("section/tag"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("section//tag"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("section/*"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("section//*"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("section/.//*"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("*/*"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("*//*"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("*/tag"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("*/./tag"))
 | 
						|
    ['tag']
 | 
						|
    >>> summarize_list(elem.findall("./tag"))
 | 
						|
    ['tag', 'tag']
 | 
						|
    >>> summarize_list(elem.findall(".//tag"))
 | 
						|
    ['tag', 'tag', 'tag']
 | 
						|
    >>> summarize_list(elem.findall("././tag"))
 | 
						|
    ['tag', 'tag']
 | 
						|
    >>> summarize_list(ET.ElementTree(elem).findall("/tag"))
 | 
						|
    ['tag', 'tag']
 | 
						|
    >>> summarize_list(ET.ElementTree(elem).findall("./tag"))
 | 
						|
    ['tag', 'tag']
 | 
						|
    >>> elem = ET.XML(SAMPLE_XML_NS)
 | 
						|
    >>> summarize_list(elem.findall("tag"))
 | 
						|
    []
 | 
						|
    >>> summarize_list(elem.findall("{http://effbot.org/ns}tag"))
 | 
						|
    ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']
 | 
						|
    >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag"))
 | 
						|
    ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']
 | 
						|
    """
 | 
						|
 | 
						|
def parseliteral():
 | 
						|
    r"""
 | 
						|
 | 
						|
    >>> element = ET.XML("<html><body>text</body></html>")
 | 
						|
    >>> ET.ElementTree(element).write(sys.stdout)
 | 
						|
    <html><body>text</body></html>
 | 
						|
    >>> element = ET.fromstring("<html><body>text</body></html>")
 | 
						|
    >>> ET.ElementTree(element).write(sys.stdout)
 | 
						|
    <html><body>text</body></html>
 | 
						|
    >>> print ET.tostring(element)
 | 
						|
    <html><body>text</body></html>
 | 
						|
    >>> print ET.tostring(element, "ascii")
 | 
						|
    <?xml version='1.0' encoding='ascii'?>
 | 
						|
    <html><body>text</body></html>
 | 
						|
    >>> _, ids = ET.XMLID("<html><body>text</body></html>")
 | 
						|
    >>> len(ids)
 | 
						|
    0
 | 
						|
    >>> _, ids = ET.XMLID("<html><body id='body'>text</body></html>")
 | 
						|
    >>> len(ids)
 | 
						|
    1
 | 
						|
    >>> ids["body"].tag
 | 
						|
    'body'
 | 
						|
    """
 | 
						|
 | 
						|
def check_encoding(encoding):
 | 
						|
    """
 | 
						|
    >>> check_encoding("ascii")
 | 
						|
    >>> check_encoding("us-ascii")
 | 
						|
    >>> check_encoding("iso-8859-1")
 | 
						|
    >>> check_encoding("iso-8859-15")
 | 
						|
    >>> check_encoding("cp437")
 | 
						|
    >>> check_encoding("mac-roman")
 | 
						|
    """
 | 
						|
    ET.XML(
 | 
						|
        "<?xml version='1.0' encoding='%s'?><xml />" % encoding
 | 
						|
        )
 | 
						|
 | 
						|
#
 | 
						|
# xinclude tests (samples from appendix C of the xinclude specification)
 | 
						|
 | 
						|
XINCLUDE = {}
 | 
						|
 | 
						|
XINCLUDE["C1.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<document xmlns:xi="http://www.w3.org/2001/XInclude">
 | 
						|
  <p>120 Mz is adequate for an average home user.</p>
 | 
						|
  <xi:include href="disclaimer.xml"/>
 | 
						|
</document>
 | 
						|
"""
 | 
						|
 | 
						|
XINCLUDE["disclaimer.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<disclaimer>
 | 
						|
  <p>The opinions represented herein represent those of the individual
 | 
						|
  and should not be interpreted as official policy endorsed by this
 | 
						|
  organization.</p>
 | 
						|
</disclaimer>
 | 
						|
"""
 | 
						|
 | 
						|
XINCLUDE["C2.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<document xmlns:xi="http://www.w3.org/2001/XInclude">
 | 
						|
  <p>This document has been accessed
 | 
						|
  <xi:include href="count.txt" parse="text"/> times.</p>
 | 
						|
</document>
 | 
						|
"""
 | 
						|
 | 
						|
XINCLUDE["count.txt"] = "324387"
 | 
						|
 | 
						|
XINCLUDE["C3.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<document xmlns:xi="http://www.w3.org/2001/XInclude">
 | 
						|
  <p>The following is the source of the "data.xml" resource:</p>
 | 
						|
  <example><xi:include href="data.xml" parse="text"/></example>
 | 
						|
</document>
 | 
						|
"""
 | 
						|
 | 
						|
XINCLUDE["data.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<data>
 | 
						|
  <item><![CDATA[Brooks & Shields]]></item>
 | 
						|
</data>
 | 
						|
"""
 | 
						|
 | 
						|
XINCLUDE["C5.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<div xmlns:xi="http://www.w3.org/2001/XInclude">
 | 
						|
  <xi:include href="example.txt" parse="text">
 | 
						|
    <xi:fallback>
 | 
						|
      <xi:include href="fallback-example.txt" parse="text">
 | 
						|
        <xi:fallback><a href="mailto:bob@example.org">Report error</a></xi:fallback>
 | 
						|
      </xi:include>
 | 
						|
    </xi:fallback>
 | 
						|
  </xi:include>
 | 
						|
</div>
 | 
						|
"""
 | 
						|
 | 
						|
XINCLUDE["default.xml"] = """\
 | 
						|
<?xml version='1.0'?>
 | 
						|
<document xmlns:xi="http://www.w3.org/2001/XInclude">
 | 
						|
  <p>Example.</p>
 | 
						|
  <xi:include href="samples/simple.xml"/>
 | 
						|
</document>
 | 
						|
"""
 | 
						|
 | 
						|
def xinclude_loader(href, parse="xml", encoding=None):
 | 
						|
    try:
 | 
						|
        data = XINCLUDE[href]
 | 
						|
    except KeyError:
 | 
						|
        raise IOError("resource not found")
 | 
						|
    if parse == "xml":
 | 
						|
        return ET.XML(data)
 | 
						|
    return data
 | 
						|
 | 
						|
def xinclude():
 | 
						|
    r"""
 | 
						|
    Basic inclusion example (XInclude C.1)
 | 
						|
 | 
						|
    >>> from xmlcore.etree import ElementInclude
 | 
						|
 | 
						|
    >>> document = xinclude_loader("C1.xml")
 | 
						|
    >>> ElementInclude.include(document, xinclude_loader)
 | 
						|
    >>> print serialize(ET, document) # C1
 | 
						|
    <document>
 | 
						|
      <p>120 Mz is adequate for an average home user.</p>
 | 
						|
      <disclaimer>
 | 
						|
      <p>The opinions represented herein represent those of the individual
 | 
						|
      and should not be interpreted as official policy endorsed by this
 | 
						|
      organization.</p>
 | 
						|
    </disclaimer>
 | 
						|
    </document>
 | 
						|
 | 
						|
    Textual inclusion example (XInclude C.2)
 | 
						|
 | 
						|
    >>> document = xinclude_loader("C2.xml")
 | 
						|
    >>> ElementInclude.include(document, xinclude_loader)
 | 
						|
    >>> print serialize(ET, document) # C2
 | 
						|
    <document>
 | 
						|
      <p>This document has been accessed
 | 
						|
      324387 times.</p>
 | 
						|
    </document>
 | 
						|
 | 
						|
    Textual inclusion of XML example (XInclude C.3)
 | 
						|
 | 
						|
    >>> document = xinclude_loader("C3.xml")
 | 
						|
    >>> ElementInclude.include(document, xinclude_loader)
 | 
						|
    >>> print serialize(ET, document) # C3
 | 
						|
    <document>
 | 
						|
      <p>The following is the source of the "data.xml" resource:</p>
 | 
						|
      <example><?xml version='1.0'?>
 | 
						|
    <data>
 | 
						|
      <item><![CDATA[Brooks & Shields]]></item>
 | 
						|
    </data>
 | 
						|
    </example>
 | 
						|
    </document>
 | 
						|
 | 
						|
    Fallback example (XInclude C.5)
 | 
						|
    Note! Fallback support is not yet implemented
 | 
						|
 | 
						|
    >>> document = xinclude_loader("C5.xml")
 | 
						|
    >>> ElementInclude.include(document, xinclude_loader)
 | 
						|
    Traceback (most recent call last):
 | 
						|
    IOError: resource not found
 | 
						|
    >>> # print serialize(ET, document) # C5
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
def test_main():
 | 
						|
    from test import test_xml_etree
 | 
						|
    test_support.run_doctest(test_xml_etree, verbosity=True)
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    test_main()
 |