Commit 52467b16 authored by Eli Bendersky's avatar Eli Bendersky

Issue #14007: make XMLParser a real subclassable type exported from _elementtree. +cleanups

parent 7e0229e9
...@@ -646,8 +646,8 @@ ElementTree Objects ...@@ -646,8 +646,8 @@ ElementTree Objects
Loads an external XML section into this element tree. *source* is a file Loads an external XML section into this element tree. *source* is a file
name or :term:`file object`. *parser* is an optional parser instance. name or :term:`file object`. *parser* is an optional parser instance.
If not given, the standard XMLParser parser is used. Returns the section If not given, the standard :class:`XMLParser` parser is used. Returns the
root element. section root element.
.. method:: write(file, encoding="us-ascii", xml_declaration=None, method="xml") .. method:: write(file, encoding="us-ascii", xml_declaration=None, method="xml")
...@@ -767,9 +767,9 @@ XMLParser Objects ...@@ -767,9 +767,9 @@ XMLParser Objects
:class:`Element` structure builder for XML source data, based on the expat :class:`Element` structure builder for XML source data, based on the expat
parser. *html* are predefined HTML entities. This flag is not supported by parser. *html* are predefined HTML entities. This flag is not supported by
the current implementation. *target* is the target object. If omitted, the the current implementation. *target* is the target object. If omitted, the
builder uses an instance of the standard TreeBuilder class. *encoding* [1]_ builder uses an instance of the standard :class:`TreeBuilder` class.
is optional. If given, the value overrides the encoding specified in the *encoding* [1]_ is optional. If given, the value overrides the encoding
XML file. specified in the XML file.
.. method:: close() .. method:: close()
......
...@@ -2028,6 +2028,34 @@ class TreeBuilderTest(unittest.TestCase): ...@@ -2028,6 +2028,34 @@ class TreeBuilderTest(unittest.TestCase):
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd')) 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'))
class XMLParserTest(unittest.TestCase):
sample1 = '<file><line>22</line></file>'
def _check_sample_element(self, e):
self.assertEqual(e.tag, 'file')
self.assertEqual(e[0].tag, 'line')
self.assertEqual(e[0].text, '22')
def test_constructor_args(self):
# Positional args. The first (html) is not supported, but should be
# nevertheless correctly accepted.
parser = ET.XMLParser(None, ET.TreeBuilder(), 'utf-8')
parser.feed(self.sample1)
self._check_sample_element(parser.close())
# Now as keyword args.
parser2 = ET.XMLParser(encoding='utf-8', html=[{}], target=ET.TreeBuilder())
parser2.feed(self.sample1)
self._check_sample_element(parser2.close())
def test_subclass(self):
class MyParser(ET.XMLParser):
pass
parser = MyParser()
parser.feed(self.sample1)
self._check_sample_element(parser.close())
class NoAcceleratorTest(unittest.TestCase): class NoAcceleratorTest(unittest.TestCase):
# Test that the C accelerator was not imported for pyET # Test that the C accelerator was not imported for pyET
def test_correct_import_pyET(self): def test_correct_import_pyET(self):
...@@ -2245,6 +2273,7 @@ def test_main(module=pyET): ...@@ -2245,6 +2273,7 @@ def test_main(module=pyET):
ElementTreeTest, ElementTreeTest,
NamespaceParseTest, NamespaceParseTest,
TreeBuilderTest, TreeBuilderTest,
XMLParserTest,
KeywordArgsTest] KeywordArgsTest]
if module is pyET: if module is pyET:
# Run the tests specific to the Python implementation # Run the tests specific to the Python implementation
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment