Reputation: 131787
I am trying to output a XML file using Python and lxml
However, I notice one thing that if a tag has no text, it does not close itself. An example of this would be:
root = etree.Element('document')
rootTree = etree.ElementTree(root)
firstChild = etree.SubElement(root, 'test')
The output of this is:
<document>
<test/>
</document
I want the output to be:
<document>
<test>
</test>
</document>
So basically I want to close a tag which has no text, but is used to the attribute value. How do I do that? And also, what is such a tag called? I would have Googled it, but I don't know how to search for it.
Upvotes: 6
Views: 5482
Reputation: 11
Use empty string '' like this:
root = etree.Element('document')
etree.SubElement(root, 'test').text = ''
Upvotes: 1
Reputation: 2173
Use lxml.html.tostring to serialize to HTML
import lxml.html
root = lxml.html.fromstring(mydocument)
print(lxml.html.tostring(root))
Upvotes: 3
Reputation: 6682
To clarify @ymv answer in case it might be of help to others:
from lxml import etree
root = etree.Element('document')
rootTree = etree.ElementTree(root)
firstChild = etree.SubElement(root, 'test')
print(etree.tostring(root, method='html'))
### b'<document><test></test></document>'
Upvotes: 7
Reputation: 10571
Note that <test></test>
and <test/>
mean exactly the same thing. What you want is for the test-tag to actually do have a text that consists in a single linebreak. However, an empty tag with no text is usually written as <test/>
and it makes very little sense to insist on it to appear as <test></test>
.
Upvotes: 7