Python etree控件空标记格式
使用Python的etree创建XML文件时,如果我们使用子元素向文件写入一个空标记,我会得到: 不幸的是,我们在Fortran中使用的XML解析器库不能处理这个问题,即使它是一个正确的标记。它需要看到:Python etree控件空标记格式,python,xml,Python,Xml,使用Python的etree创建XML文件时,如果我们使用子元素向文件写入一个空标记,我会得到: 不幸的是,我们在Fortran中使用的XML解析器库不能处理这个问题,即使它是一个正确的标记。它需要看到: <MyTag></MyTag> 是否有办法更改etree中的格式规则或其他内容以实现此目的?从Python 3.4开始,您可以对和使用short\u empty\u elements参数: ElementTree.write方法和tostring函数都支持method
<MyTag></MyTag>
是否有办法更改etree中的格式规则或其他内容以实现此目的?从Python 3.4开始,您可以对和使用short\u empty\u elements参数: ElementTree.write方法和tostring函数都支持method关键字参数 在Python2.6的早期版本上,在您可以安装外部ElementTree库之前;版本1.3支持该关键字
是的,这听起来有点奇怪,但是html输出主要输出空元素作为开始和结束标记。有些元素仍然以空标记元素结束;具体来说,等等。不过,还是需要升级您的Fortran XML解析器,以实际解析符合标准的XML 如果您有可用的sed,您可以通过管道将python脚本的输出传输到
sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g"
另一个选项是查找任何出现的,并用添加空文本替换:
etree.SubElement(parent, 'child_tag_name').text=''
但请注意,这不仅会改变文档的表示,还会改变文档的结构:即,child_el.text将取代None
哦,就像Martijn说的,试着使用更好的库。解释一下代码,我使用的ElementTree.py版本包含以下一种写入方法: 然后我在需要打开-关闭标记而不是自动关闭标记的ElementTree节点上设置node.text=true\u empty\u string
通过控制程序计数器,我的意思是构造一组输入,在本例中,是一个对库方法进行某种奇怪的真理测试的对象,以便库方法的调用以我希望的方式遍历其控制流图。这是可笑的脆弱:在新版本的库中,我的黑客可能会崩溃,您可能应该将may视为几乎可以保证的。一般来说,不要打破抽象障碍。这对我来说很有用。这是在Python 3.4中直接解决的。此后,xml.etree.ElementTree.ElementTree的write方法具有short_empty_elements参数,该参数: 控制不包含任何内容的元素的格式。如果默认值为True,则它们将作为单个自关闭标记发出,否则它们将作为一对开始/结束标记发出
更多详细信息请参见。如果您的python>=3.4,请使用short\u empty\u elements=false选项,如其他答案中所示,但是: 如果您已经有了字符串形式的XML,并且无法接触代码 在哪里生成的。。
如果不幸的是,您陷入了使用python的困境,那么没有其他Fortran XML解析器可供使用,因此这是我们唯一的选择。谢谢有没有办法维护标签的外壳?显然,区分大小写也是一个问题,html并没有保留大小写…不能全部保留。。。谢谢你回答这个问题!如果我想在添加结束标记后读取一个XML并写入另一个XML,我该怎么做?@Ac3_DeXt3R:这不是一个明确的问题。您的意思是写入另一个XML文件吗?然后只需将write方法与方法参数集一起使用:ET.ElementTreeET.fromstring.writefileobj,method='html'。这在Python 2.7中不起作用。它会忽略它,除非你真的写了一些东西,比如一个空格,''。这至少在Python2.7中不起作用。我在导入下面添加了类,然后将true\u empty\u字符串分配给节点的文本,但什么也没发生。
>>> from xml.etree import ElementTree as ET
>>> ET.tostring(ET.fromstring('<mytag/>'), method='html')
'<mytag></mytag>'
sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g"
etree.SubElement(parent, 'child_tag_name').text=''
write('<' + tagname)
...
if node.text or len(node): # this line is literal
write('>')
...
write('</%s>' % tagname)
else:
write(' />')
class AlwaysTrueString(str):
def __nonzero__(self): return True
true_empty_string = AlwaysTrueString()
xml = "<foo/><bar/>"
xml = re.sub(r'<([^\/]+)\/\>', r'<\1></\1>', xml)
print(xml)
# output will be
# <foo></foo><bar></bar>