0

我有一些使用 ElementTree 的 python xml 代码,它编写了一个非常丑陋的 xml 文件。我想让 xml 文件更具可读性。但是 ElementTree 没有漂亮的打印功能。在文档中 ElementTree 显示了一个“缩进”方法。当我尝试使用此缩进方法时,出现以下错误。

   Traceback (most recent call last):
      File "/cygdrive/c/data/path/myFile.py", line 756, in <module>
          main()
          ...
          self.writeXML()
          File "/cygdrive/c/data/path/myFile.py", line 248, in writeXML
                self.indent(root)
     File "/cygdrive/c/data/path/myFile.py", line 252, in indent

        i = "\n" + level*"  "
        TypeError: object cannot be interpreted as an index


 def writeXML(self):
   root = self.myTree.getroot()
   self.indent(root)
   self.myTree.write(self.myXML)

 def indent(elem, level=0):
     i = "\n" + level*"  "   #Error Here!!
     if len(elem):
         if not elem.text or not elem.text.strip():
             elem.text = i + "  "
         if not elem.tail or not elem.tail.strip():
             elem.tail = i
         for elem in elem:
             indent(elem, level+1)
         if not elem.tail or not elem.tail.strip():
             elem.tail = i
     else:
         if level and (not elem.tail or not elem.tail.strip()):
             elem.tail = i

我是否错误地使用缩进?还是这段代码有错误?有什么更容易打印的建议吗?

历史:我曾经使用过打印漂亮的 PyXML。但是,当我使用 python 2.6 时,PyXML 已经死了。lxml 具有漂亮的打印效果,但不会安装在我的系统上。因此,我将所有代码都转换为使用 ElementTree,因为我知道它可以工作并且具有我需要的大部分基本功能。

4

2 回答 2

1

你说

i = "\n" + level*"  "
TypeError: object cannot be interpreted as an index

但是该语句中没有任何内容看起来甚至有点像索引操作。建议:在不以任何其他方式更改代码的情况下,插入

print repr(elem), repr(level)

在上述声明之前并编辑您的问题以显示结果。还要添加 Python 的版本,并显示您如何导入 ElementTree(或 cElementTree)。

您似乎已经从effbot 的 ElementLib中复制/粘贴了一个例程......除了混淆但不致命之外,它看起来还可以for elem in elem

一个主要问题是,出于某种奇怪的原因,您将其作为类的方法而不是独立函数。要么(1)把它拖出你的班级,然后像这样称呼它

indent(root)

或 (2) 将其定义更改为

def indent(self, elem, level=0)

看看问题是否消失。

更新问题将消失:

[Python 2.6.6]
>>> import xml.etree.ElementTree as et
>>> et.Element('atag') * "   "
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object cannot be interpreted as an index

上面那个神秘的错误信息一定是bug;Python 2.7.1 产生了更明智的

TypeError: can't multiply sequence by non-int of type 'Element'

来自相同的代码。

于 2011-05-18T05:21:31.060 回答
1

因为你已经把它放在一个类中

    def indent(elem, level=0):
        i = "\n" + level*"  "   #Error Here!!

我希望这elem是实例(记住通常我们把 self 放在这里)
,而 level 实际上是elem你试图传递的

这意味着试图将一个元素乘以一个字符串会抛出TypeError我认为合理的结果。

正如 John Machin 所说,将此代码从类中拉出并保留为独立函数,您应该有更多的运气

于 2011-05-18T07:29:20.083 回答