2016-12-01 100 views
1

这是我第一次在这里问一个问题,我是一个新手,所以我很抱歉,如果我的问题听起来有些愚蠢。 我的工作从一台机器流数据:在Python中使用XMLPullParser解析XML流

requests.get('http://IP:port/sample?interval=0&heartbeat=1000', stream = True)

,我在XML接收数据。这是XML数据的结构:

b'--9bc1ad19bf9e3b4049ab7e4f78dda451' 
b'Content-type: text/xml' 
b'Content-length: 15560' 
b'<?xml version="1.0" encoding="UTF-8"?>' 
b'<MTConnectStreams xmlns:m="urn:mtconnect.org:MTConnectStreams:1.3" xmlns="urn:mtconnect.org:MTConnectStreams:1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mtconnect.org:MTConnectStreams:1.3 http://www.mtconnect.org/schemas/MTConnectStreams_1.3.xsd">' 
b' <Header creationTime="2016-12-01T17:58:48Z" sender="MAZATROL-PC" instanceId="1480604825" version="1.3.0.17" bufferSize="131072" nextSequence="1301" firstSequence="1" lastSequence="42044"/>' 
b' <Streams>' 
b' <DeviceStream name="Mazak" uuid="Mazak">' 
b'  <ComponentStream component="Controller" name="controller" componentId="cont">' 
b'  <Samples>' 
b'   <AccumulatedTime dataItemId="yltime" timestamp="2016-12-01T15:45:15.662995Z" name="total_time" sequence="1214" subType="x:TOTAL">3104040</AccumulatedTime>' 
b'   <AccumulatedTime dataItemId="yltime" timestamp="2016-12-01T15:46:16.452858Z" name="total_time" sequence="1243" subType="x:TOTAL">3104101</AccumulatedTime>' 
b'   <AccumulatedTime dataItemId="yltime" timestamp="2016-12-01T15:47:17.331808Z" name="total_time" sequence="1272" subType="x:TOTAL">3104162</AccumulatedTime>' 
b'   <PathFeedrateOverride dataItemId="pfo" timestamp="2016-12-01T15:33:27.042482Z" name="Fovr" sequence="899" subType="ACTUAL">0</PathFeedrateOverride>' 
b'   <PathFeedrateOverride dataItemId="pfr" timestamp="2016-12-01T15:30:26.700817Z" name="Frapidovr" sequence="803" subType="RAPID">0</PathFeedrateOverride>' 
b'   <PathFeedrateOverride dataItemId="pfr" timestamp="2016-12-01T15:30:42.685031Z" name="Frapidovr" sequence="810" subType="RAPID">0</PathFeedrateOverride>' 

我只想从包含dataItemId的行中获取一些信息。 我这样做只是为了打印数据:

for line in r.iter_lines(): 
    if b'dataItemId' in line: 
      print(line) 

明知速度实在是至关重要的,因为我们希望有一个AWS数据库访问实时数据。 我迷失在我应该如何以最好的方式解析。根据我的发现,使用XmlPullParser是解析流数据而不会阻塞的最佳方式。但是,我不知道'开始'和'结束'应该是什么。 我真的失去了我应该如何进行而不会丢失任何数据,并保证我解析了一切。我正在考虑让一个接收数据的线程,另一个使用XmlPullParser分析数据的数据,一旦数据被放入json格式并发送,线就从树中删除。但是因为如果我只想解析具有dataItemId的行,我没有包含子节点的树结构,所以我不清楚它应该如何工作。 非常感谢您的帮助。 谢谢

+0

你正在寻找拉只有一个标签。你的意思是'开始'和'结束'是什么意思?你知道什么时候应该结束解析吗?即你能标记你的文件何时结束? – themistoklik

+0

正如我们流媒体一样,只要机器正在运行,我们就会收集数据。所以除非机器关机,否则我会继续接收数据并解析它。我指的是:parser = etree.XMLPullParser(events =('start','end')) – Wafa

+0

你试过开始事件是你想要的标记,并且结束为空字符串并失败?如果将这两个设置为事件会发生什么?还有你听说过SAX解析? – themistoklik

回答

1

代替使用图书馆的答案,让我指向另一个类似的方向。既然你捞了两个特定标记一个简单的方法是像this后,只有您的支票必须是

if element.tag=="tag1" or element.tag=="tag2" 

你也可以查看SAX,并按照同样的逻辑。如果您在考虑速度的情况下进行此操作,请对其进行描述并保留最适合您的需求的实施方案,以加快速度和节省空间。

也看到这个post