我正在开发一个数据包检索系统,该系统将根据标签系统[类似于HTML标签]获取数据包,并处理数据包的各种部分。 [仅基于文本的文件,没有二进制文件]。
数据包的每个部分都包含在两个相同的标记之间,这是一个示例数据包:
"<PACKET><HEAD><ID><ID><SEQ><SEQ><FILENAME><FILENAME><HEAD><DATA><DATA><PACKET>"
整个数据包都包含在<PACKET><PACKET>
标记中。
所有元数据都包含在<HEAD><HEAD>
标记中,数据包所属的文件名包含在<FILENAME><FILENAME>
标记中。
让我们假设,例如,接收单个数据包并将其存储在名为sTemp的临时字符串变量中。
例如,如何有效地检索一对标签的内容,例如<FILENAME><FILENAME>
标签的内容?
我希望有这样的功能,比如说getTagFILENAME(packetX),它会返回数据包的<FILENAME><FILENAME>
标签的文本字符串内容。
这可能是使用Python吗?
任何建议或意见表示赞赏。
答案 0 :(得分:1)
这样的东西?
import re
def getPacketContent ( code, packetName ):
match = re.search( '<' + packetName + '>(.*?)<' + packetName + '>', code )
return match.group( 1 ) if match else ''
# usage
code = "<PACKET><HEAD><ID><ID><SEQ><SEQ><FILENAME><FILENAME><HEAD><DATA><DATA><PACKET>"
print( getPacketContent( code, 'HEAD' ) )
print( getPacketContent( code, 'SEQ' ) )
答案 1 :(得分:1)
如果数据包格式有效地使用看起来像XML的语法(即,如果“结束标记”实际上包含斜杠),则可以使用xml.etree.ElementTree。 这个libray是Python标准库的一部分,从Py2.5开始。我觉得处理这类数据非常方便。它提供了许多方法来读取和修改这种树结构。由于XML语言的通用特性以及ElementTree库中内置的XML感知,数据包语法可以很容易地发展,例如支持重复元素,元素属性。
示例:
>>> import xml.etree.ElementTree
>>> myPacket = '<PACKET><HEAD><ID>123</ID><SEQ>1</SEQ><FILENAME>Test99.txt</FILE
NAME></HEAD><DATA>spam and cheese</DATA></PACKET>'
>>> xt = xml.etree.ElementTree.fromstring(myPacket)
>>> wrk_ele = xt.find('HEAD/FILENAME')
>>> wrk_ele.text
'Test99.txt'
>>>
答案 2 :(得分:1)
正如mjv所指出的那样,如果你只能使用XML,那么发明类似XML的格式并没有什么意义。
但是:如果您要将XML用于数据包格式,则需要真正使用XML。您应该使用XML库来创建您的数据包,而不仅仅是解析它们。否则,当您的一个字段值第一次包含XML标记字符时,您会感到悲伤。
当然,您可以编写自己的代码来进行必要的转义,过滤掉非法字符,保证格式良好等。对于这种简单的格式,这可能就是您需要做的。但是沿着这条路走下去是一种学习XML的方法,你可能不想学习它。
如果使用XML库来创建数据包是一个问题,那么最好定义一个自定义格式(我会定义一个看起来不像XML的东西,以防止人们获取想法)和使用pyparsing
为它构建解析器。