Wiki訳注Jintrick.netによる意訳+メモです。原文との違いに留意してください。ToolsはXMLデータバインディングのためのPythonツールコレクションである。Pythonで書かれたのは単なる気まぐれではなく、ゼロから徹底的にPythonのイディオムが使われ、また他のプログラミング言語に対するPythonの多くのアドバンテージが利用されている。Amaraは4Suiteに基盤としている。4SuiteがよりXML標準の従順な実装を目指しているのに対して、Amaraは4Suiteの力にPython風のインタフェイスを追加するものである。DOMを増補するツール群saxtoolsSAXをPythonで使いやすくするツール群スタートガイド使い始めるもっとも簡単な方法は、EasyInstallを使って、Amaraとその依存関係にあるパッケージ全てを一気にインストールしてしまうことだ。amaraとタイプするだけで全て設定される。実行時トラブルがあるなら、EasyInstallを持っていないからだろうが、これはとても簡単にセットアップされる。それでも問題がある場合、メーリングリストで彼らに報告してほしい。monty.xml、からバインディングを作成する方法を示す。(取り上げられている全ての例示用ファイルは、Amaraパッケージのdemoディレクトリに置かれている。</python></monty>ここで、バインディングを作成するコードは次のようになる。amara.parse('monty.xml')docはデータバインディングの結果であり、XMLを表現するオブジェクトである。XML文書全体をバインダーに与えると、トップレベル要素を表現したメンバーを持つ文書、それそのものを表現したオブジェクトを得ることができた。argument"という内容をもった要素を得るには、こう書ける:doc.monty.python[1]parse関数には、file-likeオブジェクト(stream)も、文字列も渡すことができる。ローカルファイルパスやURLからXMLを取得したXMLをパースするためのparse_path関数もある(※)。1.2.0.2では、amara.parse_path関数がなく、amara.parse関数に統一されているようだ。bind_uri関数の4つに細分化されている。amara.parseの引数には、(Unicodeオブジェクトではない)XML文字列、open-file-likeオブジェクト、ファイルパス、URIを与えることができる。parse_path関数にファイルパスを与えるとFt.Lib.UriExceptionが投げられる場合がある。bind_file関数ならこの問題は起こらないようだ。amara.parse('xbel.xml')次のサンプルは最初と二番目のブックマークタイトルをprintしている。doc.xbel.folder.bookmark[1].titleこのバインダリはできるだけ自然な感じに扱おうと試みるのが特徴だ。通常、子要素にアクセスするにはただそれらの名前を使えば良い。一つ以上の同じ名前のものがあった場合、最初のものをバインドする。index(list[num])を用いて、同じ名前をもった複数の子要素の一つを特定することができる。doc.xbel.folder.bookmark[0].titletitleはテキストのみを含んだ要素である。表現doc.xbel.folder.bookmark[0].titleはこの要素を表現したバインディングオブジェクトを返す。そのようなオブジェクトは、Unicode変換メソッドを持っているため、それらの要素の子孫テキスト(その要素のサブツリーのすべてのテキストノード)を得ることができる。上記のコードラインはそれらをprintする。unicode(doc.xbel.folder.bookmark[0].title)Amaraにおいて、unicode変換をelementノードでcallするのは、XPathにおいて、string関数をelementノードでcallするのに非常に似ている。次のコード片は、ファイル内のすべてのブックマークURLをプリントアウトする再帰関数である。all_titles_in_folder(folder)しかし、実際の使用では恐らくこういうことはしないだろう。このタスクはXPathを使って、より小さなコードで、再帰を用いず、そしてより速い方法で実現できる。これは後述のセクションでカバーする。同名の要素の数をカウントしたいなら、lenを使う:len(doc.xbel.folder)これでトップレベルフォルダの数を得ることができる。DTDによる検証amara.parse()において、validate=Trueを設定することで、基礎的なパーサーにDTDによる検証を行わせることができる。バインダリの仕事デフォルトでは、バインドされたXML要素は専用オブジェクトとなる。それぞれの一般識別子(要素名)に対して、bindery.element_baseを継承したPythonクラスが作られる。属性は、単純なデータメンバ、つまり属性値をもったUnicodeオブジェクト値となる。要素オブジェクトは単一オブジェクトとして扱えるようにするために特別に構築されている。(そのケースでは対応した名前の最初の子要素が選択されるが、リストアイテムアクセスすることも、イテレートすることもできる)例に戻ろう。binding.xbel.folder.bookmarkは、binding.xbel.folder.bookmark[0]と同じである。どちらも最初のフォルダの最初のブックマークを返す。最初のフォルダの二番目のブックマークを得るには、binding.xbel.folder.bookmark[1]を使う。複雑な子要素バインダリは、ソースXMLの順番に関する情報を初期より保持していて、文書オブジェクトと子要素リストを通じてこれにアクセス可能だ:folder.xml_children子要素リストにおいて、子要素はそれぞれに対応するバインディングオブジェクトを使って、子テキストは単純にUnicodeオブジェクトなって表現される。バインドされた子テキストはデフォルトで正規化される、つまりバインディングはxml_childrenにおいて隣り合う二つのテキストノードには一切置き換わらないことに注意すべきだ。要素ノードが子要素とテキストを内容としていた場合に、どうやってテキストノードにアクセスするのだろうか。要素の子テキストを得るにはxml_child_textプロパティを使う。文書、<a>1<b>2</b>3<c/></a>において、a.xml_child_textはu'13'を返す。Unicode変換(unicode(a))はu'123'を返す。ノードの構造を調べるxml_docメソッドをcallすることで、最もバインダリなオブジェクトの構造についての情報を得ることができる。doc.monty.python.spameggsこれは「人が読むための」便利なツールである。「計算機が読むための」形式をしたノードの構造情報も得たいだろう。xml_propertyはXMLの属性と要素のオブジェクト参照名を表現するkeyをもった辞書を返す。0xb7bbcb8c>}xml_child_elementsは似たような辞書を返すが、子要素だけに絞られている。0xb7bbcb8c>}XMLを書き出す文書順に関する情報の保持は、バインダリがバインディングオブジェクトをXMLフォームに戻すために必要であり、その為にはxmlメソッドを使う。doc.xml()xmlメソッドは符号化されたテキストを返す。Unicodeではない。デフォルトの符号化方式はUTF-8である。文書の一部分をシリアライズすることもできる。folderstreamに出力を渡すこともできる。doc.xml(sys.stdout)出力する符号化方式を制御することもできる。綺麗にプリントしたり、XML宣言を出力したり等、XSLTのxsl:outputと同等の出力制御パラメータを用いることができる。omitXmldeclaration=u"yes"を与えたなら、XML宣言は出力されない。文字符号化方式(デフォルトはUTF-8)。必要ならwriterが自動的に文字実体を使用する。"yes"でXML宣言を省略、デフォルトは"no"。"yes"でXML宣言でスタンドアロンをセットする。出力のメディアタイプをセットする。これが必要になることはないだろう。出力がCDATAセクションにラップされる要素名のリスト。これはいくつかのケースで好ましい出力を提供する。Amaraに(ルートノードや)要素で、関連付けられていようといまいと、名前空間宣言を強制することができる。これは要素の内容においてQNameを使う際に特に便利である(隠れた名前空間)。u'http://example.com/'})force_nsdeclsはkeyにUnicodeの接頭辞、valueに名前空間URIをもった辞書である。これはたとえば、知られている全ての名前空間宣言をトップに強制する("分別のある"文書)のを簡単にする:doc.xml(force_nsdecls=doc.prefixes)訳注:1.2.0.2でprefixesプロパティは存在しないが......警告:文書中の名前空間宣言は、上記のような方法で強制されたそれに常に打ち勝つ。これはデフォルト名前空間をnullにする暗黙的な宣言を含む。言い換えると、XML名前空間を使っていない文書を、前述のような簡単な行程でデフォルト名前空間を持つ文書に変化させることはできない。XPathバインダリはXPathのサブセットをサポートしており、これはほとんど標準に準拠している。サポートされていないXPathの特長は非常にレアなものであり、実際に使用する場面においては、完全なサポートであるとみなしても良いだろう。folder.titleXPathクエリのコンテクストにしたいオブジェクトのxml_xpathメソッドを呼び出している。最初のフォルダの最初のブックマークの最初の子要素を(要素名を指定せず)得るには、このようにするか:oc.xbel.folder.bookmark.xml_xpath(u'*[1]')あるいは:doc.xbel.xml_xpath(u'folder[1]/bookmark[1]/*[1]')あるいは:doc.xbel.xml_xpath(u'/folder[1]/bookmark[1]/*[1]')あるいは:doc.xml_xpath(u'xbel/folder[1]/bookmark[1]/*[1]')等のようにする。警告:Pythonでは、リストのインデックスは0から始まるが、XPathでは1から始まる。訳注:XPathのそれはリストのインデックスではない。index]の省略形に過ぎない。注意:このXPathはノード集合を返し、Pythonではノードのリストとして扱われる。一つのノードを含むリストということになるが、しかし[0]を使って抽出しなければならない。戻り値はXPath表現(expr)に依存する。list(たとえ空っぽでも、また一つしかノードを含んでいなくても、常にlist)次の例はファイル内の全てのブックマークURLをプリントアウトする。シンプルでより簡潔なコードを前述している。unicode(title_elements[0])バインダリノードにXSLTを適用するバインダリ文書または要素に対して、直接XSLTを適用することができる。xml()してシリアライズしたものをXSLTに適用することもできるが、恐らくノードに対して直接行ったほうが簡単だし効果的だ。これを行うには、xml_xslt()を使う。この関数はかなり制限されており、最も簡単な変換しか使わない。この方法で変換が動作しない場合、xml()でシリアライズしてから、Ft.Xml.Xslt.transformを使うこと。これは完全なXSLT適合である。doc.xml_xslt('transform.xslt')必要なただ一つの引数は、XSLTスタイルシートへの参照である。これは(Unicodeでない)文字列、file-likeオブジェクト(stream)、ファイルパス、URIまたはFt.Xml.InputSource.InputSourceインスタンスのいずれでもよい。XMLでなければならない。外部実体参照やinclude等の他のリソースへのアクセスを要求してはならない。オプションのparam引数にはスタイルシートパラメタからなる辞書を指定できる。localname)のtupleで与えることができる。オプションのoutput引数は、出力が(行程とともに徐々に)書き出されるfile-likeオブジェクトである。params=params)これはidという(接頭辞のない)トップレベルパラメタと、xがhttp://example.com/nsの接頭辞、xをもつx:tagsというトップレベルパラメタを渡したXSLTを実行する。後者はテキストノードのノード集合をパラメタとして提供している。'w'))これは文字列として与えられたXSLTを実行し、ファイル/tmp/foo.txtに出力ストリームを吐く(XSLT出力は、テキスト、XMLまたはHTMLになり得る点に留意されたい)。このようにoutputが明示されている場合、戻り値はない。fileオブジェクトから読み込む。名前空間バインダリは名前空間をもった文書に対応している。item.title次はバインダリオブジェクトにおいて名前空間の構成要素がどのように保持されるかを示している。doc.RDF.prefix属性については、xml_attributesが、その要素の全ての属性の名前空間の情報を含んだ辞書である。詳細に関しては以下のAttributesの章を参照されたい。item_url上の例では名前空間接頭辞と名前空間名のマッピングを手動でセットしてある。XML名前空間が行儀よく使用されるなら、このステップを踏む必要はないだろう。バインダリのdocumentオブジェクトはパースした文書であれば、トップレベル要素に作られた名前空間宣言を自動で記憶する。IDに基づいて作られている。そのようなマッピングには制限がある。その一例として、XMLはPythonのIDで許されない、-(ダッシュ)のような文字をもを許してしまう。このようなケースでは、Amaraは名前を壊し、デフォルトではアンダースコアを使用する。/>のような文書のケースでは、doc.a_1を使って要素にアクセスでき、またdoc.a_1.b_1を使って属性にアクセスできる。これはXMLを照会する一般的なコードを書く際に問題をはらんでいる。文書のコンテクストによっては異なる方法で要素名が壊されるかもしれないからである。u'b-1']このNoneは、名前空間名だが、望まれるオブジェクトが実際にオリジナルの文書における名前空間にあるなら、もちろんUnicodeオブジェクトとして明示すべきである。u'b-1']これは属性の名前がそのownerの子要素の名前と衝突するという、非常にまれなシチュエーションに対応する。u'b-1']でアクセスできる。オリジナルのXMLの名前に関する情報は、DOM由来のプロパティを使って得ることができる。element.nodeNameelement.localNameelement.namespaceURIelement.prefixそして属性に関する似たような情報を得るには、elementノードのxml_attributeの辞書を利用できる。プッシュバインディング巨大なXMLファイルを扱っている場合、同時に全てのデータバインディングをメモリに保持したいとは思わないかも知れない。インスタンス化したいはずだ。文書をどのように解体したいのかについて明確なパターンをつかんでいるなら、amara.pushbind関数を使うことができる。bookmarks"すばらしいのは、このプログラムが一時にバインディング全体をメモリに保持しない点である。それぞれのイテレーションにおいて、これはただ各トップレベルのfolder要素を表現するのに必要なだけのXMLをロードする。pushbindは、呼び出される毎に、それぞれ小さなサブツリーをyieldするジェネレータである。patternのことらしい)に基づいたamaraバインダリオブジェクトである。keywordを使う)を渡すこともできる。"a"はファイル内のこの名前を持つ要素全てにマッチする。patternを調整する必要が出てくる。次の例では、最初の二つの"a"要素だけが、ジェネレータのyieldに含まれている。?StopIteration/doc/one/aというパターンも、サンプル文書について似た結果をもたらすだろう。これらのパターンに名前空間を使うには、pushbind関数に接頭辞を定義した辞書を渡せば良い。title変更、修正バインディングに変更を加えるのはとても容易である。属性値の変更は、簡単な代入でよい。modified]</python></monty>要素のすべての子を空にするにはこう:doc.monty.python.xml_clear()新たな要素やテキストを加えよう。newという名前の新しい空要素を作成し、それを最初のpython要素の最後の子供として追加してみる:doc.monty.python.xml_append(doc.xml_create_element(u'new'))テキストノードを追加する。Content')存在する子ノードの前後といった特定の位置に新しい要素やテキストを挿入することもできる。doc.xml_create_element(u'python'))特定の要素、属性、テキストノードを削除することもできる。doc.monty.pythondoc.monty.xml_remove_child(child)削除方法ついて徹底的に列挙してもいい。あるオブジェクトがその兄弟ノードの中でどの位置にあるかを、それを親から取り除くために使用することができる。この「位置」を得るにはxml_index_on_parentプロパティを用いる。doc.monty.python.xml_index_on_parent最初のpython要素はmontyの二番目の子なので、これはixに値「1」を代入する。doc.monty.python[1].xml_index_on_parent二番目のpython要素はmontyの4番目の子であるため、これはixに値「3」を代入する。indexを得たなら、それをxml_remove_child_atに渡すことで特定の子要素を削除するのに使用することができる。doc.monty.xml_remove_child_at(3)これは上で決定されたindexを用いて、二番目のpython要素を削除する。これはテキストノードにも同様に動作する:doc.monty.xml_remove_child_at(0)これは最初のテキストノードを削除する。このメソッドを呼ぶときにはindexを省略することもできる。デフォルトではそれは最後の子ノードを削除する:doc.monty.xml_remove_child_at()もし名前に関するあれこれの章で取り上げたような一意的な名前に関する問題に突き当たったなら、変更修正に関するマッピングプロトコルを使用可能だ。'namespace'と言われる。life="brian"/></monty>新しい要素に属性がどう現れるかが分かる。u'brian'}は実際には省略形である。<attrN_namespace>)は単に<attrN_qname>と書くことができる。doc.xml()今回ちょっとした「内容」も入れたことに留意のこと。要素を作成した後に属性を作成するには、xml_set_attributeメソッドを使う。doc.xml()これは上と同じXMLを生成する。名前空間を必要としないなら、xml_set_attributeの最初の引数は、単にその属性の名前になる。xml_set_attributeメソッドはその結果生成される属性の名前を返す。u'Pi'名前空間の情報を含めて、要素の属性について情報は、xml_attributesに保持されている。これは、それぞれの属性のローカル名をkeyに、名前空間で修飾された属性名(訳注:QNameのことらしい)とその名前空間URLのtupleを値にした辞書である。doc.xml()これは次のような出力を得る。xml:lang="en">Ni!</python></monty>標準が許すように、XML名前空間の宣言がない点に留意のこと。XML断片の追加Amaraでは、要素のxml_append_fragmentメソッドを通じて、XML文書を書き加える上で強力な「利便性」を提供している。リテラルなXMLの断片文字列(Unicodeではない、なぜならこれはパースの操作なのだから)をこのメソッドに渡すと、それはパースされ、要素に追加される。XML断片はwell-formedな解析される外部実態でなければならない。基本的に複数のルート要素も許されるが、それらは正確に均衡を保ち、特別な文字列はエスケープされる、等々が要求される。文書型宣言は禁止されている。encoding="ENC"?>を書くか、またはこの関数に符号化についてのパラメタを渡すことで上書き可能だ。u'py4']となる。オプションの「encoding」はXML断片をパースする際に用いられる符号化された文字列である。このパラメタが明示されると、XML断片のいかなる宣言も上書きされる。encoding="UTF-8"?><hello/>空の文書に特定のルート要素を作成することができる。amara.create_document()doc.xml_append(doc.xml_create_element(u"hello"))doc.hello.xml_append(doc.xml_create_element(u"world"))doc.xml()ルート要素に、nsパラメタを用いて名前空間をセットすることが可能である。他にもたくさんの便利なパラメタがある。help(amara.create_document)をPythonプロンプトで試してみよう。ノード(子孫含めて)をコピーするXSLTに通じているなら、xsl:copy-ofと同じことをAmaraで行うにはどうすればいいかを疑問に思うかもしれない。このような深いコピーを作成するには、Python標準ライブラリのcopyモジュールを使う。doc2.xml()PIとコメントバインダリはかなり自然な方法でXMLの構築をサポートする。0x433fec>]最初のアイテムはバインドされたPIオブジェクトで、二番目はバインドされたコメントである。u'url="xxx.css"')doc.xml_append(pi)doc.xml_append(doc.xml_create_element(u"A"))訳注:最後の行は明らかに意図するコードではないはず。"http://www.garshol.priv.no/download/xsa/xsa.dtd"><xsa/>これが文書要素を(別途xml_appendを必要とせずに)自動的に作成する点に注意。u"xsa"parseの将来のdoctypeサポート文書型宣言のある文書をパースした時点でルートノードが文書要素のQName、公開識別子、システム識別子を含むというアイデアはまだ動作しないが、これはPython/XMLライブラリの「癖」に起因している。次のバージョンでこれらのライブラリへの依存をなくし、これを改善すべきだ。u"xsa"内部のDTDサブセットの構造を、バインディングは保持しない。バインディングのカスタマイズバインダリは、XMLノードをイテレートし、ノードタイプ他の詳細によって引き金をひかれた規則の集合を「発射」することによって機能する。デフォルトのバインディングは、それぞれのノードタイプに登録されたデフォルトの規則の結果をバインディングした結果なのだが、ユーザ定義の規則を登録することを許可することによって、簡単に微調整できる。単純な文字列値としていくつかの要素を扱うXBELのtitle要素は常にシンプルなテキストであり、それらに対して豊潤なPythonオブジェクトを作成するのは、多くの場合「やり過ぎ」である。それらは要素内容のUnicode値というシンプルなデータメンバでしかないということもあり得る。この最適化をバインダリに行うには、simple_string_element_rule規則のインスタンスを登録する。この規則は、どの要素が簡素化されているかを指し示すXSLTパターン(訳注:XPathパターンのことらしい)のリストを(引数に)取る。u'url'])]それより個人的には、amara.parse関数のrulesキーワード引数が取るのは、iterableなオブジェクトで、各アイテムが規則のインスタンスでなければならない点にこそ注意が必要。特定の要素を完全に無視する文書の一部分にだけ焦点を当てたい、またメモリを節約し、複雑さを取り除くために、関心の外にある特定の要素をバインディング時には無視したい。そのようなケースではomit_element_ruleを使うことができる。doc.xbel.folder.title特定のノードタイプを完全に無視するPI、コメント、テキストノードなども、omit_nodetype_rule規則を使うことで文書から省くことができる。xml.dom.Node.TEXT_NODEという3つのノードタイプのうちの一つである。純粋に空白文字だけから成るノードを取り除いて「children」リストを汚さないようにしたいというのは、共通のニーズだろう。バインダリはこれに応えるためws_strip_element_rule規則を提供する。このパターンにマッチする要素は、空白文字を除去される。rules=rules)空白の文字を除去し、さらに特定要素を無視するといった、複数の規則を組み合わせることもできる。要素と属性の構造が関心の全てであり、そのテキスト内容はどうでもいいのなら、element_skeleton_ruleが使える。このパターンにマッチする要素は、全ての文字データを除去される。rules=rules)型の推論データバインディングの基礎的な考え方は、XMLをネイティブデータ型に変換することである。datetimeの値に推論可能かを知るために各XMLノード検査する規則を提供する。datetime.カスタム規則における名前空間の使用ビルトインのカスタム規則はXPathパターンを使用しており、それらは名前空間を明示するために接頭辞を用いる。バインダーツールに、どのような名前空間バインディングがあるかを教える必要があるだろう。rules=rules)しかしながら、先述の議論のように、トップレベル要素において全ての名前空間を宣言しているのなら、それらを明示的に接頭辞の辞書で繰り返す必要はない。プッシュバインディングと規則プッシュバインドにも規則を使用することができる。「a」要素から得たいのがそのテキスト内容だけだったとしよう。このとき次のようにすることができる。このサンプル文書は今度はわずかに違っている。elem.bu'1'カスタムバインディングのクラスをを使用するもっと洗練された微調整を必要とするなら、ユーザが独自にカスタマイズしたバインディングクラスを登録したいと思うのではないだろうか。次の例はbookmark要素にあるメソッドを与える。retrieveである。specialized_bookmark})ある要素型のバインドにおいて使用するクラスを登録するときは、その要素の名前空間URIとローカル名を明示する。XBELの例のように名前空間に属していないことを知っているなら、Noneを使う。NoneはほとんどのPython/XMLツールにおいて「名前空間に属していない」ことを示す正しいシグナルであり、空文字列""ではない。accesstrigger.pyのデモも参照のこと。カスタマイズされたバインディングについて一般的な注意点バインダリはバインディングから書き戻したXMLの辻褄が合うように、そしてXPathは期待された結果を返すように何とかしようとするのだが、バインディングをカスタマイズするとヘンテコな結果を引き起こすことになりやすい。一つの例として、simple_string_element_ruleを使用しxmlメソッドで再シリアライズするなら、その単純化された要素は子要素ではなく、属性として書き出されてしまうだろう。バインディングをカスタマイズした結果そのような不本意な結果に遭遇してしまったら、通常の処方箋はカスタマイズしたxmlメソッドを書くか、それに特化したXPathのラッパーを書くかである(XPathラッピングについてはbinderyxpath.xpath_wrapper_mixinを参照)。バインダリの拡張ガイドバインダリは拡張性を考慮してデザインされている。XMLの表現の巨大なフレキシビリティであるとか、開発者たちが多くの異なる方法でPythonオブジェクトを生成したいであろうことを考えると(逆もまた同様)、これがただ一つのやり方とはいえない。バインダリの拡張を書くことにより、どのようなニーズにでも応えられるのだが、管理しやすくするための幾つかの基礎的なルールはある。scriptにコンパイルする。Schematronのspec草案を全てサポートしている。convenienceにおける既知のギャップについてはTODOファイルを参照。Scimitarを利用する典型的な二つの局面を紹介しよう。instance3.xml」をvalidateしたいとしよう。最初に、Scimitarのコンパイラスクリプト、scimitar.pyを通じてschema1.stronを実行する。schema1.stronschema1.py(同名が.py拡張子で置き換えられる)というファイルが現在の作業ディレクトリに生成される。異なるロケーション、異なるファイル名を使いたいときは、"-o"オプションを使う。生成されたファイルはPythonで書かれたvalidatorスクリプトであり、schema1.stronで定義されたSchematron規則をチェックする。intance1.xml検証結果のレポートは、デフォルトでは標準出力に生成される。なくば"-o"オプションを使ってファイルにリダイレクトすることもできる。検証結果レポートは解析済みXML外部実体である。言い換えると、well-formedなXML文書によく似たファイルであるが、埋め込まれたタグを許可するために、いくつかの制限が解かれている。要素は二つの'ear'要素を内容に持つべきです。要素は二つの'ear'要素を内容に持つべきです。DOMにPython風のインタフェイスをDOMはJavaの世界からやってきたものであり、Python風のAPIからは程遠い(これまで述べてきたバインダリの手順を参照)。いくつかのDOM風の実装、たとえば4SuiteのDomletteにも、幾分Python風のイディオムが紛れ込んでいる。AmaraのDOMツールはさらにそれを推し進めたものだ。pushdomxml.dom.pulldomに通じている人もいるだろう。これはSAXとDOMの素晴らしいハイブリッドを提供し、SAX風のやり方で文書の重要な部分を効率的に断片化する。きめ細かい操作のためにDOMを使うのである。Amaraのpushdomは、このプロセスを幾分便利にしている。これにXPatternの集合を渡すと、そのパターンにしたがったDOMの断片を次々生成するジェネレータを提供してくれる。これにより、非常に小さなメモリの使用で巨大なファイルをプロセスすることが可能になるにもかかわらず、DOMの利便性のほとんどを利用できる。"Stamford"をプリントする。メッセージも参照のこと。Magic"という記事を参照のこと。与えられたノードのXPathを得るdomtools.abs_pathで、ノードの絶対パスを得ることができる。Location"という記事を参照のこと。脳みそが爆発しないSAXTenorsax(amara.saxtools.tenorsax)はSAXのロジックを「リニアライズする」ためのフレームワークであり、多少自然な流れを作りとともに必要とされる技術的なステートメントが少なくて済む。messageも参照のこと。5になる方向である)の実装である。NGライブラリで使えるデータタイプを含んだPythonモジュールを生成する。FlextyperはDTLLファイルを、含まれたデータタイプを実装するPythonモジュールにコンパイルする。dtll.xmlDTLLで定義されたデータタイプ名前空間一つ一つについてファイルがあり、そのセットが作成される。デフォルトでは出力ファイル名は入力に基づいて決められる。dtll-datatypes2.py等々である。NG実装のプロセッサインスタンスでこれらのデータタイプモジュールを登録できるようになる。2009-03-16。