2010-12-19 24 views
5

Dosyaya xml.dom.minidom nesnesinden içerik yazmayı deniyorum.Dosyaya XML yazılması python dosyasında yozlaştırır dosyaları

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() 

sorun dosyada olmayan latin kodlanmış metin bozarsa şudur: basit bir fikir 'WriteXml' yöntemi kullanmaktır.

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() 

Bu aşağıdaki hatası:

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) 

nasıl bir XML metin dosyasına yazıyorsunuz başka yolu metin dizesi almak ve açıkça dosyaya yazmaktır? Benim neyim eksik?

EDIT. Hata kodu decode ifadesi eklenerek giderilir: f.write(xmldoc.toxml("utf-8").decode("utf-8")) Ancak Rusça sembolleri hala bozuk.

Bir yorumlayıcıda görüntülendiğinde, ancak dosyada yazıldığı zaman metin bozuk değil.

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

Bu (gerçi, Python 3 altında) benim için çalışıyor:

+1

Sadece bir düşünce: Emin misin? dosyayı yanlış görüntülemiyorsunuz? Belki okuyucu utf-8'den başka bir kodlamayı bekliyor ve sadece borklu görünüyor. – Nubsis

+0

@Nubsis Bu tam olarak ne oluyordu. Görüntüleyici ASCII kodlamasını bekliyordu. Ancak ipucunu tutacağım çünkü .decode() kullanmak da sorun oldu. Teşekkürler! – martinthenext

cevap

9

Hmm, bu çalışması gerekir gerçi:

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

alternatif olarak deneyebilirsiniz:

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) 

Güncelleme: Eğer dize nesnenin dışarı xml inşa durumda, geçirmeden önce bunu kodlamak gerekir minidom ayrıştırıcısına şu şekilde:

#!/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) 
+0

Cevabınız için teşekkür ederiz. Tüm kodunuzu test ettim, hiçbiri benim için iyi değil. XML dosyasının açılması ile ilgisi olmayan son parça bile Rus dizgisini saçmalıklara çevirir. Bu, sorunun urf-8'in dosyalara yazılması anlamına geldiği anlamına gelir. Başka fikir var mı? – martinthenext

+0

@martinthenext: Geçerli "utf-8" aldığınızdan neredeyse eminim (3 örneğin tümü benim için iyi çalışır, hem windows hem de linux ve python 2.5, 2.6 & 2.7) veya python kurulumunuz bozulur; Burada ekran görüntüsü: http://img190.imageshack.us/img190/9072/minidom.png –

+0

Bekleyin, tercümanın kendisinin çıktısı iyi, sorun yok. Bir dosyaya yazıldığında bozulur. Bunu nasıl düzeltebilirim? – martinthenext

0

bu deneyin.

+0

nope, hala latin olmayan karakterleri bozar – martinthenext

+0

Eğer x = codecs.open ("semio2.xml", kodlama = "utf-8") ve xmldoc = minidom.parse (x) 'ise ne olur? –

+0

, 'UnicodeEncodeError: 'ascii' codec'i, '0 konumunda bulunan u' \ ufeff 'karakterini kodlayamaz: ordinal aralıkta (128)' değil. Nedenini anlamıyorum. – martinthenext

İlgili konular