cpython: 56a4561600ad (original) (raw)
Mercurial > cpython
changeset 81681:56a4561600ad
Issue #12323: Strengthen error checking of the position XPath selectors [#12323]
Eli Bendersky eliben@gmail.com | |
---|---|
date | Thu, 24 Jan 2013 06:29:26 -0800 |
parents | 2c12a1236fdc |
children | c6b0b96451c6 0c9268ac3ffa |
files | Lib/test/test_xml_etree.py Lib/xml/etree/ElementPath.py |
diffstat | 2 files changed, 12 insertions(+), 2 deletions(-)[+] [-] Lib/test/test_xml_etree.py 5 Lib/xml/etree/ElementPath.py 9 |
line wrap: on
line diff
--- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1793,6 +1793,11 @@ class ElementFindTest(unittest.TestCase) self.assertEqual(e.find('./tag[last()-1]').attrib['class'], 'c') self.assertEqual(e.find('./tag[last()-2]').attrib['class'], 'b')
self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[0]')[](#l1.7)
self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[-1]')[](#l1.8)
self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()-0]')[](#l1.9)
self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()+1]')[](#l1.10)
+ def test_findall(self): e = ET.XML(SAMPLE_XML) e[2] = ET.XML(SAMPLE_SECTION)
--- a/Lib/xml/etree/ElementPath.py +++ b/Lib/xml/etree/ElementPath.py @@ -174,7 +174,7 @@ def prepare_predicate(next, token): if elem.get(key) == value: yield elem return select
- if signature == "-" and not re.match("-?\d+$", predicate[0]): # [tag] tag = predicate[0] def select(context, result):
@@ -182,7 +182,7 @@ def prepare_predicate(next, token): if elem.find(tag) is not None: yield elem return select
- if signature == "-='" and not re.match("-?\d+$", predicate[0]): # [tag='value'] tag = predicate[0] value = predicate[-1]
@@ -196,7 +196,10 @@ def prepare_predicate(next, token): if signature == "-" or signature == "-()" or signature == "-()-": # [index] or [last()] or [last()-index] if signature == "-":
# [index][](#l2.25) index = int(predicate[0]) - 1[](#l2.26)
if index < 0:[](#l2.27)
raise SyntaxError("XPath position >= 1 expected")[](#l2.28) else:[](#l2.29) if predicate[0] != "last":[](#l2.30) raise SyntaxError("unsupported function")[](#l2.31)
@@ -205,6 +208,8 @@ def prepare_predicate(next, token): index = int(predicate[2]) - 1 except ValueError: raise SyntaxError("unsupported expression")
if index > -2:[](#l2.36)
raise SyntaxError("XPath offset from last() must be negative")[](#l2.37) else:[](#l2.38) index = -1[](#l2.39) def select(context, result):[](#l2.40)