ネットワーク上のパケットをスニッフィングし、ScapyとPythonを使用して生のペイロードからXMLデータを回復しています。取得したXMLデータには、フレームをアセンブルするときにいくつかのタグが欠落しているため、etree.parse()関数を使用してXMLファイルを解析できません。壊れたXMLファイルを解析し、XPATH式を使用して必要なデータをトラバースして取得する方法はありますか?
質問する
529 次
1 に答える
2
私のソリューションは単純すぎてすべてのケースをカバーできないと確信していますが、終了タグが欠落している単純なケースをカバーできるはずです。
>>> def fix_xml(string):
"""
Tries to insert missing closing XML tags
"""
error = True
while error:
try:
# Put one tag per line
string = string.replace('>', '>\n').replace('\n\n', '\n')
root = etree.fromstring(string)
error = False
except etree.XMLSyntaxError as exc:
text = str(exc)
pattern = "Opening and ending tag mismatch: (\w+) line (\d+) and (\w+), line (\d+), column (\d+)"
m = re.match(pattern, text)
if m:
# Retrieve where error took place
missing, l1, closing, l2, c2 = m.groups()
l1, l2, c2 = int(l1), int(l2), int(c2)
lines = string.split('\n')
print 'Adding closing tag <{0}> at line {1}'.format(missing, l2)
missing_line = lines[l2 - 1]
# Modified line goes back to where it was
lines[l2 - 1] = missing_line.replace('</{0}>'.format(closing), '</{0}></{1}>'.format(missing, closing))
string = '\n'.join(lines)
else:
raise
print string
これは、欠落しているタグ B と C を正しく追加しているようです:
>>> s = """<A>
<B>
<C>
</B>
<B></A>"""
>>> fix_xml(s)
Adding closing tag <C> at line 4
Adding closing tag <B> at line 7
<A>
<B>
<C>
</C>
</B>
<B>
</B>
</A>
于 2012-09-19T13:21:41.620 に答える