Remove namespace declaration from ElementTree in lxml

Z

Zero Piraeus

:

I want to remove an unused namespace declaration from the root element
of an ElementTree in lxml.

There doesn't seem to be any documented way to do this, so at the
moment I'm reduced to sticking the output through str.replace() ...
which is somewhat inelegant.

Is there a better way?

-[]z.
 
S

Stefan Behnel

Zero said:
I want to remove an unused namespace declaration from the root element
of an ElementTree in lxml.

There doesn't seem to be any documented way to do this, so at the
moment I'm reduced to sticking the output through str.replace() ...
which is somewhat inelegant.

And also a bit error prone (unless you are sure the replaced string really
only occurs where you want to replace it). You can try this:

root = etree.parse(...).getroot()
new_root = etree.Element(root.tag, root.attrib)
new_root[:] = root[:]

Note, however, that this will not copy root-level PIs or internal DTD subsets.
But you can copy PIs and comments by hand.

Stefan
 
Z

Zero Piraeus

:
I want to remove an unused namespace declaration from the root element
of an ElementTree in lxml.
[...] I'm reduced to sticking the output through str.replace() ...
which is somewhat inelegant.

And also a bit error prone (unless you are sure the replaced string really
only occurs where you want to replace it).

"Nada es seguro" ... but it does seem unlikely that

' xmlns:someprefix="urn:foo:bar"'

will appear in the content. Not impossible though, I suppose. If I
want to try and make sure I only catch it as an element's attribute,
that leads me to a regex, which seems an even less clever idea.
You can try this:

root = etree.parse(...).getroot()
new_root = etree.Element(root.tag, root.attrib)
new_root[:] = root[:]

Note, however, that this will not copy root-level PIs or internal DTD subsets.
But you can copy PIs and comments by hand.

Thanks. I considered copying the tree, but didn't bother trying it as
I would expect it to be fairly expensive. Maybe no more expensive than
a regex though. I'll take a look ...

-[]z.
 
S

Stefan Behnel

Zero said:
You can try this:

root = etree.parse(...).getroot()
new_root = etree.Element(root.tag, root.attrib)
new_root[:] = root[:]

Note, however, that this will not copy root-level PIs or internal DTD subsets.
But you can copy PIs and comments by hand.

Thanks. I considered copying the tree, but didn't bother trying it as
I would expect it to be fairly expensive. Maybe no more expensive than
a regex though. I'll take a look ...

It's not actually copying the tree, but it does create a new document, a new
root element, and then moves the root children over from the original
document, which also involves reference adaptations throughout the entire
tree. So it does not come for free. I'd be interested if you can come up with
numbers how it compares to the string replacement.

Stefan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,054
Latest member
LucyCarper

Latest Threads

Top