我有一些使用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,因为我知道它的工作原理并且具有我需要的大部分基本功能。
答案 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所说,将这段代码从课堂上拉出来并将其作为一个独立的功能保留下来,你应该有更多的运气