Python中使用expat解析XML数据

0 投票
2 回答
1631 浏览
提问于 2025-04-15 12:58

我正在尝试用 Python 的 expat 库解析一个 XML 文件。在我的 XML 文件中,有这样一行:

<Action>&lt;fail/&gt;</Action>

expat 能够识别开始和结束标签,但它把 & lt; 转换成了小于号(<),大于号(>)也是这样,所以解析出来的结果是这样的:

结果:

START 'Action'
DATA '<'
DATA 'fail/'
DATA '>'
END 'Action'

而我想要的结果是:

START 'Action'
DATA '&lt;fail/&gt;'
END 'Action'

我希望能得到我想要的结果,怎么才能让 expat 不出错呢?

2 个回答

1

SAX和StAX解析器可以随意地把字符串拆分成他们觉得方便的样子(不过StAX有一个叫做COALESCE的模式,可以强制它帮你把这些碎片拼起来)。

这样做的原因是,在某些情况下,软件可以以流的方式处理数据,而不需要担心重新拼接字符串碎片的开销。

通常,我会把文本累积到一个变量里,当我看到下一个开始元素(StartElement)或结束元素(EndElement)事件时,就会使用这些内容。到那时,我也会把累积的文本变量重置为空。

2

expat并没有搞错,&lt;只是字符<在XML中的编码方式。实际上,如果expat返回的是字面上的&lt;,那就违反了XML的规范,这算是个错误。话虽如此,你当然可以通过使用xml.sax.saxutils.escape来获取转义后的版本:

>>> from xml.sax.saxutils import escape
>>> escape("<fail/>")
'&lt;fail/&gt;'

expat解析器也可以根据自己的需要,将所有字符串数据分成任意大小的块,所以你需要自己把它们拼接起来。

撰写回答