Python etree控制空标记格式

时间:2012-09-17 13:49:26

标签: python xml

使用Python的etree创建XML文件时,如果我们使用SubElement向文件写入空标记,我会得到:

<MyTag />

不幸的是,我们在Fortran中使用的XML解析器库虽然它是一个正确的标记,却无法处理它。需要看看:

<MyTag></MyTag>

有没有办法更改格式规则或etree中的某些内容才能使其正常工作?

6 个答案:

答案 0 :(得分:13)

从Python 3.4开始,您可以对tostring() functionElementTRee.write() method使用short_empty_elements参数:

>>> from xml.etree import ElementTree as ET
>>> ET.tostring(ET.fromstring('<mytag/>'), short_empty_elements=False)
b'<mytag></mytag>'

在较旧的Python版本(2.7到3.3)中,作为解决方法,您可以使用html方法写出文档:

>>> from xml.etree import ElementTree as ET
>>> ET.tostring(ET.fromstring('<mytag/>'), method='html')
'<mytag></mytag>'

ElementTree.write()方法和tostring()函数都支持method关键字参数。

即使是早期版本的Python(2.6及更早版本),您也可以安装外部ElementTree库; 1.3版支持该关键字。

是的,这听起来有点奇怪,但html输出主要输出空元素作为开始和结束标记。有些元素最终仍然是空标记元素;具体为<link/><input/><br/>等。仍然是,或者升级你的Fortran XML解析器来实际解析符合标准的XML!

答案 1 :(得分:4)

这在Python 3.4中直接解决了。从那时起,write的{​​{1}}方法具有xml.etree.ElementTree.ElementTree参数:

  

控制不包含内容的元素的格式。如果为True(默认值),它们将作为单个自闭合标记发出,否则它们将作为一对开始/结束标记发出。

xml.etree documentation

中的更多详细信息

答案 2 :(得分:2)

添加空text是另一种选择:

etree.SubElement(parent, 'child_tag_name').text=''

但请注意,这不仅会改变文件的表现形式,还会改变文件的结构:即child_el.text''而不是None

哦,就像Martijn说的那样,尝试使用更好的库。

答案 3 :(得分:1)

如果你有sed可用,你可以将你的python脚本的输出传递给

sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g"

哪会发现<Tag />的任何发生,并将其替换为<Tag></Tag>

答案 4 :(得分:0)

对代码进行解释,我使用的gzread版本在unzipBuffer方法中包含以下内容:

PK.....

为了引导程序计数器,我创建了以下内容:

ElementTree.py

然后我在那些我想要一个开 - 关标签而不是一个自关闭标签的ElementTree节点上设置_write

通过“引导程序计数器”我的意思是构建一组输入 - 在这种情况下是一个有点奇怪的真实测试的对象 - 一个库方法,这样库方法的调用就像我一样遍历它的控制流图想要它。这是非常脆弱的:在新版本的库中,我的黑客可能会破坏 - 你应该把“可能”当作“几乎保证”。一般来说,不要打破抽象障碍。它在这里对我有用。

答案 5 :(得分:0)

如果您有 python >=3.4,请使用其他答案中已经显示的 short_empty_elements=False 选项,但是:

  1. 如果您已经拥有字符串形式的 XML 并且无法触摸代码 它在哪里生成..
  2. 如果您遇到 Python <3.4..
  3. 如果您使用的是其他坚持使用自闭合标签的 XML 库..

然后这有效:

 xml = "<foo/><bar/>"
 xml = re.sub(r'<([^\/]+)\/\>', r'<\1></\1>', xml)

 print(xml)

 # output will be
 # <foo></foo><bar></bar>