<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># xml.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
import sys

from test import support

SAMPLE_XML = """
&lt;body&gt;
  &lt;tag&gt;text&lt;/tag&gt;
  &lt;tag /&gt;
  &lt;section&gt;
    &lt;tag&gt;subtext&lt;/tag&gt;
  &lt;/section&gt;
&lt;/body&gt;
"""

SAMPLE_XML_NS = """
&lt;body xmlns="http://effbot.org/ns"&gt;
  &lt;tag&gt;text&lt;/tag&gt;
  &lt;tag /&gt;
  &lt;section&gt;
    &lt;tag&gt;subtext&lt;/tag&gt;
  &lt;/section&gt;
&lt;/body&gt;
"""

def sanity():
    """
    Import sanity.

    &gt;&gt;&gt; from xml.etree import ElementTree
    &gt;&gt;&gt; from xml.etree import ElementInclude
    &gt;&gt;&gt; from xml.etree import ElementPath
    """

def check_method(method):
    if not hasattr(method, '__call__'):
        print(method, "not callable")

def serialize(ET, elem):
    import io
    tree = ET.ElementTree(elem)
    file = io.StringIO()
    tree.write(file)
    return file.getvalue()

def summarize(elem):
    return elem.tag

def summarize_list(seq):
    return list(map(summarize, seq))

def interface():
    """
    Test element tree interface.

    &gt;&gt;&gt; from xml.etree import ElementTree as ET

    &gt;&gt;&gt; element = ET.Element("tag", key="value")
    &gt;&gt;&gt; tree = ET.ElementTree(element)

    Make sure all standard element methods exist.

    &gt;&gt;&gt; check_method(element.append)
    &gt;&gt;&gt; check_method(element.insert)
    &gt;&gt;&gt; check_method(element.remove)
    &gt;&gt;&gt; check_method(element.getchildren)
    &gt;&gt;&gt; check_method(element.find)
    &gt;&gt;&gt; check_method(element.findall)
    &gt;&gt;&gt; check_method(element.findtext)
    &gt;&gt;&gt; check_method(element.clear)
    &gt;&gt;&gt; check_method(element.get)
    &gt;&gt;&gt; check_method(element.set)
    &gt;&gt;&gt; check_method(element.keys)
    &gt;&gt;&gt; check_method(element.items)
    &gt;&gt;&gt; check_method(element.getiterator)

    Basic method sanity checks.

    &gt;&gt;&gt; serialize(ET, element) # 1
    '&lt;tag key="value" /&gt;'
    &gt;&gt;&gt; subelement = ET.Element("subtag")
    &gt;&gt;&gt; element.append(subelement)
    &gt;&gt;&gt; serialize(ET, element) #  2
    '&lt;tag key="value"&gt;&lt;subtag /&gt;&lt;/tag&gt;'
    &gt;&gt;&gt; element.insert(0, subelement)
    &gt;&gt;&gt; serialize(ET, element) # 3
    '&lt;tag key="value"&gt;&lt;subtag /&gt;&lt;subtag /&gt;&lt;/tag&gt;'
    &gt;&gt;&gt; element.remove(subelement)
    &gt;&gt;&gt; serialize(ET, element) # 4
    '&lt;tag key="value"&gt;&lt;subtag /&gt;&lt;/tag&gt;'
    &gt;&gt;&gt; element.remove(subelement)
    &gt;&gt;&gt; serialize(ET, element) # 5
    '&lt;tag key="value" /&gt;'
    &gt;&gt;&gt; element.remove(subelement)
    Traceback (most recent call last):
    ValueError: list.remove(x): x not in list
    &gt;&gt;&gt; serialize(ET, element) # 6
    '&lt;tag key="value" /&gt;'
    """

