0

我提出关于 iterparse 一般用法的问题(以及JF 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 文件中提取给定的文件(这实质上是我之前问题的答案)。我需要将这些提取的字段保留在上下文中(= 我需要知道它们ReportHost与哪些ReportItem相关)。我的想法是使用一个标记,一个变量会告诉我我是在 aReportHost还是ReportItemblock 中并从那里决定 ( if inReportHost: ...) - 不过,我担心这不是使用 iterparse 导航 XML 的正确方法。

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

编辑:改进后的评论示例

4

1 回答 1

0

当通过 遍历项目etree.iterparse()并通过 检测它们时end,您必须保留中间元素才能显示它们属于哪个主机。

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

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

您可以分析这些方法以找到最适合您的方法。

于 2013-02-05T12:27:28.710 回答