我用Python的iterparse
解析 nessus 扫描的 XML 结果(.nessus 文件)。对意外记录的解析失败,但类似的记录已被正确解析。
XML 文件的一般结构是很多记录,如下所示:
<ReportHost>
<ReportItem>
<foo>9.3</foo>
<bar>hello</bar>
</ReportItem>
<ReportItem>
<foo>10.0</foo>
<bar>world</bar>
</ReportHost>
<ReportHost>
...
</ReportHost>
换句话说,很多主机(ReportHost
)有很多要报告的项目(ReportItem
),而后者有几个特点(foo
, bar
)。我将考虑为每个项目生成一行及其特征。
解析在文件中间的简单行处失败(foo
在这种情况下是cvss_base_score
)
<cvss_base_score>9.3</cvss_base_score>
同时解析了约 200 条相似的行,没有出现任何问题。
相关的代码如下——它设置上下文标记(inReportHost
and inReportEvent
它告诉我在 XML 文件结构中的位置,并根据上下文分配或打印一个值)
import xml.etree.cElementTree as ET
inReportHost = False
inReportItem = False
for event, elem in ET.iterparse("test2.nessus", events=("start", "end")):
if event == 'start' and elem.tag == "ReportHost":
inReportHost = True
if event == 'end' and elem.tag == "ReportHost":
inReportHost = False
elem.clear()
if inReportHost:
if event == 'start' and elem.tag == 'ReportItem':
inReportItem = True
cvss = ''
if event == 'start' and inReportItem:
if event == 'start' and elem.tag == 'cvss_base_score':
cvss = elem.text
if event == 'end' and elem.tag == 'ReportItem':
print cvss
inReportItem = False
cvss
有时具有 None 值(在cvss = elem.text
分配),即使相同的条目已在文件中的较早位置正确解析。
如果我在作业下面添加一些类似于
if cvss is None: cvss = "0"
然后进一步解析许多cvss
分配它们适当的值(还有一些是 None )。
当采取<ReportHost>...</reportHost>
这会导致错误的解析并通过程序运行它 - 它工作正常(即cvss
被安排了9.3
正如预期的那样)。
我迷失在我的代码中犯错误的地方,因为对于大量相似的记录,有些记录正确处理,有些记录不正确(有些记录是相同的,但处理方式仍然不同)。我也找不到有关失败记录的任何具体信息 - 之前和之后相同的记录都可以。