Python 断开的XML文件解析和使用XPATH

Python 断开的XML文件解析和使用XPATH,python,xml,Python,Xml,我正在嗅探网络上的数据包,并使用Scapy和Python从原始负载中恢复XML数据。当我组装框架时,我得到的XML数据缺少一些标记。因此,我无法使用etree.parse()函数解析XML文件。是否有任何方法可以解析损坏的XML文件并使用XPATH表达式遍历并获取所需的数据。我确信我的解决方案过于简单,无法涵盖所有情况,但它应该能够涵盖缺少关闭标记时的简单情况: >>> def fix_xml(string): """ Tries to insert missi

我正在嗅探网络上的数据包,并使用Scapy和Python从原始负载中恢复XML数据。当我组装框架时,我得到的XML数据缺少一些标记。因此,我无法使用etree.parse()函数解析XML文件。是否有任何方法可以解析损坏的XML文件并使用XPATH表达式遍历并获取所需的数据。

我确信我的解决方案过于简单,无法涵盖所有情况,但它应该能够涵盖缺少关闭标记时的简单情况:

>>> 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
>>def fix_xml(字符串):
"""
尝试插入丢失的结束XML标记
"""
错误=真
错误时:
尝试:
#每行放一个标签
string=string.replace('>','>\n')。replace('\n\n','\n'))
root=etree.fromstring(字符串)
错误=错误
除etree.XMLSyntaxError作为exc外:
text=str(exc)
pattern=“开始和结束标记不匹配:(\w+)行(\d+)和(\w+),行(\d+),列(\d+)
m=重新匹配(模式、文本)
如果m:
#检索发生错误的位置
缺失,l1,关闭,l2,c2=m.组()
l1,l2,c2=int(l1),int(l2),int(c2)
lines=string.split('\n')
打印“在第{1}行添加结束标记”。格式(缺少,l2)
缺少_行=行[l2-1]
#修改后的线路回到原来的位置
行[l2-1]=缺少行。替换(“”.format(结束),“”.format(缺少,结束))
字符串='\n'。连接(行)
其他:
提升
打印字符串
这似乎正确地添加了缺失的标记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>
>s=“”
"""
>>>修复xml
在第4行添加结束标记
在第7行添加结束标记