replacing xml elements with other elements using lxml

Stefan Behnel stefan.behnel-n05pAM at
Wed Aug 29 18:44:34 CEST 2007

Ultrus wrote:
> I'm attempting to generate a random story using xml as the document,
> and lxml as the parser. I want the document to be simplified before
> processing it further, and am very close to accomplishing my goal.
> Below is what I have so far. Any ideas on how to move forward?
> The goal:
> read and edit xml file, replacing random elements with randomly picked
> content from within
> Completed:
> [x] read xml
> [x] access first random tag
> [x] pick random content within random item
> [o] need to replace <random> tag with picked contents
> xml sample:
> <contents>Here is some content.</contents>
> <random>
>    <item><contents>Here is some random content.</contents></item>
>    <item><contents>Here is some more random content.</contents></item>
> </random>
> <contents>Here is some content.</contents>

Hmm, this is not well-formed XML, so I assume you stripped the example. The
root element is missing.

> Python code:
> from lxml import etree
> from StringIO import StringIO
> import random
> theXml = "<contents>Here is some content.</
> contents><random><item><contents>Here is some random content.</
> contents></item><item><contents>Here is some more random content.</
> contents></item></random><contents>Here is some content.</contents>"
> f = StringIO(theXml)
> tree = etree.parse(f)

This would raise an exception if the above really *was* your input.

> r = tree.xpath('//random')
> if len(r) > 0:
>    randInt = random.randInt(0,(len(r[0]) - 1))
>    randContents = r[0][randInt][0]
>    #replace parent random tag with picked content here
> now that I have the contents tag randomly chosen, how do I delete the
> parent <random> tag, and replace it to look like this:
> final xml sample (goal):
> <contents>Here is some content.</contents>
> <contents>Here is some random content.</contents>
> <contents>Here is some content.</contents>

what about:

   r.getparent().replace(r, random.choice(r))



More information about the Python-list mailing list