Python ElementTree: Ошибка при попытке реализовать красивую печать - PullRequest
0 голосов
/ 18 мая 2011

У меня есть некоторый XML-код на Python, использующий ElementTree, который пишет очень уродливый XML-файл.Я хотел сделать XML-файл немного более читабельным.Но ElementTree не имеет функции красивой печати.В документации ElementTree показан метод indent.Когда я пытаюсь использовать этот метод отступа, я получаю следующую ошибку:

   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, у которого была симпатичная печать.Но PyXML умер, когда я перешел на Python 2.6.У lxml есть симпатичная печать, но она не будет установлена ​​в моей системе.Поэтому я преобразовал весь свой код в ElementTree, потому что я знаю, что он работает и обладает большинством необходимых мне базовых функций.

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Потому что вы поместили это в класс

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

Я бы ожидал, что elem - это пример (обычно помните, что мы помещаем себя здесь)
и уровень на самом деле elem, который вы пытаетесь пройти в

Это означает, что при попытке умножить элемент на строку выбрасывается TypeError, что, я думаю, вполне вероятно.

Как говорит Джон Мачин, вытащите этот код из класса и оставьте его как отдельную функцию, и вам повезет больше

1 голос
/ 18 мая 2011

Вы говорите

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

но в этом утверждении нет ничего, что было бы даже смутно похоже на операцию с индексом. Предложение: не меняя код другим способом, введите

print repr(elem), repr(level)

перед приведенным выше утверждением и отредактируйте свой вопрос, чтобы показать результат. Также добавьте, какая версия Python, и покажите, как вы импортировали ElementTree (или cElementTree).

Похоже, вы скопировали / вставили подпрограмму из 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'

из того же кода.

...