2011-11-09 11 views
3

xmlドキュメントを作成するためにlxml "E-Factory"(別名ElementMaker)を使用しています。しかし、E-工場を使用して、私は「データ付加」要素でダッシュを指定するかどうかはわかりませんPython lxml E-Factory

<url> 
    <date-added>2011-11-11</date-added> 
</url> 

:私はこれに似たXML文書を生成しようとしています。ダッシュをマイナス記号と解釈しているようです。ここで

は、私が言及してきたドキュメントである:ここでは http://lxml.de/tutorial.html#the-e-factory

エラーを再現する方法です:

from lxml import etree 
from lxml.builder import ElementMaker 

E = ElementMaker() 
URL = E.url 
DATE_ADDED = E.date-added 

xml = URL(DATE_ADDED(myobject.created.strftime('%Y-%m-%dT%H:%M:%S')),) 


NameError global name 'added' is not defined 

誰もがそれを正しく持つ要素をレンダリングするか取得するためにトリックを知っていますダッシュ?

ありがとうございます。ジョー

答えて

6

ElementMaker

は、XMLツリーを構築するために(例えばE.date_added使用して)タグ名に関数をマップします。ただし、HTML/XMLタグで許可される文字とPython関数の間に不一致があります。 PEP 8に記載されているように:"パッケージ名とモジュール名のモジュール名はすべて小文字でなければなりません。可読性を向上させる場合は、モジュール名にアンダースコアを使用できます。"

>>> def foo-bar(): 
    File "<stdin>", line 1 
    def foo-bar(): 
     ^
SyntaxError: invalid syntax 

だけではなく、引数として名前を供給することにより、ビットより冗長date-addedタグを作成し、それを解決するには:だから、date_added関数はPythonの関数に存在することが許可されていないアンダースコアを含み、 :

>>> etree.tostring(E.url(E('date-added', '2011-11-11'))) 
'<url><date-added>2011-11-11</date-added></url>' 
+0

このソリューションをお寄せいただきありがとうございます。それはうまくいくように見え、謎の「E」オブジェクトが何が起こっているのかを別の光で見るのを助けました。ご回答いただきありがとうございます。 –

7

説明:あなたはvalid Python identifierするE.ニーズの後に置く何。これにはアンダースコアが含まれますが、ハイフンは含まれません。 E.date-added(E.date) - addedのように「正常に」コンパイルされますが、実行時に失敗します(ご使用のケースで)addedが定義されていません。

代替:

(1)E.tagは、すべての法的XMLタグでは動作しないだけで化粧品のトリックです。実際には、Pythonオブジェクトの属性はちょうど古いゴミにもなりうるので、ソースコードでobj.really+funky%attribute*name,dudeを実行することはできません。

DATE_ADDED = getattr(E, 'date-added') 

、その後、あなたが今そうであるようにDATE_ADDEDを使用して:あなたは、タグにあなたが実行して要素を作成するたびに指定する必要はありませんつまり、要素の作成の同じパターンを維持することができます:ワン不発弾のトリックは、より良いトリックに値します。

(2)スキーマが管理下にある場合は、ハイフン(日付付き)の代わりにアンダースコア(date_added)を使用します。

+0

ありがとうございます。これは、getattrメソッドを使用する大きなアプローチです。 –