有没有一种简单的方法可以用Python3替换具有特定十六进制值的XML之类的标签?

时间:2019-07-12 22:03:03

标签: python xml python-3.x

我有一组数据结构类似于XML,但是数据不是ascii而是十六进制。

例如,数据可能是

EX. A
<body>
    <entry1> 0x12 </entry1>
    <entry2> 0x01 </entry2>
</body>

这可能会翻译成

EX. B
<0x01>
    <0x02> 0x12 <0xff>
    <0x03> 0x01 <0xff>
<0xff>

在上面的示例(示例B)中,<0x02> 0x12 <0xff>表示entry1的值为0x12。

我不是本机python程序员,所以我可能会做很长一段路(如果比较容易,我会喜欢的),但是我想做的是从人类可读的结构(例如A)中获取。到十六进制版本(EX B)。

我的想法是使用lxml编写类似文件的XML,并填充必要的相关区域,然后使用Python读取文件,并使用基于代码簿/字典的标签对字符串进行字符串替换来执行替换。

最后,我正在寻找一个看起来像

的字节数组
0x01 0x02 0x12 0xff 0x03 0x01 0xff 0xff

我的问题是:有没有更简单的方法?

1 个答案:

答案 0 :(得分:1)

自定义html.HTMLParserdoc)可能满足您的需求:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.__tags = {}
        self.__counter = 1

        self.__result = []

    def handle_starttag(self, tag, attrs):
        if not tag in self.__tags:
            self.__tags[tag] = '0x{:02x}'.format(self.__counter)
            self.__counter += 1
        self.__result.append(self.__tags[tag])

    def handle_endtag(self, tag):
        self.__result.append('0xff')

    def handle_data(self, data):
        self.__result.append(data.strip())

    @property
    def result(self):
        return [v for v in self.__result if v]

parser = MyHTMLParser()
parser.feed('''<body>
    <entry1> 0x12 </entry1>
    <entry2> 0x01 </entry2>
</body>''')

print(' '.join(parser.result))

打印:

0x01 0x02 0x12 0xff 0x03 0x01 0xff 0xff