def test_root(self): doc = xml.dom.minidom.parseString(""" <doc><a><b><context /></b></a></doc> """).documentElement node = xpath.findnode('//context', doc) result = xpath.find('/', node) self.failUnlessEqual([x.nodeType for x in result], [xml.dom.Node.DOCUMENT_NODE])
def test_self(self): doc = xml.dom.minidom.parseString(""" <doc> <para /> </doc> """).documentElement para_node = xpath.findnode('para', doc) self.failUnlessEqual(len(xpath.find('self::para', doc)), 0) self.failUnlessEqual(len(xpath.find('self::para', para_node)), 1)
def test_root_descendant(self): doc = xml.dom.minidom.parseString(""" <doc> <para id="1"><context /></para> <para id="2" /> </doc> """).documentElement node = xpath.findnode('//context', doc) result = xpath.find('/descendant::para', node) self.failUnlessEqual([x.getAttribute("id") for x in result], ["1", "2"])
def test_previous_sibling(self): doc = xml.dom.minidom.parseString(""" <doc> <chapter id="1" /><chapter id="2" /> <context /> <chapter id="3" /><chapter id="4" /> </doc> """).documentElement node = xpath.findnode('//context', doc) result = xpath.find('preceding-sibling::chapter[position()=1]', node) self.failUnlessEqual([x.getAttribute("id") for x in result], ["2"])
def test_parent_attr(self): doc = xml.dom.minidom.parseString(""" <doc id="0"> <chapter id="1" lang="en"> <item id="2" /> <item id="3"><subitem id="4" /></item> </chapter> </doc> """).documentElement node = xpath.findnode('//item[@id="3"]', doc) result = xpath.find('../@lang', node) self.failUnlessEqual([x.value for x in result], ["en"])
def test_parent(self): doc = xml.dom.minidom.parseString(""" <doc id="0"> <chapter id="1"> <item id="2" /> <item id="3"><subitem id="4" /></item> </chapter> </doc> """).documentElement node = xpath.findnode('//item[@id="3"]', doc) result = xpath.find('..', node) self.failUnlessEqual([x.getAttribute("id") for x in result], ["1"])
def test_relative_descendant_or_self(self): doc = xml.dom.minidom.parseString(""" <para id="0"> <div id="1" /> <para id="2"> <para id="3" /> </para> </para> """).documentElement node = xpath.findnode('//para[@id="2"]', doc) result = xpath.find('.//para', node) self.failUnlessEqual([x.getAttribute("id") for x in result], ["3"])
def test_ancestor_or_self(self): doc = xml.dom.minidom.parseString(""" <doc> <div id="1"> <div id="2" /> <div id="3" /> </div> <div id="4" /> </doc> """).documentElement node = xpath.findnode('//div[@id="3"]', doc) result = xpath.find('ancestor-or-self::div', node) self.failUnlessEqual([x.getAttribute("id") for x in result], ["1", "3"])
def test_olist_item(self): doc = xml.dom.minidom.parseString(""" <doc> <item id="1"> <context /> <olist><item id="2" /></olist> </item> <olist><item id="3" /></olist> </doc> """).documentElement node = xpath.findnode('//context', doc) result = xpath.find('/descendant::olist/child::item', node) self.failUnlessEqual([x.getAttribute("id") for x in result], ["2", "3"])
def test_partition(self): """Test that the ancestor, descendant, following, preceding, and self axes partition the document. """ a = xpath.find('//*', self.doc) a.sort() b = [] node = xpath.findnode('//*[@id="2.2"]', self.doc) for axis in ('ancestor','descendant','following','preceding','self'): b.extend(xpath.find('%s::*' % axis, node)) b.sort() self.failUnlessEqual(a, b)