XMLの属性の値とテキストを入れ替える in Python + lxml

 後で使いそうなのでメモ。
 文の添削をXMLで表したファイルがあるとする。

<document><correct value='は'></correct>元気です。
</document>

 ここでは「私『を』元気です。」を「私『は』元気です。」に訂正している。
 要素が誤った文字を指し、それに対する正しい文字を value 属性で表している。


 ここで、修正前の文と、修正後の文を得たいとする。
 ここでは、 Pythonxml/html 処理ライブラリである lxml を使う。
Windows での lxml のインストール → http://d.hatena.ne.jp/factal/20120705#1341473250


 修正前の文は lxml.html.text_content() を使えば得られる。

>>> import lxml.html
>>> root = lxml.html.fromstring(open('sample.xml', 'rb').read())
>>> root.text_content()
>>> print root.text_content()

私を元気です。


 修正後の文は xpath で要素を指定し、テキストと属性の値を入れ替えることで得られる。

>>> elements = root.xpath('//correct')
>>> for e in elements:
...     e.text = e.attrib['value']
...
>>> print root.text_content()

私は元気です。


 参考: Python(lxml)でhtmlを処理する まとめ - Gentleちゃれんじ Tips
 多分、日本語のページで一番 lxml に詳しいサイト。
 タイトルは「htmlを処理する」になってるけど、 xml にもそのまま使える。