diff options
author | khillman <khillman@tzi.de> | 2021-11-21 21:04:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-21 21:04:21 +0100 |
commit | fefdcc06c4704aefddd44ef2d02748db8dd9e7e7 (patch) | |
tree | 923346af303dc71c5a8a02cf162a27f2ed10a7cd | |
parent | 8a9579c32782f3d59b73bcf3e7d2fb3b52b80956 (diff) | |
download | python-lxml-fefdcc06c4704aefddd44ef2d02748db8dd9e7e7.tar.gz |
Add test for Python3 regression in C14N2 serialization (GH-332)
Details in https://mail.python.org/archives/list/lxml@python.org/thread/6ZFBHFOVHOS5GFDOAMPCT6HM5HZPWQ4Q/
Fixed in https://github.com/lxml/lxml/commit/8a9579c32782f3d59b73bcf3e7d2fb3b52b80956
-rw-r--r-- | src/lxml/tests/test_etree.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py index 42613dcb..ef5c54b7 100644 --- a/src/lxml/tests/test_etree.py +++ b/src/lxml/tests/test_etree.py @@ -5068,6 +5068,45 @@ class ETreeC14NTestCase(HelperTestCase): s = etree.tostring(tree, method='c14n', exclusive=True, inclusive_ns_prefixes=['x', 'y', 'z']) self.assertEqual(_bytes('<a xmlns:x="http://abc" xmlns:y="http://bcd" xmlns:z="http://cde"><z:b></z:b></a>'), s) + + def test_python3_problem_bytesio_iterparse(self): + content = BytesIO('''<?xml version="1.0" encoding="utf-8"?> <some_ns_id:some_head_elem xmlns:some_ns_id="http://www.example.com" xmlns:xhtml="http://www.w3.org/1999/xhtml"><xhtml:div></xhtml:div></some_ns_id:some_head_elem>'''.encode('utf-8')) + def handle_div_end(event, element): + if event == 'end' and element.tag.lower().startswith("{http://www.w3.org/1999/xhtml}div"): + # for ns_id, ns_uri in element.nsmap.items(): + # print(type(ns_id), type(ns_uri), ns_id, '=', ns_uri) + etree.tostring(element, method="c14n2") + for event, element in etree.iterparse( + source=content, + events=('start', 'end') + ): + handle_div_end(event, element) + + def test_python3_problem_filebased_iterparse(self): + with open('test.xml', 'w+b') as f: + f.write('''<?xml version="1.0" encoding="utf-8"?> <some_ns_id:some_head_elem xmlns:some_ns_id="http://www.example.com" xmlns:xhtml="http://www.w3.org/1999/xhtml"><xhtml:div></xhtml:div></some_ns_id:some_head_elem>'''.encode('utf-8')) + def handle_div_end(event, element): + if event == 'end' and element.tag.lower() == "{http://www.w3.org/1999/xhtml}div": + # for ns_id, ns_uri in element.nsmap.items(): + # print(type(ns_id), type(ns_uri), ns_id, '=', ns_uri) + etree.tostring(element, method="c14n2") + for event, element in etree.iterparse( + source='test.xml', + events=('start', 'end') + ): + handle_div_end(event, element) + + def test_python3_problem_filebased_parse(self): + with open('test.xml', 'w+b') as f: + f.write('''<?xml version="1.0" encoding="utf-8"?> <some_ns_id:some_head_elem xmlns:some_ns_id="http://www.example.com" xmlns:xhtml="http://www.w3.org/1999/xhtml"><xhtml:div></xhtml:div></some_ns_id:some_head_elem>'''.encode('utf-8')) + def serialize_div_element(element): + # for ns_id, ns_uri in element.nsmap.items(): + # print(type(ns_id), type(ns_uri), ns_id, '=', ns_uri) + etree.tostring(element, method="c14n2") + tree = etree.parse(source='test.xml') + root = tree.getroot() + div = root.xpath('//xhtml:div', namespaces={'xhtml':'http://www.w3.org/1999/xhtml'})[0] + serialize_div_element(div) class ETreeWriteTestCase(HelperTestCase): |