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