如何在python中从日志文件提取xml进行解析

如何在python中从日志文件提取xml进行解析,python,xml,logging,xml-parsing,Python,Xml,Logging,Xml Parsing,我有一个包含xml信封的日志文件(两种类型的xml结构:请求和响应)。我需要做的是解析这个文件,提取xml-s并将它们作为字符串放入两个数组中(第一个数组用于请求,第二个数组用于响应),以便稍后解析它们 有什么想法可以用python实现吗 要分析的日志文件片段(日志包含): 2014-10-31 12:27:33600信息充值器\u MTelemedia2Channel[mbpa.module.mgw.mtelemedia.mtbilling.MTSender][]发送账单请求 2014-10-

我有一个包含xml信封的日志文件(两种类型的xml结构:请求和响应)。我需要做的是解析这个文件,提取xml-s并将它们作为字符串放入两个数组中(第一个数组用于请求,第二个数组用于响应),以便稍后解析它们

有什么想法可以用python实现吗

要分析的日志文件片段(日志包含):

2014-10-31 12:27:33600信息充值器\u MTelemedia2Channel[mbpa.module.mgw.mtelemedia.mtbilling.MTSender][]发送账单请求
2014-10-31 12:27:33601信息充值器\u MTelemedia2Channel[mbpa.module.mgw.mtelemedia.mtbilling.MTSender]
XXX
XXX
31/10/2014 12:27:33
123
3.
描述
http://localhost/status
2014-10-31 12:27:34487信息充值器\u MTelemedia2Channel[mbpa.module.mgw.mtelemedia.mtbilling.MTSender][]账单请求响应代码200
2014-10-31 12:27:34489信息充值器\u MTelemedia2Channel[mbpa.module.mgw.mtelemedia.mtbilling.MTSender]
XXX123XXX
123
排队等待处理
好啊
非常感谢您的回复

问候,,
Robert

正如@Paco和@Lord_Gestalter所建议的,您可以使用
xml.etree
替换文件中的非xml元素,如下所示:

# I use re to substitute non-XML elements
import re
# then use xml module as a parser
import xml.etree.ElementTree as ET

# read your file and store in string 's'
with open('yourfilehere','r') as f:
    s = f.read()
# then remove non-XML element with re
# I also remove <?xml ...?> part as your file consists of multiple xml logs
s = re.sub(r'<\?xml.*?>', '', ''.join(re.findall(r'<.*>', s)))
# wrap your s with a root element
s = '<root>'+s+'</root>'
# parse s with ElementTree
tree = ET.fromstring(s)

tree
<Element 'root' at 0x7f2ab877e190>
#我使用re替换非XML元素
进口稀土
#然后使用xml模块作为解析器
将xml.etree.ElementTree作为ET导入
#读取文件并存储在字符串“s”中
将open('yourfilehere','r')作为f:
s=f.read()
#然后使用re删除非XML元素
#我还删除了部分,因为您的文件包含多个xml日志
s=re.sub(r'','','',''.join(re.findall(r'',s)))
#用根元素包装您的s
s=''+s+''
#用ElementTree解析s
tree=ET.fromstring(s)
树

如果您不关心xml解析器,只需要'request'和'response'字符串,请使用re.search

with open('yourfilehere','r') as f:
    s = f.read()    
# put the string of both request and response into 'req' and 'res'
# or you need to construct a better re.search if you have multiple requests, responses
req = [re.search(r'<request.*\/request>', s).group()]
res = [re.search(r'<response.*\/response>', s).group()]

req
['<request xmlns="XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><transactionheader><username>XXX</username><password>XXX</password><time>31/10/2014 12:27:33</time><clientreferencenumber>123</clientreferencenumber><numberrequests>3</numberrequests><information>Description</information><postbackurl>http://localhost/status</postbackurl></transactionheader><transactiondetails><items><item id="1" client="XXX1" keyword="test"/><item id="2" client="XXX2" keyword="test"/><item id="3" client="XXX3" keyword="test"/></items></transactiondetails></request>']

res
['<response xmlns="XXX" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><serverreferencenumber>XXX123XXX</serverreferencenumber><clientreferencenumber>123</clientreferencenumber><information>Queued for Processing</information><status>OK</status></response>']
将open('yourfilehere','r')作为f:
s=f.read()
#将请求和响应的字符串放入'req'和'res'
#或者,如果您有多个请求、响应,则需要构建更好的搜索
req=[重新搜索(r'',s).group()]
res=[re.search(r'',s.group()]
请求
['XXXXXX 31/10/2014 12:27:33233]ptionhttp://localhost/status']
物件
['xxx123xxx123排队等待处理OK']

使用类似etree的解析器:在用正则表达式标识非XML行之后删除它们,然后使用标准解析器即可。除了XML解析(beautifulsoup对我来说相当有效)之外,我还将请求和响应放在字典中,请求作为键。
with open('yourfilehere','r') as f:
    s = f.read()    
# put the string of both request and response into 'req' and 'res'
# or you need to construct a better re.search if you have multiple requests, responses
req = [re.search(r'<request.*\/request>', s).group()]
res = [re.search(r'<response.*\/response>', s).group()]

req
['<request xmlns="XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><transactionheader><username>XXX</username><password>XXX</password><time>31/10/2014 12:27:33</time><clientreferencenumber>123</clientreferencenumber><numberrequests>3</numberrequests><information>Description</information><postbackurl>http://localhost/status</postbackurl></transactionheader><transactiondetails><items><item id="1" client="XXX1" keyword="test"/><item id="2" client="XXX2" keyword="test"/><item id="3" client="XXX3" keyword="test"/></items></transactiondetails></request>']

res
['<response xmlns="XXX" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><serverreferencenumber>XXX123XXX</serverreferencenumber><clientreferencenumber>123</clientreferencenumber><information>Queued for Processing</information><status>OK</status></response>']