2012-09-17 17 views
9

Pythonのetree持つXMLファイルを作成するとき、我々はSubElementを使用してファイルに空のタグを記述する場合は、私が手:Pythonのetree制御空のタグ形式

残念ながら
<MyTag /> 

、Fortranのdoesnのに使用される当社のXMLパーサライブラリそれが正しいタグであってもこれを処理しません。

<MyTag></MyTag> 

etreeの書式設定規則などを変更する方法はありますか?

答えて

10

は、ドキュメントを書き出すためにhtmlメソッドを使用します。

>>> from xml.etree import ElementTree as ET 
>>> ET.tostring(ET.fromstring('<mytag/>'), method='html') 
'<mytag></mytag>' 

write() methodtostring() functionサポートmethodキーワード引数の両方、あなたは、Python 2.7またはアップを使用して提供します。

以前のバージョンのPythonでは、外部ElementTreeライブラリをインストールできます。バージョン1.3ではそのキーワードがサポートされています。

はい、ちょっと変わったようですが、htmlの出力のほとんどは、空の要素を開始タグと終了タグとして出力します。いくつかの要素はまだ空のタグ要素として終わります。具体的には<link/>,<input/>,<br/>などである。それでも、Fortran XMLパーサをアップグレードして、標準に準拠したXMLを実際に解析してください!

+0

残念ながら、使用するFortran XMLパーサーは他にありません。これが唯一の選択肢です。ありがとう! – tpg2114

+0

タグの大文字小文字を維持する方法がありますか?明らかに大文字と小文字の区別も問題であり、 'html'は大文字小文字を保持しません。 – tpg2114

+0

@ tpg2114:いいえ、申し訳ありません。 –

0

あなたが利用可能sedをしている場合、あなたは可能性があり、パイプ<Tag />のいずれかの発生を見つけて、空のtextを追加<Tag></Tag>

2

ことによってそれを置き換えます

sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g" 

にあなたのPythonスクリプトの出力は別のオプションです:

etree.SubElement(parent, 'child_tag_name').text='' 

しかし、これは表現だけでなく、文書の内容:child_el.textNoneの代わりに''になります。

ああ、Martijn氏によると、より良いライブラリを使用しようとしています。

write('<' + tagname) 
... 
if node.text or len(node): # this line is literal 
    write('>') 
    ... 
    write('</%s>' % tagname) 
else: 
    write(' />') 

私は次のように作成したプログラムカウンタを操縦するために:コードを言い換え

0

は、私が使用ElementTree.pyのバージョンが_write方法で、以下が含まれてい

class AlwaysTrueString(str): 
    def __nonzero__(self): return True 
true_empty_string = AlwaysTrueString() 

それから私はnode.text = true_empty_stringを設定しましたそれらのElementTreeノードでは、自己閉じのタグではなく、開いた閉じタグが必要です。

「プログラムカウンタを操作する」とは、入力のセット(この場合はやや興味深い真理テストを持つオブジェクト)をライブラリメソッドに組み込んで、ライブラリメソッドの呼び出しがコントロールフローグラフを途中まで横断することを意味します私はそれが欲しい。これは馬鹿げたことです。ライブラリの新しいバージョンでは、私のハックが壊れるかもしれません。おそらく、 "力"は "ほぼ保証されている"と考えるべきです。一般に、抽象化障壁を壊さないでください。それはちょうどここで私のために働いた。

3

これはPython 3.4で直接解決されました。ないコンテンツが含まれていない要素のフォーマットを制御

:次にから、 xml.etree.ElementTree.ElementTreewrite方法は short_empty_elementsパラメータを有しています。 True(デフォルト)の場合、それらは単一の自己閉じタグとして出力されます。そうでない場合は、開始タグと終了タグのペアとして出力されます。

詳細はxml.etree documentationです。

関連する問題