关注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
),而后者有几个特征(foo
,bar
)。我将考虑为每个项目生成一行,具有以下特征:
host1,id="100",foo="9.3",bar="hello"
host1,id="200"foo="10.0",bar="world"
host2,...
我理解如何从XML文件中提取给定的文件(这实质上是我之前问题的答案)。我需要将这些提取的字段保留在上下文中(=我需要知道它们与哪个ReportHost
和ReportItem
相关联)。
我的想法是使用一个标记,一个变量,告诉我我是在ReportHost
还是ReportItem
区块并从那里决定(if inReportHost: ...
) - 我担心这是但不是使用iterparse导航XML的正确方法。
是否有可以参考的“最佳实践”文件?
编辑:改进后的评论示例
答案 0 :(得分:0)
通过etree.iterparse()
迭代项目并通过end
检测项目时,您必须保留中间元素以显示它们所属的主机。
在您的示例中,前两个已解析的元素是<ReportItem id="100">
和<ReportItem id="200">
。接下来是<ReportHost host="host1">
。这应该是您连接保留的中间信息并立即打印ReportHost
详细信息的点。
另一种方法是解析文档两次,第一次收集ReportHost
数据,第二次 - 打印每个ReportItem
详细信息。
您可以对这些方法进行分析,以找出最适合您的方法。