2010-05-05 14 views
4

Je suis en train de produire un fichier XML en utilisant Python et lxmlFermer une étiquette sans texte dans lxml

Cependant, je remarque une chose que si une balise n'a pas de texte, il ne se ferme pas. Un exemple de ceci serait:

root = etree.Element('document') 
rootTree = etree.ElementTree(root) 
firstChild = etree.SubElement(root, 'test') 

La sortie de c'est:

<document> 
<test/> 
</document 

Je veux que la sortie soit:

<document> 
<test> 
</test> 
</document> 

Donc, fondamentalement, je veux fermer une balise qui n'a pas de texte, mais est utilisé pour la valeur de l'attribut. Comment je fais ça? Et aussi, comment appelle-t-on une telle étiquette? Je l'aurais googlé, mais je ne sais pas comment le chercher.

+0

Impossible de définir la valeur sur un retour à la ligne? Cela signifierait que 'test' aura un noeud enfant de type texte avec la valeur' \ n'. –

+0

Merci, mais je ne savais pas que est équivalent à et que c'est une norme acceptée pour le faire. Frank a répondu à ma question, mais si besoin est, je peux toujours utiliser \ n. – user225312

Répondre

7

Notez que <test></test> et <test/> signifient exactement la même chose. Ce que vous voulez, c'est que le tag de test ait réellement un texte composé d'un seul interligne. Cependant, une balise vide sans texte est généralement écrite comme <test/> et il est très peu logique d'insister pour qu'elle apparaisse comme <test></test>.

+0

Oh merci. Je n'étais pas au courant de ça. Je pensais maintenir la cohérence, si une balise n'avait pas de texte mais avait un attribut, il était obligatoire de le fermer. – user225312

2

Utilisez lxml.html.tostring sérialiser en HTML

import lxml.html 
root = lxml.html.fromstring(mydocument) 
print(lxml.html.tostring(root)) 
3

Pour clarifier @ymv réponse au cas où il pourrait être utile à d'autres:

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>' 
+0

Plus simple, si vous voulez que jQuery analyse correctement les éléments personnalisés. – GheloAce

0

Utiliser la chaîne vide '' comme celui-ci :

root = etree.Element('document') 
etree.SubElement(root, 'test').text = ''