

以下のようなXMLファイルとpythonのファイルで実行しようとしているのですが、エラーが発生しどうすればエラーが消えるのかわかりません。また、文字化けも起きているのですが対処方法はありますか。（UTF-8を使用している）

エラーコード（実行結果）

[code]

    C:\Users\g21125\python_xml_ex>python copy-element.py
    Traceback (most recent call last):
      File "copy-element.py", line 20, in <module>
        print(xdoc.toxml())
      File "C:\Python27\lib\xml\dom\minidom.py", line 46, in toxml
        return self.toprettyxml("", "", encoding)
      File "C:\Python27\lib\xml\dom\minidom.py", line 61, in toprettyxml
        return writer.getvalue()
      File "C:\Python27\lib\StringIO.py", line 271, in getvalue
        self.buf += ''.join(self.buflist)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    
    C:\Users\g21125\python_xml_ex>
    
[/code]

XMLファイル

[code]

    <!-- language: lang-xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <recipe name="パン" preparations-time="5分" cokking-time="3時間">
        <dish>基本的なパン</dish>
        <material quantity='3' unit='カップ'>小麦粉</material>
        <material quantity='0.25' unit='オンス'>イースト</material>
        <material quantity='1.5' unit='カップ'>水</material>
        <material quantity='1' unit='ティースプーン'>食塩</material>
        <point>
            <process>全ての材料を一緒にして混ぜます。</process>
            <process>十分にこねます。</process>
            <process>布で覆い、暖かい部屋で1時間そのままにしておきます。</process>
            <process>もう一度こねます。</process>
            <process>パン焼きの容器に入れます。</process>
            <process>布で覆い、暖かい部屋で1時間そのままにしておきます。</process>
            <process>オーブンに入れて温度を180℃にして30分間焼きます。</process>
        </point>
    </recipe>
    
[/code]

Pythonコード

[code]

    <!-- language: lang-python -->
    # coding: utf-8
    # element のクローンを生成, 追加する
    
    from xml.dom import minidom
    
    # sample.xmlファイルを読み込む
    xdoc = minidom.parse("sample.xml")
    
    # レシピを取得
    recipe = xdoc.documentElement
    
    # レシピをコピー
    recipe2 = xdoc.documentElement.cloneNode(recipe)
    # コピーしたレシピ内にある料理名を変更
    recipe2.getElementsByTagName("dish").item(0).childNodes[0].data="不都合なパン"
    # コピーしたレシピをドキュメントに追加
    xdoc.insertBefore(recipe2, recipe)
    
    # 内容を文字列に変換して表示
    print(xdoc.toxml())
    
[/code]

実行結果

[code]

    <?xml version="1.0" ?>
    <recipe cokking-time="3時間" name="パン" preparations-time="5分">
        <dish>不都合なパン</dish>
        <material quantity="3" unit="カップ">小麦粉</material>
        <material quantity="0.25" unit="オンス">イースト</material>
        <material quantity="1.5" unit="カップ">水</material>
        <material quantity="1" unit="ティースプーン">食塩</material>
        <point>
            <process>全ての材料を一緒にして混ぜます。</process>
            <process>十分にこねます。</process>
            <process>布で覆い、暖かい部屋で1時間そのままにしておきます。</process>
            <process>もう一度こねます。</process>
            <process>パン焼きの容器に入れます。</process>
            <process>布で覆い、暖かい部屋で1時間そのままにしておきます。</process>
            <process>オーブンに入れて温度を180℃にして30分間焼きます。</process>
        </point>
    </recipe>
    <recipe cokking-time="3時間" name="パン" preparations-time="5分">
        <dish>基本的なパン</dish>
        <material quantity="3" unit="カップ">小麦粉</material>
        <material quantity="0.25" unit="オンス">イースト</material>
        <material quantity="1.5" unit="カップ">水</material>
        <material quantity="1" unit="ティースプーン">食塩</material>
        <point>
            <process>全ての材料を一緒にして混ぜます。</process>
            <process>十分にこねます。</process>
            <process>布で覆い、暖かい部屋で1時間そのままにしておきます。</process>
            <process>もう一度こねます。</process>
            <process>パン焼きの容器に入れます。</process>
            <process>布で覆い、暖かい部屋で1時間そのままにしておきます。</process>
            <process>オーブンに入れて温度を180℃にして30分間焼きます。</process>
        </point>
    </recipe>
    
[/code]


CC BY-SA 3.0
2015-09-20T16:36:55.207
16807
2015-09-29T02:34:25.300
2015-09-29T02:34:25.300
5008
9505
question
python xml
pythonでXMLを操作でのエラーが発生と文字化け③


エラーの直接の原因は、XMLオブジェクト内で`unicode`と`str`が混在していることです。  
[StringIO.pyのドキュメントで注意されている通り](https://docs.python.org/2/library/stringio.html#StringIO.StringIO)、（日本語のようなマルチバイト文字を扱う際には）意識的にエンコーディングに配慮してやる必要があります。

この例外を解決するには、26行目の文字列に"u"を付けてあげてください：

[code]

    recipe2.getElementsByTagName("dish").item(0).childNodes[0].data=u"不都合なパン"
    
[/code]

実際に該当する行を上記の通り修正した上で再実行すれば、処理の正常実行が確認できると思います。

> また、文字化けも起きているのですが対処方法はありますか。（UTF-8を使用している）

おそらくコードをwindows上で実行されていると思うので、コンソールのencodingがSJIS/CP932になっているのではと思います。次のように、`toxml()`
に適切なencodingを渡してあげれば解決すると思います：

[code]

    print(xdoc.toxml(encoding='sjis'))
    
[/code]


CC BY-SA 3.0
2015-09-29T00:08:53.443
17041
2015-09-29T00:08:53.443
16807
answer