Python中使用expat解析XML数据
我正在尝试用 Python 的 expat 库解析一个 XML 文件。在我的 XML 文件中,有这样一行:
<Action><fail/></Action>
expat 能够识别开始和结束标签,但它把 & lt; 转换成了小于号(<),大于号(>)也是这样,所以解析出来的结果是这样的:
结果:
START 'Action'
DATA '<'
DATA 'fail/'
DATA '>'
END 'Action'
而我想要的结果是:
START 'Action'
DATA '<fail/>'
END 'Action'
我希望能得到我想要的结果,怎么才能让 expat 不出错呢?
2 个回答
1
SAX和StAX解析器可以随意地把字符串拆分成他们觉得方便的样子(不过StAX有一个叫做COALESCE的模式,可以强制它帮你把这些碎片拼起来)。
这样做的原因是,在某些情况下,软件可以以流的方式处理数据,而不需要担心重新拼接字符串碎片的开销。
通常,我会把文本累积到一个变量里,当我看到下一个开始元素(StartElement)或结束元素(EndElement)事件时,就会使用这些内容。到那时,我也会把累积的文本变量重置为空。
2
expat并没有搞错,<
只是字符<
在XML中的编码方式。实际上,如果expat返回的是字面上的<
,那就违反了XML的规范,这算是个错误。话虽如此,你当然可以通过使用xml.sax.saxutils.escape
来获取转义后的版本:
>>> from xml.sax.saxutils import escape
>>> escape("<fail/>")
'<fail/>'
expat解析器也可以根据自己的需要,将所有字符串数据分成任意大小的块,所以你需要自己把它们拼接起来。