2016-12-01 18 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を含む行からいくつかの情報を取得することに興味があります。 私はデータを印刷するためにこれをした:我々はAWSのデータベースにアクセスできるリアルタイムデータを持っていると思いますので、その速度を知る

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

は本当に重要です。 私は最善の方法でどのように解析すべきかについて迷っています。私が見つけたことから、XmlPullParserを使用することはストリーミングデータをブロックせずに解析する最善の方法です。しかし、私は「開始」と「終了」をどうすればよいのか分かりません。 私はどのようにデータを失うことなく、すべてを解析していることを保証しなければならないのか、本当に失われています。私は、データを受け取るスレッド、XmlPullParserを使用してデータを解析する別のもの、データがjson形式で送信され、送信されたことを考えると、その行はツリーから削除されます。しかし、dataItemIdを持つ行だけを解析したいのであれば、私は子ノードを持つツリー構造を持っていないので、どのように動作するべきか明確には分かりません。 あなたのご協力をよろしくお願い申し上げます。 ありがとう

+0

特定のタグのみを取得しようとしています。 「始まり」と「終わり」とはどういう意味ですか?あなたが解析を終了する必要があるときに何が表示されるか知っていますか?つまり、ファイルが終了したときにマークすることができますか? – themistoklik

+0

ストリーミング中は、マシンが稼動している限りデータを収集しています。だからマシンがオフでない限り、私はデータを受け取り、それを解析しています。私はこれを参照していました:parser = etree.XMLPullParser(events =( 'start'、 'end')) – Wafa

+0

あなたが望むタグになるようにstartイベントを試して、空の文字列に終わり、失敗しましたか?あなたはそれらの2つをイベントとして設定すればどうなりますか?また、SAXの解析について聞いたことがありますか? – themistoklik

答えて

1

ライブラリを使用した回答の代わりに、別の同様の方向を指摘してください。あなたは、単純なアプローチがthisポストにようになる2つの特定のタグのために釣りをしているので、あなただけのチェックはあなたがまたSAXをチェックし、同じロジックをたどることができ

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

でなければならないであろう。スピードを念頭に置いてこれを実行している場合は、それをプロファイルし、必要に応じて最適な実装をスピードとスペースで保ちます。

これも参照してくださいpost

関連する問題