0

iterparseの一般的な使用法(およびJF Sebastianによる回答)について尋ねた質問に続いて、 nessusXML結果ファイルを解析するようにコードを再編成します。前の質問から引用すると、ファイル構造は次のとおりです。

<ReportHost host="host1">
  <ReportItem id="100">
    <foo>9.3</foo>
    <bar>hello</bar>
  </ReportItem>
  <ReportItem id="200">
     <foo>10.0</foo>
     <bar>world</bar>
</ReportHost>
<ReportHost host="host2">
   ...
</ReportHost>

言い換えれば、多くのホスト(ReportHost)は、レポートする項目()が多くReportItem、後者はいくつかの特性(foobar)を持っています。アイテムごとに1つの行を生成することを検討します。その特徴は次のとおりです。

host1,id="100",foo="9.3",bar="hello"
host1,id="200"foo="10.0",bar="world"
host2,...

XMLファイルから特定のファイルを抽出する方法を理解しています(これは本質的に私の前の質問に対する答えです)。これらの抽出されたフィールドをコンテキスト内に保持する必要があります(=どちらに関連しているかを知る必要がありReportHostますReportItem)。ReportHost私のアイデアは、マーカーを使用することでした。これは、私がブロック内にいるのかブロック内にいるのかを教えてくれる変数でありReportItem、そこから決定します(if inReportHost: ...)-ただし、これが反復解析でXMLをナビゲートする適切な方法ではないのではないかと心配しています。

それを参照する「ベストプラクティス」ドキュメントはありますか?

編集:コメントに続く改善された例

4

1 に答える 1

0

を介してアイテムを反復処理し、 を介しetree.iterparse()てそれらを検出する場合end、それらが属するホストを表示するために、中間要素を保持する必要があります。

あなたの例では、解析された最初の 2 つの要素は<ReportItem id="100">and<ReportItem id="200">です。<ReportHost host="host1">次に来る。ここで、保存された中間情報を連結し、ReportHost詳細を一度に出力する必要があります。

もう 1 つの方法は、ドキュメントを 2 回解析することです。1 回目はReportHostデータを収集し、2 回目はそれぞれのReportItem詳細を出力します。

これらの方法をプロファイリングして、最適な方法を見つけることができます。

于 2013-02-05T12:27:28.710 に答える