5

xml.dom.minidomオブジェクトからファイルにコンテンツを書き込もうとしています。簡単なアイデアは、「writexml」メソッドを使用することです。

import codecs

def write_xml_native():
    # Building DOM from XML
    xmldoc = minidom.parse('semio2.xml')
    f = codecs.open('codified.xml', mode='w', encoding='utf-8')
    # Using native writexml() method to write
    xmldoc.writexml(f, encoding="utf=8")
    f.close()

問題は、ファイル内のラテン語でエンコードされていないテキストが破損することです。もう1つの方法は、テキスト文字列を取得してファイルに明示的に書き込むことです。

def write_xml():
    # Building DOM from XML
    xmldoc = minidom.parse('semio2.xml')
    # Opening file for writing UTF-8, which is XML's default encoding
    f = codecs.open('codified3.xml', mode='w', encoding='utf-8')
    # Writing XML in UTF-8 encoding, as recommended in the documentation
    f.write(xmldoc.toxml("utf-8"))
    f.close()

これにより、次のエラーが発生します。

Traceback (most recent call last):
  File "D:\Projects\Semio\semioparser.py", line 45, in <module>
    write_xml()
  File "D:\Projects\Semio\semioparser.py", line 42, in write_xml
    f.write(xmldoc.toxml(encoding="utf-8"))
  File "C:\Python26\lib\codecs.py", line 686, in write
    return self.writer.write(data)
  File "C:\Python26\lib\codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 2064: ordinal not in range(128)

XMLテキストをファイルに書き込むにはどうすればよいですか?私が欠けているのは何ですか?

編集します。エラーはdecodeステートメントを追加することで修正されます: f.write(xmldoc.toxml("utf-8").decode("utf-8")) しかし、ロシアのシンボルはまだ壊れています。

インタプリタで表示した場合、テキストは破損していませんが、ファイルに書き込んだ場合は破損します。

4

2 に答える 2

9

うーん、これはうまくいくはずですが:

xml = minidom.parse("test.xml")
with codecs.open("out.xml", "w", "utf-8") as out:
    xml.writexml(out)

または、次のことを試すこともできます。

with codecs.open("test.xml", "r", "utf-8") as inp:
    xml = minidom.parseString(inp.read().encode("utf-8"))
with codecs.open("out.xml", "w", "utf-8") as out:
    xml.writexml(out)

更新:文字列オブジェクトからxmlを構築する場合は、次のように、minidomパーサーに渡す前にエンコードする必要があります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import codecs
import xml.dom.minidom as minidom

xml = minidom.parseString(u"<ru>Тест</ru>".encode("utf-8"))
with codecs.open("out.xml", "w", "utf-8") as out:
    xml.writexml(out)
于 2010-12-19T18:09:13.420 に答える
0

これを試して:

with open("codified.xml", "w") as f:
    f.write(xmldoc.toxml("utf-8").decode("utf-8"))

これは私にとってはうまくいきます(Python 3では)。

于 2010-12-19T17:48:17.593 に答える