0

非常に醜いxmlファイルを書き込むElementTreeを使用したpython 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 を使用していました。しかし、私が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つは、奇妙な理由で、スタンドアロン関数ではなくクラスのメソッドにしたことです。(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'

同じコードから。

于 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 に答える