在保持上下文的同时使用iterparse的最佳实践?

时间:2013-02-05 10:25:50

标签: python xml xml-parsing iterparse

关注a question I asked on iterparse general usage(以及J F Sebastian的回答)我将重新组织我的代码以解析nessus XML结果文件。引用前面的问题,文件结构是

<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 )。我将考虑为每个项目生成一行,具有以下特征:

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

我理解如何从XML文件中提取给定的文件(这实质上是我之前问题的答案)。我需要将这些提取的字段保留在上下文中(=我需要知道它们与哪个ReportHostReportItem相关联)。 我的想法是使用一个标记,一个变量,告诉我我是在ReportHost还是ReportItem区块并从那里决定(if inReportHost: ...) - 我担心这是但不是使用iterparse导航XML的正确方法。

是否有可以参考的“最佳实践”文件?

编辑:改进后的评论示例

1 个答案:

答案 0 :(得分:0)

通过etree.iterparse()迭代项目并通过end检测项目时,您必须保留中间元素以显示它们所属的主机。

在您的示例中,前两个已解析的元素是<ReportItem id="100"><ReportItem id="200">。接下来是<ReportHost host="host1">。这应该是您连接保留的中间信息并立即打印ReportHost详细信息的点。

另一种方法是解析文档两次,第一次收集ReportHost数据,第二次 - 打印每个ReportItem详细信息。

您可以对这些方法进行分析,以找出最适合您的方法。