1

データを効果的に抽出して使用する方法を頭に入れようとして、XBRLドキュメントを調べています。私が苦労していることの1つは、コンテキスト情報を正しく使用していることを確認することです。以下は、私が遊んでいるドキュメントの1つからの抜粋です(これはMattelの最新の10-Kからのものです)

「実際の」データの調整に役立つため、コンテキストキーと値のペアを効率的に収集できるようにしたい。コンテキスト要素の例を次に示します。

- <context id="eol_PE6050----0910-K0010_STD_0_20091231_0">
  - <entity>
     <identifier scheme="http://www.sec.gov/CIK">0000063276</identifier> 
   </entity>
  - <period>
   <instant>2009-12-31</instant> 
   </period>
   </context>

これを始めたとき、親子関係があれば、メソッド(?)を親に適用することで、すべての子の属性、キー、値、およびテキストを直接取得できるはずだと思いました。しかし、子供たちは親から見つけることができますが、彼らの独立性を保持しています。つまり、子に属性、キー、値、またはテキストがある場合、それらの構成に親から直接アクセスすることはできません。代わりに、子を判別/識別し、子から必要なデータまたはメタデータにアクセスする必要があります。

このコードブロックが良い出発点である理由は完全にはわかりません。

 from lxml import etree
 test_tree=etree.parse(r'c:\temp\test_xml\mat-20091231.xml')
 tree_list=[p for p in test_tree.getiterator() 

したがって、tree_listは、xmlファイルに存在すると判断された要素のリストです。tree_list
には664個のアイテムしかなかったため、親内のすべての要素が親に含まれているという非常に悪い仮定をしたので、試し続けました。それらの要素(子ではない)のみを参照することにより、エンティティ、期間、およびインスタントにアクセスする

for each in tree_list:
    if 'context' in each.tag:
        contextlist.append(each)

つまり、コンテキストリスト内のアイテムにさまざまなメソッドを適用し続け、本当にイライラしました。最後に、私が質問を書いている間、私はどの方法が私にエンティティと期間を与えるかを理解するためにいくつかの助けを得ようとしていました私はちょうど試みることに決めました

children=[c for c in contextlist[0].iterchildren()]

したがって、私のリストの子には、コンテキストリストの最初の項目のすべての子が含まれます

子の1つはエンティティ要素で、もう1つは期間要素です。

さて、これらの子のそれぞれに子があり、entity要素には識別子の子要素があり、period要素にはインスタント子要素があるはずです。これは今朝のように見えたよりもはるかに複雑になっています。

実際のデータを正しく評価して操作するには、コンテキスト要素によって報告される詳細を知る必要があります。コンテキスト要素の子のそれぞれをテストする必要があるようです。これらの値を取得するためのより高速で効率的な方法はありますか?言い換えると、かなりの量のtry elseステートメントを実行しなくても、いくつかの要素を持ち、そのすべての子や孫などを含むデータ構造を作成する方法はありますか?

それらを取得したら、データディクショナリの構築を開始し、コンテキストに基づいて特定のエントリにデータ要素を割り当てることができます。したがって、コンテキスト要素を効率的かつ完全に取得することは、私のタスクにとって重要です。

4

1 に答える 1

3

要素ツリーインターフェイス(lxmlもサポート)を使用して、getiteratorは、現在の要素をルートとするサブツリー内のすべてのノードを反復処理します。

したがって、[list(c.getiterator()) for c in contextlist]必要なリストのリストが表示されます(または、使用目的に応じて、c後でcontextlistで圧縮する必要がないように、結果のリストに保持することもできます。つまり、タプルのリストを作成します)。[(c, list(c.getiterator())) for c in contextlist]

正確な形式のlistcompは[x for x in whatever]あまり意味がないことに注意してくださいlist(whatever)。代わりに、を使用して、他の反復可能なものをリストに変換してください。

于 2010-06-24T05:02:53.610 に答える