Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python etree控件空标记格式_Python_Xml - Fatal编程技术网

Python etree控件空标记格式

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

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

不幸的是,我们在Fortran中使用的XML解析器库不能处理这个问题,即使它是一个正确的标记。它需要看到:

<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>