Python ElementTree:错误尝试实现漂亮的打印

时间:2011-05-18 04:40:54

标签: python xml elementtree

我有一些使用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,因为我知道它的工作原理并且具有我需要的大部分基本功能。

2 个答案:

答案 0 :(得分:1)

你说

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

但是该声明中没有任何东西看起来甚至像索引操作一样模糊。建议:无需以任何其他方式更改代码,请插入

print repr(elem), repr(level)

在上述声明之前

并编辑您的问题以显示结果。还要添加什么版本的Python,并显示如何导入ElementTree(或cElementTree)。

您似乎已经从the effbot's 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

以上神秘的错误消息一定是个错误; Python 2.7.1产生了更明智的

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

来自相同的代码。

答案 1 :(得分:1)

因为你把它放在一个类

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

我希望elem是实例(记住通常我们把自己放在这里)
和级别实际上是您尝试传递的elem

这意味着尝试将元素乘以字符串会抛出我认为合理的TypeError

正如John Machin所说,将这段代码从课堂上拉出来并将其作为一个独立的功能保留下来,你应该有更多的运气