| # 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:[email protected]">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() |