如何在ElementTree PIParser中输出元素?

2024-10-03 04:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

如果您想在带有ElementTree的XML文件中保留注释,可以使用来自http://effbot.org/zone/element-pi.htm的PIParser

如果我有一个包含

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- This is a comment -->
<root>
  <foo>Hello World</foo>
</root>
<!-- That's all, folks -->

然后这两条评论将被保留

PIParser将xml包装在另一个<document>节点中,因此可以包含根节点之外的任何注释。这两个注释只是<document>中包含的另外两个元素

但是我应该如何输出xml呢?我使用这样的代码输出<document>的内容,而不输出<document>标记本身:

file.write('<?xml version="1.0" encoding="%s"?>\n' % encoding)
doc = tree.getroot()

for child in doc:
  file.write(ET.tostring(child, encoding, method))
  file.write("\n")

现在,如果编码是“utf-8”,这似乎是可行的。tostring()方法不会输出这些<?xml...?>行中的一行,可能是因为utf-8是默认值。这就是我用上面的file.write()显式编写<?xml...?>的原因。但是如果编码是“iso-8859-1”,那么tostring()在调用它的每个元素的开头放一个<?xml version="1.0" encoding="iso-8859-1"?>!因此,我在根节点之外的每个注释前面都有一个注释,在根节点本身前面也有一个注释。我不想那样,我只想在文件的最上面放一个。但是我没有像上面那样得到xml,而是得到

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml version='1.0' encoding='iso-8859-1'?>
<!-- This is a comment -->
<?xml version='1.0' encoding='iso-8859-1'?>
<root>
  <foo>Hello World</foo>
</root>
<?xml version='1.0' encoding='iso-8859-1'?>
<!-- That's all, folks -->

如何控制tostring()是否输出<?xml...?>?或者,我应该换一种方式吗


Tags: 文件节点fooisversionisorootxml