强制ElementTree使用闭合标签

3

不要再使用:

<child name="George"/>

在XML文件中,我需要有:
<child name="George"></child>

一个丑陋的解决方案是将空格作为文本写入(不是空字符串,因为它会忽略它):

import xml.etree.ElementTree as ET
ch = ET.SubElement(parent, 'child')
ch.set('name', 'George')
ch.text = ' '

那么,由于我使用的是Python 2.7,我阅读了Python etree控制空标签格式,并尝试使用html方法,如下所示:

ch = ET.tostring(ET.fromstring(ch), method='html')

但是这给了:

TypeError: Parse() argument 1 must be string or read-only buffer, not Element

我不确定该怎么解决这个问题,请问你有什么建议吗?


2
在XML文件中,我需要有:<child name="George"></child>。除非你正在做一些不应该做的操作(比如以后使用正则表达式解析它),否则你真的不需要这样做。 - Tomalak
1
他们到底在做什么,需要这个要求的正当理由是什么? - Tomalak
1
所以他们正在使用一些不同于XML解析器的东西来“解析”XML。我想知道为什么这样的问题总是在错误的地方得到解决。嗯,无论如何。 :-/ - Tomalak
这不是针对Python 3的吗,@Tomalak?如果不是,我很乐意看到一个答案。 - gsamaras
1
使用lxml,ch.text = ''(空字符串)有效。请参见https://dev59.com/SBL6s4cB2Jgan1zn9kZQ#47817478。 - mzjn
显示剩余7条评论
2个回答

5
如果有人对其他Python版本感到困惑,可以参考这里的讨论,使用short_empty_elements参数即可。
例如:
>>> import xml.etree.ElementTree as ET
>>> ET.tostring(ET.Element("mytag"), encoding='unicode', short_empty_elements=False)
'<mytag></mytag>'

(我相信这适用于Python 3.6及以上版本)


short_empty_elements 在Python 3.4中添加:https://docs.python.org/3/whatsnew/3.4.html#xml-etree - mzjn

3

如果你像这样做,它应该可以在2.7中正常工作:

from xml.etree.ElementTree import Element, SubElement, tostring

parent = Element('parent')
ch = SubElement(parent, 'child')
ch.set('name', 'George')

print tostring(parent, method='html')
#<parent><child name="George"></child></parent>

print tostring(child, method='html')
#<child name="George"></child>

谢谢大家... "Short_Empty_Elements = False" 对我有用... - Pysparker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接