<p>On Dec 9, 2011 3:04 AM, &quot;Stefan Behnel&quot; &lt;<a href="mailto:stefan_ml@behnel.de">stefan_ml@behnel.de</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi everyone,<br>
&gt;<br>
&gt; I think Py3.3 would be a good milestone for cleaning up the stdlib support for XML. Note upfront: you may or may not know me as the maintainer of lxml, the de-facto non-stdlib standard Python XML tool. This (lengthy) post was triggered by the following kind of conversation that I keep having with new XML users in Python (mostly on <a href="http://c.l.py">c.l.py</a>), which hints at some serious flaw in the stdlib.<br>

&gt;<br>
&gt; User: I&#39;m trying to do XML stuff XYZ in Python and have problem ABC.<br>
&gt; Me: What library are you using? Could you show us some code?<br>
&gt; User: My code looks like this snippet: ...<br>
&gt; Me: You are using minidom which is known to be hard to use, slow and uses lots of memory. Use the xml.etree.ElementTree package instead, or rather its C implementation cElementTree, also in the stdlib.<br>
&gt; User (coming back after a while): thanks, that was exactly what [I didn&#39;t know] I was looking for.<br>
&gt;<br>
&gt; What does this tell us?<br>
&gt;<br>
&gt; 1) MiniDOM is what new users find first. It&#39;s highly visible because there are still lots of ancient &quot;Python and XML&quot; web pages out there that date back from the time before Python 2.5 (or rather something like 2.2), when it was the only XML tree library in the stdlib. It&#39;s also the first hit from the top when you search for &quot;XML&quot; on the stdlib docs page and contains the (to some people) familiar word &quot;DOM&quot;, which lets users stop their search and start writing code, not expecting to find a separate alternative in the same stdlib, way further down. And the description as &quot;mini&quot;, &quot;simple&quot; and &quot;lightweight&quot; suggests to users that it&#39;s going to be easy to use and efficient.<br>

&gt;<br>
&gt; 2) MiniDOM is not what users want. It leads to complicated, unpythonic code and lots of problems. It is neither easy to use, nor efficient, nor &quot;lightweight&quot;, &quot;simple&quot; or &quot;mini&quot;, not in absolute numbers (see <a href="http://bugs.python.org/issue11379#msg148584">http://bugs.python.org/issue11379#msg148584</a> and following for a recent discussion). It&#39;s also badly maintained in the sense that its performance characteristics could likely be improved, but no-one is seriously interested in doing that, because it would not lead to something that actually *is* fast or memory friendly compared to any of the &#39;real&#39; alternatives that are available right now.<br>

&gt;<br>
&gt; 3) ElementTree is what users should use, MiniDOM is not. ElementTree was added to the stdlib in Py2.5 on popular demand, exactly because it is very easy to use, very fast, and very memory friendly. And because users did not want to use MiniDOM any more. Today, ElementTree has a rather straight upgrade path towards lxml.etree if more XML features like validation or XSLT are needed. MiniDOM has nothing like that to offer. It&#39;s a dead end.<br>

&gt;<br>
&gt; 4) In the stdlib, cElementTree is independent of ElementTree, but totally hidden in the documentation. In conversations like the above, it&#39;s unnecessarily complex to explain to users that there is ElementTree (which is documented in the stdlib), but that what they want to use is really cElementTree, which has the same API but does not have a stdlib documentation page that I can send them to. Note that the other Python implementations simply provide cElementTree as an alias for ElementTree. That leaves CPython as the only Python implementation that really has these two separate modules.<br>

&gt;<br>
&gt; So, there are many problems here. And I think they make it unnecessarily complicated for users to process XML in Python and that the current situation helps in turning away new users from Python as a language for XML processing. Python does have impressively great tools for working with XML. It&#39;s just that the stdlib and its documentation do not reflect or even appreciate that.<br>

&gt;<br>
&gt; What should change?<br>
&gt;<br>
&gt; a) The stdlib documentation should help users to choose the right tool right from the start. Instead of using the totally misleading wording that it uses now, it should be honest about the performance characteristics of MiniDOM and should actively suggest that those who don&#39;t know what to choose (or even *that* they can choose) should not use MiniDOM in the first place. I created a ticket (issue11379) for a minor step in this direction, but given the responses, I&#39;m rather convinced that there&#39;s a lot more that can be done and should be done, and that it should be done now, right for the next release.<br>

&gt;<br>
&gt; b) cElementTree should finally loose it&#39;s &quot;special&quot; status as a separate library and disappear as an accelerator module behind ElementTree. This has been suggested a couple of times already, and AFAIR, there was some opposition because 1) ET was maintained outside of the stdlib and 2) the APIs of both were not identical. However, getting ET 1.3 into Py2.7 and 3.2 was a U-turn. Today, ET is *only* being maintained in the stdlib by Florent Xicluna (who is doing a good job with it), and ET 1.3 has basically made the APIs of both implementations compatible again. So, 3.3 would be the right milestone for fixing the &quot;two libs for one&quot; quirk.<br>

&gt;<br>
&gt; Given that this is the third time during the last couple of years that I&#39;m suggesting to finally fix the stdlib and its documentation, I won&#39;t provide any further patches before it has finally been accepted that a) this is a problem and b) it should be fixed, thus allowing the patches to actually serve a purpose. If we can agree on that, I&#39;ll happily help in making this change happen.<br>

&gt;<br>
&gt; Stefan<br>
&gt;<br>
&gt;</p>
<p>this gets a strong +1 from me and, I suspect, anyone else who spends a significant amount of time in any of the python support communities (python-list, #python, etc). Defaults exist not only in our code, but also in our documentation and presentation, and those defaults are wrong here. _______________________________________________<br>

&gt; Python-Dev mailing list<br>
&gt; <a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>
&gt; <a href="http://mail.python.org/mailman/listinfo/python-dev">http://mail.python.org/mailman/listinfo/python-dev</a><br>
&gt; Unsubscribe: <a href="http://mail.python.org/mailman/options/python-dev/ironfroggy%40gmail.com">http://mail.python.org/mailman/options/python-dev/ironfroggy%40gmail.com</a><br>
</p>