<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><style>p {margin:0px;padding:0px;} blockquote { border: 0px; margin-top: 0px; margin-bottom: 0px; }</style></head><body style="">
<p><font color="#000000"><font size="2"><font face="Verdana">Hi Stefan,</font></font></font><br></p><p>&nbsp;</p><p><font color="#000000" face="Verdana" size="2"><blockquote type="cite"></blockquote><blockquote type="cite">their own siblings (as you did in your example). I changed the implementation<br>to copy *all* source nodes first, and *then* start replacing them in the<br>target slice. Previously, they were copied over one by one while doing the<br>replacements, so now you're on the safe side here.<br></blockquote></font></p><p>&nbsp;</p><p>&nbsp;</p><p>I can confirm the objectify case works for me now:</p><p>&nbsp;</p><p>&gt;&gt;&gt;<br>&gt;&gt;&gt; import lxml.etree<br>&gt;&gt;&gt; import lxml.objectify<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; xml = lxml.objectify.XML(<br>...&nbsp;&nbsp;&nbsp;&nbsp; '&lt;a xmlns:py="http://codespeak.net/lxml/objectify/pytype"&gt;'<br>...&nbsp;&nbsp;&nbsp;&nbsp; '&lt;b name="b1"&gt;&lt;title py:pytype="str"&gt;tit&lt;/title&gt;&lt;text&gt;foo&lt;/text&gt;&lt;/b&gt;'<br>...&nbsp;&nbsp;&nbsp;&nbsp; '&lt;b name="b2"&gt;&lt;text&gt;bar&lt;/text&gt;&lt;/b&gt;&lt;/a&gt;')<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; print lxml.etree.tostring(xml, pretty_print=True)<br>&lt;a xmlns:py="http://codespeak.net/lxml/objectify/pytype"&gt;<br>&nbsp; &lt;b name="b1"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title py:pytype="str"&gt;tit&lt;/title&gt;<br>&nbsp;&nbsp;&nbsp; &lt;text&gt;foo&lt;/text&gt;<br>&nbsp; &lt;/b&gt;<br>&nbsp; &lt;b name="b2"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;text&gt;bar&lt;/text&gt;<br>&nbsp; &lt;/b&gt;<br>&lt;/a&gt;<br>&nbsp;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; foo = xml['b'][0]<br>&gt;&gt;&gt; bar = xml['b'][1]<br>&gt;&gt;&gt; foo['text'] = 'FOO!'<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; print lxml.etree.tostring(xml, pretty_print=True)<br>&lt;a xmlns:py="http://codespeak.net/lxml/objectify/pytype"&gt;<br>&nbsp; &lt;b name="b1"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title py:pytype="str"&gt;tit&lt;/title&gt;<br>&nbsp;&nbsp;&nbsp; &lt;text py:pytype="str"&gt;FOO!&lt;/text&gt;<br>&nbsp; &lt;/b&gt;<br>&nbsp; &lt;b name="b2"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;text&gt;bar&lt;/text&gt;<br>&nbsp; &lt;/b&gt;<br>&lt;/a&gt;<br>&nbsp;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; foo = xml['b'][0]<br>&gt;&gt;&gt; bar = xml['b'][1]<br>&gt;&gt;&gt; xml['b'] = [bar, foo]<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; print lxml.etree.tostring(xml, pretty_print=True)<br>&lt;a xmlns:py="http://codespeak.net/lxml/objectify/pytype"&gt;<br>&nbsp; &lt;b name="b2"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;text&gt;bar&lt;/text&gt;<br>&nbsp; &lt;/b&gt;<br>&nbsp; &lt;b name="b1"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;title py:pytype="str"&gt;tit&lt;/title&gt;<br>&nbsp;&nbsp;&nbsp; &lt;text py:pytype="str"&gt;FOO!&lt;/text&gt;<br>&nbsp; &lt;/b&gt;<br>&lt;/a&gt; </p><p>&nbsp;<br>&gt;&gt;&gt; print etree.__version__<br>2.0.0-51328 <br></p><p><font color="#000000" face="Verdana" size="2">&nbsp;</font><font color="#000000" face="Verdana" size="2"></font></p><blockquote type="cite"><font color="#000000" face="Verdana" size="2"><a href="http://service.gmx.net/fm07/g.fcgi/mail/new?CUSTOMERNO=1130295&amp;t=de1814051385.1202304769.5d74dc62&amp;to="></a>although you can still do<br><br>  el.a = [el1, el2]<br></font></blockquote><blockquote type="cite">&nbsp;</blockquote><br><p>&gt;&gt;&gt; l = [1, 2, 3, 4]</p><p>&gt;&gt;&gt; l[2:3] = ["a", "b", "c", "d"]<br>&gt;&gt;&gt; l<br>[1, 2, 'a', 'b', 'c', 'd', 4]<br>&gt;&gt;&gt; root = objectify.Element("root")<br>&gt;&gt;&gt; root.l = [1, 2, 3, 4]<br>&gt;&gt;&gt; root.l[2:3] = ["a", "b", "c", "d"]<br>&gt;&gt;&gt; print objectify.dump(root)<br>root = None [ObjectifiedElement]<br>&nbsp;&nbsp;&nbsp; l = 1 [IntElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'int'<br>&nbsp;&nbsp;&nbsp; l = 2 [IntElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'int'<br>&nbsp;&nbsp;&nbsp; l = 'a' [StringElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'str'<br>&nbsp;&nbsp;&nbsp; l = 4 [IntElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'int'<br>&nbsp;&nbsp;&nbsp; l = 'b' [StringElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'str'<br>&nbsp;&nbsp;&nbsp; l = 'c' [StringElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'str'<br>&nbsp;&nbsp;&nbsp; l = 'd' [StringElement]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * py:pytype = 'str'<br>&gt;&gt;&gt; etree.tostring(root, pretty_print=True)<br>'&lt;root xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" py:pytype="TREE"&gt;\n&nbsp; &lt;l py:pytype="int"&gt;1&lt;/l&gt;\n&nbsp; &lt;l py:pytype="int"&gt;2&lt;/l&gt;\n&nbsp; &lt;l py:pytype="str"&gt;a&lt;/l&gt;\n&nbsp; &lt;l py:pytype="int"&gt;4&lt;/l&gt;\n&nbsp; &lt;l py:pytype="str"&gt;b&lt;/l&gt;\n&nbsp; &lt;l py:pytype="str"&gt;c&lt;/l&gt;\n&nbsp; &lt;l py:pytype="str"&gt;d&lt;/l&gt;\n&lt;/root&gt;\n'<br>&gt;&gt;&gt; print etree.tostring(root, pretty_print=True)<br>&lt;root xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" py:pytype="TREE"&gt;<br>&nbsp; &lt;l py:pytype="int"&gt;1&lt;/l&gt;<br>&nbsp; &lt;l py:pytype="int"&gt;2&lt;/l&gt;<br>&nbsp; &lt;l py:pytype="str"&gt;a&lt;/l&gt;<br>&nbsp; &lt;l py:pytype="int"&gt;4&lt;/l&gt;<br>&nbsp; &lt;l py:pytype="str"&gt;b&lt;/l&gt;<br>&nbsp; &lt;l py:pytype="str"&gt;c&lt;/l&gt;<br>&nbsp; &lt;l py:pytype="str"&gt;d&lt;/l&gt;<br>&lt;/root&gt;<br>&nbsp;<br>&gt;&gt;&gt; </p><p>&nbsp;</p><p>So the correct slice gets substituted, but the order is a bit confused.</p><p>&nbsp;</p><blockquote type="cite"><font color="#000000" face="Verdana" size="2">I don't think anyone will really miss the first one, especially as it only<br>worked for one list level anyway.</font></blockquote><p>&nbsp;</p><p>Right. I think the slice assignment stuff is basically corner cases, but it's nice somehow :-)</p><p>But I won't miss the first one for sure.</p><p>&nbsp;</p><p>Cheers,</p><p>Holger&nbsp;</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><div class="signature"><br /><br /><br />-- <br />GMX FreeMail: 1 GB Postfach, 5 E-Mail-Adressen, 10 Free SMS.<br />Alle Infos und kostenlose Anmeldung: http://www.gmx.net/de/go/freemail</div></body></html>