Py学习  »  Python

有没有一种简单的方法可以用python3替换带有特定十六进制值的类XML标记?

efox29 • 6 年前 • 1637 次点击  

我有一组数据,其结构类似于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)到十六进制版本(如b)。

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

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/36938
 
1637 次点击  
文章 [ 1 ]  |  最新文章 6 年前
Andrej Kesely
Reply   •   1 楼
Andrej Kesely    6 年前

html.HTMLParser doc

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