CDATA and lxml

S

Silfheed

Heyas

So first off I know that CDATA is generally hated and just shouldn't
be done, but I'm simply required to parse it and spit it back out.
Parsing is pretty easy with lxml, but it's the spitting back out
that's giving me issues. The fact that lxml strips all the CDATA
stuff off isnt really a big issue either, so long as I can create
CDATA blocks later with <>&'s showing up instead of &lt;&gt;&amp; .
I've scoured through the lxml docs, but probably not hard enough, so
anyone know the page I'm looking for or have a quick how to?

Thanks!
 
S

Stefan Behnel

Silfheed said:
So first off I know that CDATA is generally hated and just shouldn't
be done, but I'm simply required to parse it and spit it back out.
Parsing is pretty easy with lxml, but it's the spitting back out
that's giving me issues. The fact that lxml strips all the CDATA
stuff off isnt really a big issue either, so long as I can create
CDATA blocks later with <>&'s showing up instead of &lt;&gt;&amp; .
I've scoured through the lxml docs, but probably not hard enough, so
anyone know the page I'm looking for or have a quick how to?

There's nothing in the docs because lxml doesn't allow you to create CDATA
sections. You're not the first one asking that, but so far, no one really had
a take on this.

It's not as trivial as it sounds. Removing the CDATA sections in the parser is
just for fun. It simplifies the internal tree traversal and text aggregation,
so this would be affected if we allowed CDATA content in addition to normal
text content. It's not that hard, it's just that it hasn't been done so far.

Stefan
 
S

Stefan Behnel

Stefan said:
It's not as trivial as it sounds. Removing the CDATA sections in the parser is
just for fun.

.... *not* just for fun ...

obviously ...

Stefan
 
S

Stefan Behnel

Hi again,

Stefan said:
There's nothing in the docs because lxml doesn't allow you to create CDATA
sections. You're not the first one asking that, but so far, no one really had
a take on this.

So I gave it a try, then. In lxml 2.1, you will be able to do this:
'<root><![CDATA[test]]></root>'

This does not work for .tail content, only for .text content (no technical
reason, I just don't see why that should be enabled).

There's also a parser option "strip_cdata" now that allows you to leave CDATA
sections in the tree. However, they will *not* behave any different than
normal text, so you can't even see at the API level that you are dealing with
CDATA. If you want to be really, really sure, you can always do this:

Hope that helps,

Stefan
 
S

Silfheed

Hi again,

There's nothing in the docs because lxml doesn't allow you to create CDATA
sections. You're not the first one asking that, but so far, no one really had
a take on this.

So I gave it a try, then. In lxml 2.1, you will be able to do this:
'<root><![CDATA[test]]></root>'

This does not work for .tail content, only for .text content (no technical
reason, I just don't see why that should be enabled).

There's also a parser option "strip_cdata" now that allows you to leave CDATA
sections in the tree. However, they will *not* behave any different than
normal text, so you can't even see at the API level that you are dealing with
CDATA. If you want to be really, really sure, you can always do this:

Hope that helps,

Stefan

That is immensely cool. Do you plan to stick it into svn soon?
Thanks!
 
S

Silfheed

Hi again,
So I gave it a try, then. In lxml 2.1, you will be able to do this:
root = Element("root")
root.text = CDATA('test')
tostring(root)) '<root><![CDATA[test]]></root>'

This does not work for .tail content, only for .text content (no technical
reason, I just don't see why that should be enabled).
There's also a parser option "strip_cdata" now that allows you to leave CDATA
sections in the tree. However, they will *not* behave any different than
normal text, so you can't even see at the API level that you are dealing with
CDATA. If you want to be really, really sure, you can always do this:
Hope that helps,

That is immensely cool. Do you plan to stick it into svn soon?
Thanks!

Ah, looks like it's there already. Very cool, very cool. Thanks
again.
 

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,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top