1

ネットワーク上のパケットをスニッフィングし、ScapyとPythonを使用して生のペイロードからXMLデータを回復しています。取得したXMLデータには、フレームをアセンブルするときにいくつかのタグが欠落しているため、etree.parse()関数を使用してXMLファイルを解析できません。壊れたXMLファイルを解析し、XPATH式を使用して必要なデータをトラバースして取得する方法はありますか?

4

1 に答える 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 に答える