mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	
							parent
							
								
									799e3edaf7
								
							
						
					
					
						commit
						ceab1a950b
					
				
					 1 changed files with 94 additions and 134 deletions
				
			
		| 
						 | 
					@ -329,128 +329,6 @@ def cdata():
 | 
				
			||||||
    '<tag>hello</tag>'
 | 
					    '<tag>hello</tag>'
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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'
 | 
					 | 
				
			||||||
    >>> elem.find("./tag").tag
 | 
					 | 
				
			||||||
    'tag'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).find("./tag").tag
 | 
					 | 
				
			||||||
    'tag'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).find("/tag").tag
 | 
					 | 
				
			||||||
    'tag'
 | 
					 | 
				
			||||||
    >>> elem[2] = ET.XML(SAMPLE_SECTION)
 | 
					 | 
				
			||||||
    >>> elem.find("section/nexttag").tag
 | 
					 | 
				
			||||||
    'nexttag'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).find("section/tag").tag
 | 
					 | 
				
			||||||
    'tag'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).find("tog")
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).find("tog/foo")
 | 
					 | 
				
			||||||
    >>> elem.findtext("tag")
 | 
					 | 
				
			||||||
    'text'
 | 
					 | 
				
			||||||
    >>> elem.findtext("section/nexttag")
 | 
					 | 
				
			||||||
    ''
 | 
					 | 
				
			||||||
    >>> elem.findtext("section/nexttag", "default")
 | 
					 | 
				
			||||||
    ''
 | 
					 | 
				
			||||||
    >>> elem.findtext("tog")
 | 
					 | 
				
			||||||
    >>> elem.findtext("tog", "default")
 | 
					 | 
				
			||||||
    'default'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).findtext("tag")
 | 
					 | 
				
			||||||
    'text'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).findtext("tog/foo")
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).findtext("tog/foo", "default")
 | 
					 | 
				
			||||||
    'default'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).findtext("./tag")
 | 
					 | 
				
			||||||
    'text'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).findtext("/tag")
 | 
					 | 
				
			||||||
    'text'
 | 
					 | 
				
			||||||
    >>> elem.findtext("section/tag")
 | 
					 | 
				
			||||||
    'subtext'
 | 
					 | 
				
			||||||
    >>> ET.ElementTree(elem).findtext("section/tag")
 | 
					 | 
				
			||||||
    'subtext'
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("."))
 | 
					 | 
				
			||||||
    ['body']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("tag"))
 | 
					 | 
				
			||||||
    ['tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("tog"))
 | 
					 | 
				
			||||||
    []
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("tog/foo"))
 | 
					 | 
				
			||||||
    []
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("*"))
 | 
					 | 
				
			||||||
    ['tag', 'tag', 'section']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//tag"))
 | 
					 | 
				
			||||||
    ['tag', 'tag', 'tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("section/tag"))
 | 
					 | 
				
			||||||
    ['tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("section//tag"))
 | 
					 | 
				
			||||||
    ['tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("section/*"))
 | 
					 | 
				
			||||||
    ['tag', 'nexttag', 'nextsection']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("section//*"))
 | 
					 | 
				
			||||||
    ['tag', 'nexttag', 'nextsection', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("section/.//*"))
 | 
					 | 
				
			||||||
    ['tag', 'nexttag', 'nextsection', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("*/*"))
 | 
					 | 
				
			||||||
    ['tag', 'nexttag', 'nextsection']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("*//*"))
 | 
					 | 
				
			||||||
    ['tag', 'nexttag', 'nextsection', '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', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("././tag"))
 | 
					 | 
				
			||||||
    ['tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//tag[@class]"))
 | 
					 | 
				
			||||||
    ['tag', 'tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//tag[@class='a']"))
 | 
					 | 
				
			||||||
    ['tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//tag[@class='b']"))
 | 
					 | 
				
			||||||
    ['tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//tag[@id]"))
 | 
					 | 
				
			||||||
    ['tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//section[tag]"))
 | 
					 | 
				
			||||||
    ['section']
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall(".//section[element]"))
 | 
					 | 
				
			||||||
    []
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("../tag"))
 | 
					 | 
				
			||||||
    []
 | 
					 | 
				
			||||||
    >>> summarize_list(elem.findall("section/../tag"))
 | 
					 | 
				
			||||||
    ['tag', 'tag']
 | 
					 | 
				
			||||||
    >>> summarize_list(ET.ElementTree(elem).findall("./tag"))
 | 
					 | 
				
			||||||
    ['tag', 'tag']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Following example is invalid in 1.2.
 | 
					 | 
				
			||||||
    A leading '*' is assumed in 1.3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    >>> elem.findall("section//") == elem.findall("section//*")
 | 
					 | 
				
			||||||
    True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ET's Path module handles this case incorrectly; this gives
 | 
					 | 
				
			||||||
    a warning in 1.3, and the behaviour will be modified in 1.4.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    >>> 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 file_init():
 | 
					def file_init():
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    >>> import io
 | 
					    >>> import io
 | 
				
			||||||
| 
						 | 
					@ -469,16 +347,6 @@ def file_init():
 | 
				
			||||||
    'empty-element'
 | 
					    'empty-element'
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def bad_find():
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    Check bad or unsupported path expressions.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    >>> elem = ET.XML(SAMPLE_XML)
 | 
					 | 
				
			||||||
    >>> elem.findall("/tag")
 | 
					 | 
				
			||||||
    Traceback (most recent call last):
 | 
					 | 
				
			||||||
    SyntaxError: cannot use absolute path on element
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def path_cache():
 | 
					def path_cache():
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Check that the path cache behaves sanely.
 | 
					    Check that the path cache behaves sanely.
 | 
				
			||||||
| 
						 | 
					@ -1883,6 +1751,98 @@ class ElementTreeTest(unittest.TestCase):
 | 
				
			||||||
                                       method='html')
 | 
					                                       method='html')
 | 
				
			||||||
                self.assertEqual(serialized, expected)
 | 
					                self.assertEqual(serialized, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ElementFindTest(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_find_simple(self):
 | 
				
			||||||
 | 
					        e = ET.XML(SAMPLE_XML)
 | 
				
			||||||
 | 
					        self.assertEqual(e.find('tag').tag, 'tag')
 | 
				
			||||||
 | 
					        self.assertEqual(e.find('section/tag').tag, 'tag')
 | 
				
			||||||
 | 
					        self.assertEqual(e.find('./tag').tag, 'tag')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        e[2] = ET.XML(SAMPLE_SECTION)
 | 
				
			||||||
 | 
					        self.assertEqual(e.find('section/nexttag').tag, 'nexttag')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(e.findtext('./tag'), 'text')
 | 
				
			||||||
 | 
					        self.assertEqual(e.findtext('section/tag'), 'subtext')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # section/nexttag is found but has no text
 | 
				
			||||||
 | 
					        self.assertEqual(e.findtext('section/nexttag'), '')
 | 
				
			||||||
 | 
					        self.assertEqual(e.findtext('section/nexttag', 'default'), '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # tog doesn't exist and 'default' kicks in
 | 
				
			||||||
 | 
					        self.assertIsNone(e.findtext('tog'))
 | 
				
			||||||
 | 
					        self.assertEqual(e.findtext('tog', 'default'), 'default')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_findall(self):
 | 
				
			||||||
 | 
					        e = ET.XML(SAMPLE_XML)
 | 
				
			||||||
 | 
					        e[2] = ET.XML(SAMPLE_SECTION)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.')), ['body'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('tag')), ['tag', 'tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('tog')), [])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('tog/foo')), [])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('*')),
 | 
				
			||||||
 | 
					            ['tag', 'tag', 'section'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//tag')),
 | 
				
			||||||
 | 
					            ['tag'] * 4)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('section/tag')), ['tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('section//tag')), ['tag'] * 2)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('section/*')),
 | 
				
			||||||
 | 
					            ['tag', 'nexttag', 'nextsection'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('section//*')),
 | 
				
			||||||
 | 
					            ['tag', 'nexttag', 'nextsection', 'tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('section/.//*')),
 | 
				
			||||||
 | 
					            ['tag', 'nexttag', 'nextsection', 'tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('*/*')),
 | 
				
			||||||
 | 
					            ['tag', 'nexttag', 'nextsection'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('*//*')),
 | 
				
			||||||
 | 
					            ['tag', 'nexttag', 'nextsection', 'tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('*/tag')), ['tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('*/./tag')), ['tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('./tag')), ['tag'] * 2)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('././tag')), ['tag'] * 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//tag[@class]')),
 | 
				
			||||||
 | 
					            ['tag'] * 3)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//tag[@class="a"]')),
 | 
				
			||||||
 | 
					            ['tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//tag[@class="b"]')),
 | 
				
			||||||
 | 
					            ['tag'] * 2)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//tag[@id]')),
 | 
				
			||||||
 | 
					            ['tag'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//section[tag]')),
 | 
				
			||||||
 | 
					            ['section'])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('.//section[element]')), [])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('../tag')), [])
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('section/../tag')),
 | 
				
			||||||
 | 
					            ['tag'] * 2)
 | 
				
			||||||
 | 
					        self.assertEqual(e.findall('section//'), e.findall('section//*'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_test_find_with_ns(self):
 | 
				
			||||||
 | 
					        e = ET.XML(SAMPLE_XML_NS)
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(e.findall('tag')), [])
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            summarize_list(e.findall("{http://effbot.org/ns}tag")),
 | 
				
			||||||
 | 
					            ['{http://effbot.org/ns}tag'] * 2)
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            summarize_list(e.findall(".//{http://effbot.org/ns}tag")),
 | 
				
			||||||
 | 
					            ['{http://effbot.org/ns}tag'] * 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_bad_find(self):
 | 
				
			||||||
 | 
					        e = ET.XML(SAMPLE_XML)
 | 
				
			||||||
 | 
					        with self.assertRaisesRegex(SyntaxError, 'cannot use absolute path'):
 | 
				
			||||||
 | 
					            e.findall('/tag')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    def test_find_through_ElementTree(self):
 | 
				
			||||||
 | 
					        e = ET.XML(SAMPLE_XML)
 | 
				
			||||||
 | 
					        self.assertEqual(ET.ElementTree(e).find('tag').tag, 'tag')
 | 
				
			||||||
 | 
					        self.assertEqual(ET.ElementTree(e).findtext('tag'), 'text')
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(ET.ElementTree(e).findall('tag')),
 | 
				
			||||||
 | 
					            ['tag'] * 2)
 | 
				
			||||||
 | 
					        # this produces a warning
 | 
				
			||||||
 | 
					        self.assertEqual(summarize_list(ET.ElementTree(e).findall('//tag')),
 | 
				
			||||||
 | 
					            ['tag'] * 3)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ElementIterTest(unittest.TestCase):
 | 
					class ElementIterTest(unittest.TestCase):
 | 
				
			||||||
    def _ilist(self, elem, tag=None):
 | 
					    def _ilist(self, elem, tag=None):
 | 
				
			||||||
        return summarize_list(elem.iter(tag))
 | 
					        return summarize_list(elem.iter(tag))
 | 
				
			||||||
