# -*- coding: utf-8 -*- from __future__ import with_statement import os.path import sys import unittest from unittest import TestCase from lxml import etree from lxml.etree import ElementTree from lxml.etree import Element from lxml.etree import SubElement from lxml.etree import QName class ElementTreeTest(TestCase): def test_etree_parse(self): with open('sample.xml') as f: et = etree.parse(f) et = etree.parse('sample.xml') def test_etree_fromstring(self): with open('sample.xml') as f: text = f.read() et = etree.fromstring(text) def test_etree_from_file(self): with open('sample.xml') as f: et = ElementTree(file=f) root = et.getroot() self.assertEqual('{http://example.tld}document', root.tag) self.assertEqual('x', root.prefix) self.assertTrue('x' in root.nsmap) with open('hello.xml') as f: et = ElementTree(file=f) root = et.getroot() self.assertEqual('hello', root.tag) self.assertEqual(None, root.prefix) self.assertEqual({}, root.nsmap) def test_etree_tostring(self): with open('sample.xml') as f: et = etree.parse(f) etree.tostring(et, encoding='utf-8', xml_declaration=True) etree.tostring(et.getroot()[0], encoding='utf-8', xml_declaration=True) def test_from_element(self): elem = Element('document') tree = ElementTree(elem) self.assertEqual('document', tree.getroot().tag) with open('sample.xml') as f: et = ElementTree(file=f) root = et.getroot() tree = ElementTree(root) self.assertEqual(root.base, tree.getroot().base) self.assertEqual(et.docinfo.URL, tree.docinfo.URL) def test_docinfo(self): with open('sample.xml') as f: et = etree.parse(f) import os.path self.assertEqual(os.path.abspath('sample.xml'), et.docinfo.URL) self.assertEqual('', et.docinfo.doctype) self.assertEqual('utf-8', et.docinfo.encoding) self.assertEqual(None, et.docinfo.externalDTD) self.assertEqual(None, et.docinfo.internalDTD) self.assertEqual(None, et.docinfo.public_id) self.assertEqual('document', et.docinfo.root_name) self.assertFalse(et.docinfo.standalone) self.assertEqual(None, et.docinfo.system_url) self.assertEqual('1.0', et.docinfo.xml_version) et.docinfo.URL = 'http://example.tld' self.assertEqual('http://example.tld', et.docinfo.URL) def test_parser(self): pass def test__copy__(self): pass def test__deepcopy__(self): pass def test_setroot(self): from lxml.etree import XML a = XML('').getroottree() b = XML('').getroottree() a._setroot(b.getroot()) self.assertEqual('b', a.getroot().tag) def test_find(self): pass def test_findall(self): pass def test_findtext(self): pass def test_getiterator(self): pass def test_getpath(self): pass def test_getroot(self): with open('sample.xml') as f: et = etree.parse(f) tree = etree.parse('sample.xml') root = tree.getroot() self.assertEqual('{http://example.tld}document', root.tag) def test_iter(self): pass def test_iterfind(self): pass def test_parse(self): pass def test_relaxng(self): pass def test_write(self): with open('sample.xml') as f: tree = etree.parse(f) import tempfile import os fd, name = tempfile.mkstemp() try: with os.fdopen(fd, 'w') as f: tree.write(f) with open(name) as f: tree2 = etree.parse(f) finally: os.unlink(name) self.assertEqual(tree.getroot().tag, tree2.getroot().tag) def test_write_c14n(self): pass def test_xinclude(self): pass def test_xmlschema(self): pass def test_xpath(self): with open('sample.xml') as f: et = etree.parse(f) tree = etree.parse('sample.xml') nsmap = dict(x='http://example.tld') # element result = tree.xpath('//x:paragraph', namespaces=nsmap) self.assertEqual(1, len(result)) self.assertEqual('{http://example.tld}paragraph', result[0].tag) # attribute result = tree.xpath('@version', namespaces=nsmap) self.assertEqual(['1.0'], result) # string result = tree.xpath('"foo"', namespaces=nsmap) self.assertEqual('foo', result) # number expression result = tree.xpath('1', namespaces=nsmap) self.assertEqual(1.0, result) result = tree.xpath('"1.0"', namespaces=nsmap) # should be string, but alas, it returns a number in jxml if sys.platform.startswith('java'): self.assertEqual(1.0, result) else: self.assertEqual('1.0', result) def test_xslt(self): tree = etree.XML('').getroottree() with open('xsl/import-test.xsl') as f: xsl_tree = etree.parse(f) result = tree.xslt(xsl_tree) self.assertEqual('world', result.getroot().tag) class ElementTest(TestCase): def setUp(self): with open('sample.xml') as f: self.et = ElementTree(file=f) self.root = self.et.getroot() def tearDown(self): pass def test_Element(self): elem = Element('document', dict(a='1', b='2'), c='3') self.assertEqual('document', elem.tag) self.assertEqual(dict(a='1', b='2', c='3'), elem.attrib) nsmap = dict(a='http://a.example.tld', c='http://c.example.tld') elem = Element('{http://a.example.tld}document', {'{http://a.example.tld}a': '1', '{http://b.example.tld}a': '2', 'a': '3'}, nsmap) self.assertEqual('a', elem.prefix) self.assertEqual('{http://a.example.tld}document', elem.tag) self.assertEqual(nsmap['a'], elem.nsmap['a']) self.assertEqual(nsmap['c'], elem.nsmap['c']) self.assertTrue('http://b.example.tld' in elem.nsmap.values()) self.assertEqual('1', elem.get('{http://a.example.tld}a')) self.assertEqual('2', elem.get('{http://b.example.tld}a')) self.assertEqual('3', elem.get('a')) def test_SubElement(self): elem = Element('document') child = SubElement(elem, 'paragraph') grandchild = SubElement(child, 'span') self.assertEqual('paragraph', elem[0].tag) self.assertEqual('span', elem[0][0].tag) def test_base(self): uri = os.path.abspath('sample.xml') with open(uri) as f: et = etree.parse(f) root = et.getroot() self.assertEqual(uri, root.base) def test_tag(self): elem = Element('HwpDoc') self.assertEqual('HwpDoc', elem.tag) elem = Element('{http://www.w3.org/1999/XSL/Transform}stylesheet') self.assertTrue(elem.prefix) self.assertEqual('{http://www.w3.org/1999/XSL/Transform}stylesheet', elem.tag) elem = Element('{http://www.w3.org/1999/XSL/Transform}stylesheet', nsmap=dict(xsl='http://www.w3.org/1999/XSL/Transform')) self.assertEqual('xsl', elem.prefix) self.assertEqual('{http://www.w3.org/1999/XSL/Transform}stylesheet', elem.tag) def test_nsmap(self): self.assertEqual(dict(x='http://example.tld'), self.root.nsmap) self.assertEqual(dict(x='http://example.tld', z='http://z.example.tld'), self.root[1].nsmap) def test_prefix(self): self.assertEqual('x', self.root.prefix) self.assertEqual('z', self.root[1].prefix) def test_text(self): self.assertEqual('text', self.root[0].text) self.assertEqual(None, self.root[1].text) def test_tail(self): self.assertEqual('tail', self.root[0].tail) self.assertEqual(None, self.root[0][0].tail) def test_attrib(self): self.assertEqual({'version': '1.0'}, self.root.attrib) self.assertEqual({'a': '1', '{http://example.tld}b': '2', '{http://z.example.tld}c': '3'}, self.root[1].attrib) def test__contains__(self): pass def test__copy__(self): pass def test__deepcopy__(self): pass def test__delitem__(self): pass def test__getitem__(self): paragraph = self.root.__getitem__(0) self.assertEqual('{http://example.tld}paragraph', paragraph.tag) paragraph = self.root[0] self.assertEqual('{http://example.tld}paragraph', paragraph.tag) paragraph = self.root.__getitem__(1) self.assertEqual('{http://z.example.tld}object', paragraph.tag) paragraph = self.root[1] self.assertEqual('{http://z.example.tld}object', paragraph.tag) child = self.root.__getitem__(-1) self.assertEqual('{http://example.tld}third', child.tag) child = self.root[-1] self.assertEqual('{http://example.tld}third', child.tag) def test__iter__(self): it = self.root.__iter__() paragraph = it.next() self.assertEqual('{http://example.tld}paragraph', paragraph.tag) self.assertEqual('text', paragraph.text) self.assertEqual('tail', paragraph.tail) paragraph = it.next() self.assertEqual('{http://z.example.tld}object', paragraph.tag) child = it.next() self.assertEqual('{http://example.tld}third', child.tag) self.assertRaises(StopIteration, it.next) def test__len__(self): self.assertEqual(3, self.root.__len__()) self.assertEqual(3, len(self.root)) def test__nonzero__(self): pass def test__repr__(self): pass def test__reversed__(self): it = self.root.__reversed__() child = it.next() self.assertEqual('{http://example.tld}third', child.tag) paragraph = it.next() self.assertEqual('{http://z.example.tld}object', paragraph.tag) paragraph = it.next() self.assertEqual('{http://example.tld}paragraph', paragraph.tag) self.assertEqual('text', paragraph.text) self.assertEqual('tail', paragraph.tail) self.assertRaises(StopIteration, it.next) def test__setitem__(self): new_child = Element('new-child') self.root.__setitem__(1, new_child) self.assertEqual('new-child', self.root[1].tag) new_child = Element('new-child2') self.assertRaises(IndexError, self.root.__setitem__, 3, new_child) def test_addnext(self): pass def test_addprevious(self): pass def test_append(self): new_child = Element('new-child') self.root.append(new_child) child = self.root[3] self.assertEqual('new-child', child.tag) def test_clear(self): pass def test_extend(self): pass def test_find(self): pass def test_findall(self): pass def test_findtext(self): pass def test_get(self): self.assertEqual(None, self.root.get('nonexists')) self.assertEqual('1.0', self.root.get('version')) self.assertEqual('1', self.root[1].get('a')) self.assertEqual('2', self.root[1].get('{http://example.tld}b')) self.assertEqual('3', self.root[1].get('{http://z.example.tld}c')) def test_getchildren(self): children = self.root.getchildren() child = children[0] self.assertEqual('{http://example.tld}paragraph', child.tag) self.assertEqual('text', child.text) self.assertEqual('tail', child.tail) child = children[1] self.assertEqual('{http://z.example.tld}object', child.tag) child = children[2] self.assertEqual('{http://example.tld}third', child.tag) def test_getiterator(self): pass def test_getnext(self): child = self.root[0] child = child.getnext() self.assertEqual('{http://z.example.tld}object', child.tag) child = child.getnext() self.assertEqual('{http://example.tld}third', child.tag) child = child.getnext() self.assertEqual(None, child) def test_getparent(self): parent = self.root.getparent() self.assertEqual(None, parent) for child in self.root: parent = child.getparent() self.assertEqual('{http://example.tld}document', parent.tag) def test_getprevious(self): child = self.root[-1] self.assertEqual('{http://example.tld}third', child.tag) child = child.getprevious() self.assertEqual('{http://z.example.tld}object', child.tag) child = child.getprevious() self.assertEqual('{http://example.tld}paragraph', child.tag) child = child.getprevious() self.assertEqual(None, child) def test_getroottree(self): elem = Element('HwpDoc') self.assertTrue(elem.getroottree() is not None) def test_index(self): pass def test_insert(self): pass def test_items(self): pass def test_iter(self): pass def test_iterancestors(self): span = self.root[0][0] it = span.iterancestors() parent = it.next() self.assertEqual('{http://example.tld}paragraph', parent.tag) parent = it.next() self.assertEqual('{http://example.tld}document', parent.tag) self.assertRaises(StopIteration, it.next) # with tags predicate it = span.iterancestors('{http://example.tld}document') parent = it.next() self.assertEqual('{http://example.tld}document', parent.tag) self.assertRaises(StopIteration, it.next) def test_iterchildren(self): pass def test_descendants(self): pass def test_iterfind(self): pass def test_siblings(self): pass def test_itertext(self): pass def test_keys(self): self.assertEqual(set(['version']), set(self.root.keys())) self.assertEqual(set(['a', '{http://example.tld}b', '{http://z.example.tld}c']), set(self.root[1].keys())) def test_makeelement(self): pass def test_remove(self): pass def test_replace(self): pass def test_set(self): self.root.set('{http://example.tld}a', '1') self.assertEqual('1', self.root.get('{http://example.tld}a')) self.root.set('{http://c.example.tld}a', '2') self.assertEqual('2', self.root.get('{http://c.example.tld}a')) self.root.set('a', '3') self.assertEqual('3', self.root.get('a')) def test_values(self): self.root[1].values() def test_xpath(self): nsmap = dict(x='http://example.tld') # element result = self.root.xpath('//x:paragraph', namespaces=nsmap) self.assertEqual(1, len(result)) self.assertEqual('{http://example.tld}paragraph', result[0].tag) # attribute result = self.root.xpath('@version', namespaces=nsmap) self.assertEqual(['1.0'], result) # string result = self.root.xpath('"foo"', namespaces=nsmap) self.assertEqual('foo', result) # number expression result = self.root.xpath('1', namespaces=nsmap) self.assertEqual(1.0, result) result = self.root.xpath('"1.0"', namespaces=nsmap) # should be string, but alas, it returns a number in jxml if sys.platform.startswith('java'): self.assertEqual(1.0, result) else: self.assertEqual('1.0', result) class QNameTest(TestCase): text = '{http://example.tld}document' namespace = 'http://example.tld' localname = 'document' def test_from_text(self): qname = QName(self.text) self.assertEqual(self.text, qname.text) self.assertEqual(self.namespace, qname.namespace) self.assertEqual(self.localname, qname.localname) qname = QName('document') self.assertEqual('document', qname.text) self.assertEqual(None, qname.namespace) self.assertEqual('document', qname.localname) def test_from_nsuri_and_tag(self): qname = QName(self.namespace, self.localname) self.assertEqual(self.text, qname.text) self.assertEqual(self.namespace, qname.namespace) self.assertEqual(self.localname, qname.localname) def test_from_element(self): element = Element(self.text) qname = QName(element) self.assertEqual(self.text, qname.text) self.assertEqual(self.namespace, qname.namespace) self.assertEqual(self.localname, qname.localname) class XPathTest(TestCase): def test_xpath(self): from lxml.etree import parse from lxml.etree import XPath with file('sample.xml') as f: doc = parse(f) nsmap = dict(x='http://example.tld') # element xpath = XPath('//x:paragraph', namespaces=nsmap) result = xpath(doc) self.assertEqual(1, len(result)) self.assertEqual('{http://example.tld}paragraph', result[0].tag) # attribute xpath = XPath('@version', namespaces=nsmap) result = xpath(doc) self.assertEqual(['1.0'], result) # string xpath = XPath('"foo"', namespaces=nsmap) result = xpath(doc) self.assertEqual('foo', result) # number xpath = XPath('1', namespaces=nsmap) self.assertEqual(1, xpath(doc)) # string, but alas, it returns a number in jxml xpath = XPath('"1.0"', namespaces=nsmap) result = xpath(doc) if sys.platform.startswith('java'): self.assertEqual(1.0, result) else: self.assertEqual('1.0', result) # Boolean xpath = XPath('1 = 1', namespaces=nsmap) self.assertEqual(True, xpath(doc)) class XSLTTest(TestCase): def test_from_element(self): with open('xsl/import-test.xsl') as f: xsl_tree = etree.parse(f) etree.XSLT(xsl_tree.getroot()) def test_xslt_with_default_parser(self): with open('xsl/import-test.xsl') as f: xsl_tree = etree.parse(f) transform = etree.XSLT(xsl_tree) result = transform(etree.XML('')) self.assertEqual('world', result.getroot().tag) def test_text_output(self): with open('text-output.xsl') as f: xsl_tree = etree.parse(f) transform = etree.XSLT(xsl_tree) result = transform(etree.XML('')) self.assertEqual(None, result.getroot()) self.assertEqual(u'world', unicode(result)) self.assertEqual('world', str(result)) if __name__ == '__main__': unittest.main()