在Python中使用XMLPullParser解析XML流

在Python中使用XMLPullParser解析XML流,python,xmlpullparser,Python,Xmlpullparser,这是我第一次在这里问问题,我是一个新手,所以如果我的问题听起来有些愚蠢,我很抱歉。 我正在处理来自机器的流式数据: 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

这是我第一次在这里问问题,我是一个新手,所以如果我的问题听起来有些愚蠢,我很抱歉。 我正在处理来自机器的流式数据:

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>'
了解速度非常重要,因为我们希望在AWS数据库上访问实时数据。 我不知道该如何以最佳方式解析。从我发现的情况来看,使用XmlPullParser是解析流数据而不阻塞的最佳方法。然而,我不知道“开始”和“结束”应该是什么。 我真的不知道应该如何在不丢失任何数据的情况下继续,并保证我正在解析所有内容。我想让一个线程接收数据,另一个线程使用XmlPullParser解析数据,一旦数据以json格式发送,该行就会从树中删除。但是,如果我只想解析具有dataItemId的行,那么由于我没有带子节点的树结构,所以我不清楚它应该如何工作。 非常感谢你的帮助。
谢谢你

我给你指出另一个类似的方向,而不是使用你想要的库来回答。由于您正在查找两个特定的标记,因此一种简单的方法与post中的方法类似,只需检查您的支票即可

if element.tag=="tag1" or element.tag=="tag2"
您也可以检查并遵循相同的逻辑。如果您在做这件事时考虑到了速度,请对其进行分析,并保持最适合您需要的实现速度和空间


另请参见此

您希望只拉某个标签。“开始”和“结束”是什么意思?您知道应该结束解析时会出现什么吗?ie你能标记你的文件何时结束吗?当我们在流媒体时,只要机器在运行,我们就在收集数据。因此,除非机器关闭,否则我将继续接收数据并对其进行解析。我指的是:parser=etree.XMLPullParser(events=('start','end'))您尝试将start-event作为您想要的标记,将end设置为空字符串,但失败了?如果将这两个设置为事件,会发生什么?您还听说过SAX解析吗?dataItemId不是标记,对吗?据我所知,标签是在<之后出现的。如果我错了,请纠正我。我将尝试按照您的建议执行,但是标记可以更改,因为服务器只有在有新数据时才发送数据。我确信的是应该有dataItemId。如何将其作为开始事件?作为您想要的标记,我的意思是,例如,如果您可以确保您想要的所有项目都位于该标记下。格式总是一样的,对吗?对于结束标记,我会选择一个始终显示在我想要的内容之后的标记。您还提到从树中删除。您是想将整个XML保存在内存中,还是只提取所需的数据?
if element.tag=="tag1" or element.tag=="tag2"