| 
						 | 
					@ -2547,6 +2507,7 @@ def test_main(module=None):
 | 
				
			||||||
        ParseErrorTest,
 | 
					        ParseErrorTest,
 | 
				
			||||||
        XincludeTest,
 | 
					        XincludeTest,
 | 
				
			||||||
        ElementTreeTest,
 | 
					        ElementTreeTest,
 | 
				
			||||||
 | 
					        ElementFindTest,
 | 
				
			||||||
        ElementIterTest,
 | 
					        ElementIterTest,
 | 
				
			||||||
        TreeBuilderTest,
 | 
					        TreeBuilderTest,
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
| 
						 | 
					@ -2560,10 +2521,9 @@ def test_main(module=None):
 | 
				
			||||||
            ])
 | 
					            ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        support.run_unittest(*test_classes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # XXX the C module should give the same warnings as the Python module
 | 
					        # XXX the C module should give the same warnings as the Python module
 | 
				
			||||||
        with CleanContext(quiet=(pyET is not ET)):
 | 
					        with CleanContext(quiet=(pyET is not ET)):
 | 
				
			||||||
 | 
					            support.run_unittest(*test_classes)
 | 
				
			||||||
            support.run_doctest(sys.modules[__name__], verbosity=True)
 | 
					            support.run_doctest(sys.modules[__name__], verbosity=True)
 | 
				
			||||||
    finally:
 | 
					    finally:
 | 
				
			||||||
        # don't interfere with subsequent tests
 | 
					        # don't interfere with subsequent tests
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue