質問: xdoc.documentElement.cloneNode(recipe) # コピーしたレシピ内にある料理名を変更 recipe2.getElementsByTagName("dish").item(0).childNodes[0].data="不都合なパン" # コピーしたレシピをドキュメントに追加 xdoc.insertBefore(recipe2, recipe) # 内容を文字列に変換して表示 print(xdoc.toxml()) ``` 実行結果 ``` 不都合なパン 小麦粉 イースト 水 食塩 全ての材料を一緒にして混ぜます。 十分にこねます。 布で覆い、暖かい部屋で1時間そのままにしておきます。 もう一度こねます。 パン焼きの容器に入れます。 布で覆い、暖かい部屋で1時間そのままにしておきます。 オーブンに入れて温度を180°Cにして30分間焼きます。 基本的なパン 小麦粉 イースト 水 食塩 全ての材料を一緒にして混ぜます。 十分にこねます。 布で覆い、暖かい部屋で1時間そのままにしておきます。 もう一度こねます。 パン焼きの容器に入れます。 布で覆い、暖かい部屋で1時間そのままにしておきます。 オーブンに入れて温度を180°Cにして30分間焼きます。 ```
回答: エラーの直接の原因は、XMLオブジェクト内で`unicode`と`str`が混在していることです。 StringIO.pyのドキュメントで注意されている通り、(日本語のようなマルチバイト文字を扱う際には)意識的にエンコーディングに配慮してやる必要があります。 この例外を解決するには、26行目の文字列に"u"を付けてあげてください: ``` recipe2.getElementsByTagName("dish").item(0).childNodes[0].data=u"不都合なパン" ``` 実際に該当する行を上記の通り修正した上で再実行すれば、処理の正常実行が確認できると思います。 > > また、文字化けも起きているのですが対処方法はありますか。(UTF-8を使用している) > > > おそらくコードをwindows上で実行されていると思うので、コンソールのencodingがSJIS/CP932になっているのではと思います。次のように、`toxml()` に適切なencodingを渡してあげれば解決すると思います: ``` print(xdoc.toxml(encoding='sjis')) ```