def find():
    """
    Test find methods (including xpath syntax).

    &gt;&gt;&gt; from xml.etree import ElementTree as ET

    &gt;&gt;&gt; elem = ET.XML(SAMPLE_XML)
    &gt;&gt;&gt; elem.find("tag").tag
    'tag'
    &gt;&gt;&gt; ET.ElementTree(elem).find("tag").tag
    'tag'
    &gt;&gt;&gt; elem.find("section/tag").tag
    'tag'
    &gt;&gt;&gt; ET.ElementTree(elem).find("section/tag").tag
    'tag'
    &gt;&gt;&gt; elem.findtext("tag")
    'text'
    &gt;&gt;&gt; elem.findtext("tog")
    &gt;&gt;&gt; elem.findtext("tog", "default")
    'default'
    &gt;&gt;&gt; ET.ElementTree(elem).findtext("tag")
    'text'
    &gt;&gt;&gt; elem.findtext("section/tag")
    'subtext'
    &gt;&gt;&gt; ET.ElementTree(elem).findtext("section/tag")
    'subtext'
    &gt;&gt;&gt; summarize_list(elem.findall("tag"))
    ['tag', 'tag']
    &gt;&gt;&gt; summarize_list(elem.findall("*"))
    ['tag', 'tag', 'section']
    &gt;&gt;&gt; summarize_list(elem.findall(".//tag"))
    ['tag', 'tag', 'tag']
    &gt;&gt;&gt; summarize_list(elem.findall("section/tag"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("section//tag"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("section/*"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("section//*"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("section/.//*"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("*/*"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("*//*"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("*/tag"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("*/./tag"))
    ['tag']
    &gt;&gt;&gt; summarize_list(elem.findall("./tag"))
    ['tag', 'tag']
    &gt;&gt;&gt; summarize_list(elem.findall(".//tag"))
    ['tag', 'tag', 'tag']
    &gt;&gt;&gt; summarize_list(elem.findall("././tag"))
    ['tag', 'tag']
    &gt;&gt;&gt; summarize_list(ET.ElementTree(elem).findall("/tag"))
    ['tag', 'tag']
    &gt;&gt;&gt; summarize_list(ET.ElementTree(elem).findall("./tag"))
    ['tag', 'tag']
    &gt;&gt;&gt; elem = ET.XML(SAMPLE_XML_NS)
    &gt;&gt;&gt; summarize_list(elem.findall("tag"))
    []
    &gt;&gt;&gt; summarize_list(elem.findall("{http://effbot.org/ns}tag"))
    ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']
    &gt;&gt;&gt; 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"""

    &gt;&gt;&gt; from xml.etree import ElementTree as ET

    &gt;&gt;&gt; element = ET.XML("&lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;")
    &gt;&gt;&gt; ET.ElementTree(element).write(sys.stdout)
    &lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;
    &gt;&gt;&gt; element = ET.fromstring("&lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;")
    &gt;&gt;&gt; ET.ElementTree(element).write(sys.stdout)
    &lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;
    &gt;&gt;&gt; print(ET.tostring(element))
    &lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;
    &gt;&gt;&gt; print(repr(ET.tostring(element, "ascii")))
    b"&lt;?xml version='1.0' encoding='ascii'?&gt;\n&lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;"
    &gt;&gt;&gt; _, ids = ET.XMLID("&lt;html&gt;&lt;body&gt;text&lt;/body&gt;&lt;/html&gt;")
    &gt;&gt;&gt; len(ids)
    0
    &gt;&gt;&gt; _, ids = ET.XMLID("&lt;html&gt;&lt;body id='body'&gt;text&lt;/body&gt;&lt;/html&gt;")
    &gt;&gt;&gt; len(ids)
    1
    &gt;&gt;&gt; ids["body"].tag
    'body'
    """


def check_encoding(ET, encoding):
    """
    &gt;&gt;&gt; from xml.etree import ElementTree as ET

    &gt;&gt;&gt; check_encoding(ET, "ascii")
    &gt;&gt;&gt; check_encoding(ET, "us-ascii")
    &gt;&gt;&gt; check_encoding(ET, "iso-8859-1")
    &gt;&gt;&gt; check_encoding(ET, "iso-8859-15")
    &gt;&gt;&gt; check_encoding(ET, "cp437")
    &gt;&gt;&gt; check_encoding(ET, "mac-roman")
    """
    ET.XML("&lt;?xml version='1.0' encoding='%s'?&gt;&lt;xml /&gt;" % encoding)

def check_issue6233():
    """
    &gt;&gt;&gt; from xml.etree import ElementTree as ET

    &gt;&gt;&gt; e = ET.XML("&lt;?xml version='1.0' encoding='utf-8'?&gt;&lt;body&gt;t\xe3g&lt;/body&gt;")
    &gt;&gt;&gt; ET.tostring(e, 'ascii')
    b"&lt;?xml version='1.0' encoding='ascii'?&gt;\\n&lt;body&gt;t&amp;#227;g&lt;/body&gt;"
    &gt;&gt;&gt; e = ET.XML("&lt;?xml version='1.0' encoding='iso-8859-1'?&gt;&lt;body&gt;t\xe3g&lt;/body&gt;".encode('iso-8859-1')) # create byte string with the right encoding
    &gt;&gt;&gt; ET.tostring(e, 'ascii')
    b"&lt;?xml version='1.0' encoding='ascii'?&gt;\\n&lt;body&gt;t&amp;#227;g&lt;/body&gt;"
    """

#
# xinclude tests (samples from appendix C of the xinclude specification)

XINCLUDE = {}

XINCLUDE["C1.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;document xmlns:xi="http://www.w3.org/2001/XInclude"&gt;
  &lt;p&gt;120 Mz is adequate for an average home user.&lt;/p&gt;
  &lt;xi:include href="disclaimer.xml"/&gt;
&lt;/document&gt;
"""

