使用Python的etree创建XML文件时,如果我们使用SubElement
向文件写入空标记,我会得到:
<MyTag />
不幸的是,我们在Fortran中使用的XML解析器库虽然它是一个正确的标记,却无法处理它。需要看看:
<MyTag></MyTag>
有没有办法更改格式规则或etree中的某些内容才能使其正常工作?
答案 0 :(得分:13)
从Python 3.4开始,您可以对tostring()
function和ElementTRee.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(默认值),它们将作为单个自闭合标记发出,否则它们将作为一对开始/结束标记发出。
答案 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
选项,但是:
然后这有效:
xml = "<foo/><bar/>"
xml = re.sub(r'<([^\/]+)\/\>', r'<\1></\1>', xml)
print(xml)
# output will be
# <foo></foo><bar></bar>