0

現在、XML ファイルの Element 値にロジックを適用しようとしています。具体的には、要素名/属性自体には触れずに、すべての値を UTF-8 にエンコードしようとしています。

サンプル XML は次のとおりです。

<?xml version="1.0"?>
<sd_1>
    <sd_2>
        <sd_3>\311 is a fancy kind of E</sd_3>
    </sd_2>
</sd_1>

現在、これを達成するために3つの方法を試しましたが、成功しませんでした:

まず、各要素をループして、.text と .parse を使用して値を取得しようとしました。

import xml.etree.ElementTree as ET

et = ET.parse('xml/test.xml')

for child in et.getroot():
    for core in child:
        core_value = str(core.text)
        core.text = core_value.encode('utf-8')

et.write('output.xml')

これにより、テキスト \311 が正しく変更されていない XML ファイルが生成され、そのままの状態になります。

次に、cElementTree を使用して .iterparse を試してみましたが、役に立ちませんでした。

import xml.etree.cElementTree as etree

xml_file_path = 'xml/test.xml'
with open(xml_file_path) as xml_file:
    tree = etree.iterparse(xml_file) 
    for items in tree:
        for item in items:
            print item.text

etree.write('output1.xml')

これにより、次の結果が得られます。

 "...print item.text\n', "AttributeError: 'str' object has no attribute 'text'..."

そこで何が間違っているのかわかりませんが、同じ配置で複数の例を見てきましたが、.text なしで要素を印刷すると、最初に「end」の文字列値を持つタプルが表示されます。この方法で問題が発生します。

.findall() などの要素名を指定せずに、各要素に格納されている値にロジックを適用して、xml をファイルに書き込むときに、プログラムが反復されたときに行われた変更を保存するように、要素を適切に反復するにはどうすればよいですか要素値?

4

2 に答える 2

4

これはあなたが探しているものですか?

import xml.etree.ElementTree as ET

et = ET.parse('xml/test.xml')

for child in et.getroot():
    for core in child:
        core_value = str(core.text)
        core.text = core_value.decode('unicode-escape')

et.write('output.xml')
于 2013-03-27T20:03:38.470 に答える
0

これは興味深い質問です。あなたが提案した最初の方法に焦点を当てましょう。それは、この問題にアプローチするための完全に優れた方法であるはずです。行を1つずつ印刷すると、次のようになります。

>>> core_value
'\\311 is a fancy kind of E'

私に起こったことは、文字がリテラル '\' として読み取られ、そのように印刷するにはエスケープする必要があることです。エスケープされた文字 ( \\) をエスケープされていない文字 ( ) に変更する\と、次のようになります。

>>> cv = core_value.replace('\\311','\311')
'\xc9 is a fancy kind of E'
>>> print cv
É is a fancy kind of E

\311ここでの奇妙な点は、元のファイルのどの時点で1 文字または 4 文字であると「想定」されているかがわからないことです。それらがすべて1文字になることがわかっている場合は、この回答に基づいていくつかの卑劣なコードを書くことができます:

Python Unicode、通常の文字列にユニコード番号があり、ユニコードを印刷したい

a の後に続くすべてのものを\正しい Unicode 文字に変換し、\.

于 2013-03-27T20:20:30.540 に答える