XINCLUDE["disclaimer.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;disclaimer&gt;
  &lt;p&gt;The opinions represented herein represent those of the individual
  and should not be interpreted as official policy endorsed by this
  organization.&lt;/p&gt;
&lt;/disclaimer&gt;
"""

XINCLUDE["C2.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;document xmlns:xi="http://www.w3.org/2001/XInclude"&gt;
  &lt;p&gt;This document has been accessed
  &lt;xi:include href="count.txt" parse="text"/&gt; times.&lt;/p&gt;
&lt;/document&gt;
"""

XINCLUDE["count.txt"] = "324387"

XINCLUDE["C3.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;document xmlns:xi="http://www.w3.org/2001/XInclude"&gt;
  &lt;p&gt;The following is the source of the "data.xml" resource:&lt;/p&gt;
  &lt;example&gt;&lt;xi:include href="data.xml" parse="text"/&gt;&lt;/example&gt;
&lt;/document&gt;
"""

XINCLUDE["data.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;data&gt;
  &lt;item&gt;&lt;![CDATA[Brooks &amp; Shields]]&gt;&lt;/item&gt;
&lt;/data&gt;
"""

XINCLUDE["C5.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;div xmlns:xi="http://www.w3.org/2001/XInclude"&gt;
  &lt;xi:include href="example.txt" parse="text"&gt;
    &lt;xi:fallback&gt;
      &lt;xi:include href="fallback-example.txt" parse="text"&gt;
        &lt;xi:fallback&gt;&lt;a href="mailto:bob@example.org"&gt;Report error&lt;/a&gt;&lt;/xi:fallback&gt;
      &lt;/xi:include&gt;
    &lt;/xi:fallback&gt;
  &lt;/xi:include&gt;
&lt;/div&gt;
"""

XINCLUDE["default.xml"] = """\
&lt;?xml version='1.0'?&gt;
&lt;document xmlns:xi="http://www.w3.org/2001/XInclude"&gt;
  &lt;p&gt;Example.&lt;/p&gt;
  &lt;xi:include href="samples/simple.xml"/&gt;
&lt;/document&gt;
"""

def xinclude_loader(href, parse="xml", encoding=None):
    try:
        data = XINCLUDE[href]
    except KeyError:
        raise IOError("resource not found")
    if parse == "xml":
        from xml.etree.ElementTree import XML
        return XML(data)
    return data

def xinclude():
    r"""
    Basic inclusion example (XInclude C.1)

    &gt;&gt;&gt; from xml.etree import ElementTree as ET
    &gt;&gt;&gt; from xml.etree import ElementInclude

    &gt;&gt;&gt; document = xinclude_loader("C1.xml")
    &gt;&gt;&gt; ElementInclude.include(document, xinclude_loader)
    &gt;&gt;&gt; print(serialize(ET, document)) # C1
    &lt;document&gt;
      &lt;p&gt;120 Mz is adequate for an average home user.&lt;/p&gt;
      &lt;disclaimer&gt;
      &lt;p&gt;The opinions represented herein represent those of the individual
      and should not be interpreted as official policy endorsed by this
      organization.&lt;/p&gt;
    &lt;/disclaimer&gt;
    &lt;/document&gt;

    Textual inclusion example (XInclude C.2)

    &gt;&gt;&gt; document = xinclude_loader("C2.xml")
    &gt;&gt;&gt; ElementInclude.include(document, xinclude_loader)
    &gt;&gt;&gt; print(serialize(ET, document)) # C2
    &lt;document&gt;
      &lt;p&gt;This document has been accessed
      324387 times.&lt;/p&gt;
    &lt;/document&gt;

    Textual inclusion of XML example (XInclude C.3)

    &gt;&gt;&gt; document = xinclude_loader("C3.xml")
    &gt;&gt;&gt; ElementInclude.include(document, xinclude_loader)
    &gt;&gt;&gt; print(serialize(ET, document)) # C3
    &lt;document&gt;
      &lt;p&gt;The following is the source of the "data.xml" resource:&lt;/p&gt;
      &lt;example&gt;&amp;lt;?xml version='1.0'?&amp;gt;
    &amp;lt;data&amp;gt;
      &amp;lt;item&amp;gt;&amp;lt;![CDATA[Brooks &amp;amp; Shields]]&amp;gt;&amp;lt;/item&amp;gt;
    &amp;lt;/data&amp;gt;
    &lt;/example&gt;
    &lt;/document&gt;

    Fallback example (XInclude C.5)
    Note! Fallback support is not yet implemented

    &gt;&gt;&gt; document = xinclude_loader("C5.xml")
    &gt;&gt;&gt; ElementInclude.include(document, xinclude_loader)
    Traceback (most recent call last):
    IOError: resource not found
    &gt;&gt;&gt; # print serialize(ET, document) # C5

    """

def test_main():
    from test import test_xml_etree
    support.run_doctest(test_xml_etree, verbosity=True)

if __name__ == '__main__':
    test_main()
</pre></body></html>