2016-12-01 121 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